拉取镜像身份认证失败
文档
- https://github.com/containerd/containerd/blob/main/docs/hosts.md#host-fields-in-the-toml-table-format
- https://kubernetes.xuxiaowei.com.cn/zh-cn/docs/tasks/configure-pod-container/pull-image-private-registry/
问题描述
Kubernetes
拉取的镜像
仓库,需要认证后才能访问(无法匿名访问)shellpull access denied, repository does not exist or may require authorization: authorization failed: no basic auth credentials
shell[root@anolis-7-7 ~]# kubectl describe pod test ...... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 2s default-scheduler Successfully assigned default/nginx to k8s-1 Normal Pulling 1s kubelet Pulling image "nexus.xuxiaowei.com.cn:48501/xuxiaowei-cloud/spring-cloud-xuxiaowei/spring-cloud-xuxiaowei-gateway:0.0.2-SNAPSHOT-38" Warning Failed 1s kubelet Failed to pull image "nexus.xuxiaowei.com.cn:48501/xuxiaowei-cloud/spring-cloud-xuxiaowei/spring-cloud-xuxiaowei-gateway:0.0.2-SNAPSHOT-38": failed to pull and unpack image "nexus.xuxiaowei.com.cn:48501/xuxiaowei-cloud/spring-cloud-xuxiaowei/spring-cloud-xuxiaowei-gateway:0.0.2-SNAPSHOT-38": failed to resolve reference "nexus.xuxiaowei.com.cn:48501/xuxiaowei-cloud/spring-cloud-xuxiaowei/spring-cloud-xuxiaowei-gateway:0.0.2-SNAPSHOT-38": pull access denied, repository does not exist or may require authorization: authorization failed: no basic auth credentials Warning Failed 1s kubelet Error: ErrImagePull Normal BackOff 0s (x2 over 1s) kubelet Back-off pulling image "nexus.xuxiaowei.com.cn:48501/xuxiaowei-cloud/spring-cloud-xuxiaowei/spring-cloud-xuxiaowei-gateway:0.0.2-SNAPSHOT-38" Warning Failed 0s (x2 over 1s) kubelet Error: ImagePullBackOff [root@anolis-7-7 ~]#
解决方案 1:使用 containerd 配置身份认证
提示
- 如果有端口,下列配置中,需要携带端口,如:
nexus.xuxiaowei.com.cn:48501
- 注意:在使用镜像时,下列镜像虽然使用的都是
443
端口,但是他们属于两种不同的情况,需要两种不同的配置nexus.xuxiaowei.com.cn/abc:0.0.2-SNAPSHOT-38
nexus.xuxiaowei.com.cn:443/abc:0.0.2-SNAPSHOT-38
查看
containerd
配置文件/etc/containerd/config.toml
中的config_path
shellcat /etc/containerd/config.toml | grep config_path
创建
/etc/containerd/certs.d
文件夹shellsudo mkdir -p /etc/containerd/certs.d
将
config_path
配置为/etc/containerd/certs.d
,并重启containerd
shellsystemctl restart containerd
创建
域名
域名身份验证
的配置文件shell
解决方案 2:使用 Pod 配置身份认证
提示
- 如果有端口,下列配置中,需要携带端口,如:
nexus.xuxiaowei.com.cn:48501
- 注意:在使用镜像时,下列镜像虽然使用的都是
443
端口,但是他们属于两种不同的情况,需要两种不同的配置nexus.xuxiaowei.com.cn/abc:0.0.2-SNAPSHOT-38
nexus.xuxiaowei.com.cn:443/abc:0.0.2-SNAPSHOT-38
使用 ~/.docker/config.json
凭证创建 Secret
登录 Docker 镜像仓库
shell
docker login
shell
docker login xuxiaowei.io
使用 用户配置文件 创建 Secret
shell
# .dockerconfigjson:必须填写 ~/.docker/config.json 文件绝对路径(docker 登录后自动创建)
# regcred:Secret 名称,可自定义
# -n default:指定命名空间,默认为 default,default 命名空间可忽略
# 获取当前用户 docker 配置文件的绝对路径
docker_config_path=~/.docker/config.json
echo $docker_config_path
kubectl -n default create secret generic regcred \
--from-file=.dockerconfigjson=$docker_config_path \
--type=kubernetes.io/dockerconfigjson
使用 用户名、密码 直接创建 Secret
shell
# regcred:Secret 名称,可自定义
# -n default:指定命名空间,默认为 default,default 命名空间可忽略
# --docker-email:可忽略
kubectl -n default create secret docker-registry regcred \
--docker-server=<你的镜像仓库服务器> \
--docker-username=<你的用户名> \
--docker-password=<你的密码> \
--docker-email=<你的邮箱地址>
使用 Secret 拉取镜像
yaml
apiVersion: v1
kind: Pod
metadata:
name: test
spec:
containers:
- name: gateway
image: nexus.xuxiaowei.com.cn:48501/xuxiaowei-cloud/spring-cloud-xuxiaowei/spring-cloud-xuxiaowei-gateway:0.0.2-SNAPSHOT-38
ports:
- containerPort: 80
imagePullSecrets:
# Secret 名称
# 支持配置多个 Secret
- name: regcred