GKE Containerd节点池从非安全Nexus镜像仓库认证拉取镜像的方法
可以实现,Containerd支持读取Docker格式的认证配置,但非安全镜像源的配置逻辑和Docker存在差异,以下是两种可行的落地方案:
方案1:节点级全局配置(集群内所有Pod无需额外配置即可拉取)
该方案会将认证和非安全源配置应用到节点池所有节点,适合整集群统一使用内部Nexus仓库的场景:
- 配置非安全镜像源规则
GKE节点的Containerd默认配置路径为/etc/containerd/config.toml,默认的证书配置目录为/etc/containerd/certs.d。
首先创建对应Nexus仓库地址的专属配置目录,假设你的Nexus地址为nexus.internal:8080,执行命令:mkdir -p /etc/containerd/certs.d/nexus.internal:8080
在该目录下创建hosts.toml文件,内容如下:server = "http://nexus.internal:8080" [host."http://nexus.internal:8080"] capabilities = ["pull", "resolve"] skip_verify = true - 配置仓库认证信息
Containerd兼容Docker生成的config.json认证格式,你可以直接将本地Docker生成的包含Nexus认证的~/.docker/config.json内容,写入到节点的/var/lib/kubelet/config.json路径即可,Containerd和kubelet会自动读取该文件的认证信息。 - 重启服务生效
执行命令重启相关服务:systemctl restart containerd && systemctl restart kubelet
验证配置是否生效可以执行:crictl pull nexus.internal:8080/你的镜像名:标签,能正常拉取即为配置成功。
注意:如果使用GKE自动托管的节点池,节点重建、升级后手动修改的配置会被重置,建议通过DaemonSet方式批量自动注入配置,避免配置丢失。
方案2:Workload级独立配置(仅授权指定Pod拉取镜像)
该方案不需要修改节点配置,和K8s中Docker运行时的用法完全一致,仅适合部分业务需要使用该Nexus仓库的场景:
- 第一步先创建镜像拉取Secret,直接执行以下命令即可:
kubectl create secret docker-registry nexus-pull-secret --docker-server=nexus.internal:8080 --docker-username=Nexus登录账号 --docker-password=Nexus登录密码 --docker-email=test@example.com
该命令底层就是生成Docker格式的认证配置并封装为K8s Secret,和你在Docker侧生成config.json的逻辑完全一致。 - 第二步在业务Pod/工作负载的配置中引用该Secret即可,示例配置如下:
apiVersion: v1 kind: Pod metadata: name: test-demo spec: containers: - name: app image: nexus.internal:8080/biz/app:v1.0 imagePullSecrets: - name: nexus-pull-secret
注意:非安全仓库的skip_verify配置仍然需要提前在节点侧配置,否则即使配置了Secret,也会因为HTTP仓库的证书校验失败无法拉取镜像。
内容的提问来源于stack exchange,提问作者LahiruSenevirathne
相关产品推荐
相关产品推荐

