Skip to content

拉取镜像身份认证失败

文档

  1. https://github.com/containerd/containerd/blob/main/docs/hosts.md#host-fields-in-the-toml-table-format
  2. https://kubernetes.xuxiaowei.com.cn/zh-cn/docs/tasks/configure-pod-container/pull-image-private-registry/

问题描述

  1. Kubernetes 拉取的镜像 仓库,需要认证后才能访问(无法匿名访问)
    shell
    pull 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 端口,但是他们属于两种不同的情况,需要两种不同的配置
    1. nexus.xuxiaowei.com.cn/abc:0.0.2-SNAPSHOT-38
    2. nexus.xuxiaowei.com.cn:443/abc:0.0.2-SNAPSHOT-38
  1. 查看 containerd 配置文件 /etc/containerd/config.toml 中的 config_path

    shell
    cat /etc/containerd/config.toml | grep config_path
  2. 创建 /etc/containerd/certs.d 文件夹

    shell
    sudo mkdir -p /etc/containerd/certs.d
  3. config_path 配置为 /etc/containerd/certs.d,并重启 containerd

    shell
    systemctl restart containerd
  4. 创建 域名 域名 身份验证 的配置文件

    Docker 镜像仓库 host
    Docker 镜像仓库 port
    Docker 镜像仓库 username
    Docker 镜像仓库 password
    shell

解决方案 2:使用 Pod 配置身份认证

提示

  • 如果有端口,下列配置中,需要携带端口,如:nexus.xuxiaowei.com.cn:48501
  • 注意:在使用镜像时,下列镜像虽然使用的都是 443 端口,但是他们属于两种不同的情况,需要两种不同的配置
    1. nexus.xuxiaowei.com.cn/abc:0.0.2-SNAPSHOT-38
    2. 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