You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 22:54:58