执行kubectl apply出现ImagePullBackOff错误,工作节点拉取镜像遇未知CA证书签名问题及AKS安装疑问
首先得戳破一个关键误区:你在操作机器(或控制节点)的/etc/ssl/certs/ca-certificates.crt里添加CA证书根本没用——因为实际执行镜像拉取操作的是工作节点上的容器运行时(AKS默认是containerd),kubectl只是把部署请求提交给集群,它本身不参与镜像拉取流程。
问题根源拆解
你的错误日志已经把原因说得很明确:
Warning Failed 4s (x2 over 17s) kubelet Failed to pull image "nginx:1.14.2": rpc error: code = Unknown desc = failed to pull and unpack image "docker.io/library/nginx:1.14.2": failed to resolve reference "docker.io/library/nginx:1.14.2": failed to do request: Head "https://registry-1.docker.io/v2/library/nginx/manifests/1.14.2": x509: certificate signed by unknown authority
工作节点上的containerd在请求docker.io镜像仓库时,无法验证对方的证书(大概率是你的环境通过代理或内部CA拦截了HTTPS请求),所以必须让containerd信任你的自定义根CA证书。
具体解决步骤
针对AKS默认的containerd运行时,按以下步骤操作:
登录到每个工作节点
可以通过az aks ssh命令(Azure AKS场景)或集群允许的其他方式,登录到集群的所有工作节点。为containerd配置自定义CA信任
- 创建docker.io的证书配置目录(不存在则新建):
sudo mkdir -p /etc/containerd/certs.d/docker.io/ - 将你的根CA证书复制到该目录,命名为
ca.crt:sudo cp /path/to/your/root-ca.crt /etc/containerd/certs.d/docker.io/ca.crt - (可选)如果需要让系统全局信任该CA,也同步更新系统证书:
sudo cp /path/to/your/root-ca.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates
- 创建docker.io的证书配置目录(不存在则新建):
重启containerd服务使配置生效
sudo systemctl restart containerd验证配置是否生效
在工作节点上用crictl测试拉取镜像:crictl pull nginx:1.14.2如果能成功拉取,回到控制节点重新执行
kubectl apply命令即可正常部署。
关于AKS安装未失败的疑惑
这完全合理:AKS安装过程中拉取的是**微软托管的MCR镜像仓库(mcr.microsoft.com)**里的集群组件(比如kubelet、kube-proxy等),这些仓库的证书是公共信任机构签发的,不需要自定义CA就能通过验证。而你现在拉取的是docker.io的公共镜像,你的环境可能对外部HTTPS请求做了拦截,所以才需要额外配置自定义CA。
内容的提问来源于stack exchange,提问作者user211245

