Containerd版K8s集群无法从自签名私有仓库拉取镜像问题
问题解决:Containerd版K8s集群拉取自签名证书私有镜像失败
问题重现
配置2主2节点的Containerd版K8s集群,搭建带自签名证书的本地Docker私有镜像仓库,部署YAML文件如下:
apiVersion: apps/v1 kind: Deployment metadata: name: gowebapp-mysql labels: app: gowebapp-mysql tier: backend spec: replicas: 1 strategy: type: Recreate selector: matchLabels: app: gowebapp-mysql tier: backend template: metadata: labels: app: gowebapp-mysql tier: backend spec: containers: - name: gowebapp-mysql env: - name: MYSQL_ROOT_PASSWORD value: mypassword image: dhub.xxx.com.bd:443/gowebapp-mysql:v1 ports: - containerPort: 3306
应用后Pod出现ImagePullBackOff状态,执行kubectl get pods结果:
samrat@k8smaster01:~/k8s/gowebapp/gowebapp-mysql$ kubectl get pods NAME READY STATUS RESTARTS AGE gowebapp-mysql-78fc9df568-4z6p9 0/1 ImagePullBackOff 0 12s
查看Pod描述显示错误:x509: certificate signed by unknown authority。手动通过docker pull和ctr image pull可拉取镜像,但K8s部署时失败。
解决方案
1. 配置Containerd专属证书信任目录
K8s使用Containerd作为容器运行时,依赖Containerd自身的证书配置,而非Docker的配置目录。需在所有节点执行:
- 创建私有仓库对应的证书目录:
mkdir -p /etc/containerd/certs.d/dhub.xxx.com.bd:443 - 将自签名证书复制到该目录,并重命名为
ca.crt(Containerd默认读取此文件名):cp /path/to/your/self-signed-cert.crt /etc/containerd/certs.d/dhub.xxx.com.bd:443/ca.crt
2. (可选)通过Containerd配置文件指定证书
若上述方式不生效,修改Containerd主配置文件/etc/containerd/config.toml,添加私有仓库信任配置:
[plugins."io.containerd.grpc.v1.cri".registry] [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."dhub.xxx.com.bd:443".tls] ca_file = "/etc/ssl/certs/your-self-signed-cert.crt"
3. 重启Containerd服务
配置完成后,重启所有节点的Containerd服务使配置生效:
systemctl restart containerd
4. 验证配置有效性
使用K8s依赖的crictl工具测试镜像拉取(而非ctr或docker):
crictl pull dhub.xxx.com.bd:443/gowebapp-mysql:v1
若拉取成功,重新应用Deployment即可:
kubectl apply -f your-deployment.yaml
5. 额外排查:配置ImagePullSecret(若需认证)
如果私有仓库需要用户名密码认证,需创建K8s镜像拉取密钥并关联到Deployment:
- 创建密钥:
kubectl create secret generic regcred \ --from-file=.dockerconfigjson=/root/.docker/config.json \ --type=kubernetes.io/dockerconfigjson - 修改Deployment的
spec.template.spec部分,添加密钥引用:spec: imagePullSecrets: - name: regcred containers: # 原有容器配置...
内容的提问来源于stack exchange,提问作者Samrat
相关产品推荐
相关产品推荐

