registry.k3s.io是只读镜像源,不支持认证;“unauthorized”错误主因是误配auth或全局mirror导致containerd错误携带token,应清理无关鉴权配置、显式指定上游registry、避免为它设置auth或非必要mirror。

K3s 内置 registry(即 registry.k3s.io)默认是只读镜像源,不提供用户认证服务,也不接受推送。当你看到 unauthorized: authentication required 错误时,通常不是因为 registry 本身需要登录,而是客户端(比如 crictl 或容器运行时)误以为要向它做身份验证——常见于配置了错误的镜像仓库别名、或本地镜像拉取配置中混入了需鉴权的私有仓库设置。
检查是否误配了 registry 镜像(mirror)规则
K3s 支持通过 /var/lib/rancher/k3s/agent/etc/containerd/config.toml.tmpl 或 --private-registry 配置镜像加速或重定向。如果错误地把 registry.k3s.io 写进了需认证的私有 registry 列表(例如在 ~/.docker/config.json 或 containerd 的 hosts.toml 中配了 auth),containerd 就会在拉取时主动携带无效 token,触发该报错。
- 检查
/etc/rancher/k3s/registries.yaml(若存在),确认没有对registry.k3s.io配置auth或headers - 检查
/var/lib/rancher/k3s/agent/etc/containerd/config.toml中的[plugins."io.containerd.grpc.v1.cri".registry]段,确保没有为registry.k3s.io设置auth块 - 临时移除
~/.docker/config.json(如果节点上装了 Docker 且该文件含 registry 凭据),避免 crictl 误读
确认拉取的是官方 K3s 镜像而非私有仓库同名镜像
registry.k3s.io 仅托管 K3s 自身组件镜像(如 registry.k3s.io/k3s:v1.29.4-k3s1),不托管 nginx、redis 等通用镜像。如果你执行 crictl pull nginx:alpine 并报此错,说明 containerd 实际尝试从 registry.k3s.io 拉取(因配置了 mirror),但该 registry 不提供该镜像,且返回了带 auth header 的 401 ——这是它的默认行为(非 bug,是保护机制)。
- 用
crictl pull docker.io/library/nginx:alpine显式指定上游 registry - 或修改
registries.yaml,只为registry.k3s.io设置 mirror,其他域名走默认(不设全局 mirror) - 典型安全写法:
mirrors:
,不要写
"registry.k3s.io":
endpoint:
- "https://registry.k3s.io""docker.io"或"*"的 mirror
排查是否启用了错误的 containerd auth 插件或凭据助手
某些环境(如 CI 节点或预装了 nerdctl 的机器)可能启用了 containerd 的 auth 插件(如 nerdctl 的 --insecure-registry 或凭据助手),导致所有拉取请求都附带空或过期 auth 头。
- 运行
crictl info | grep -A5 registry查看当前 registry 配置摘要 - 临时停用凭据助手:删除
/etc/containerd/certs.d/下与registry.k3s.io相关的目录 - 重启 containerd:
sudo systemctl restart k3s(K3s 会一并重启其内嵌 containerd)
验证是否真连到了 registry.k3s.io
直接 curl 测试 registry 是否可访问且响应合理:
-
curl -I https://registry.k3s.io/v2/应返回200 OK或401 Unauthorized(后者正常,表示服务可达但需鉴权——而它本就不支持鉴权,所以实际是“无条件拒绝”) -
curl -I https://registry.k3s.io/v2/library/nginx/manifests/latest应返回404 Not Found,证明它确实不托管该镜像 - 若返回
403 Forbidden或超时,则可能是网络或防火墙问题,而非 auth 错误
核心原则:registry.k3s.io 是只读 CDN,不支持登录,也不代理第三方镜像。报 “unauthorized” 多数是配置把不该鉴权的地址当作了私有仓,或拉取路径被错误重写。清理无关 auth 配置、显式指定上游 registry、避免全局 mirror,基本就能解决。










