K3s集群中Let's Encrypt证书私有Docker镜像拉取失败排查
问题解决步骤
1. 修正容器运行时的证书信任配置
K3s默认使用containerd作为容器运行时,而非Docker。你之前将根证书添加到Docker的信任库无法解决问题,需要为containerd配置信任CA:
- 在每个集群节点上创建containerd的证书配置目录:
mkdir -p /var/lib/rancher/k3s/agent/etc/containerd/certs.d/192.168.42.50:5000 - 将ISRG Root X1根证书内容写入该目录下的
ca.crt文件:# 假设你已将根证书保存为isrgrootx1.pem,执行以下命令 cp isrgrootx1.pem /var/lib/rancher/k3s/agent/etc/containerd/certs.d/192.168.42.50:5000/ca.crt - 重启K3s服务(单节点集群重启k3s,多节点重启k3s-agent):
systemctl restart k3s # 多节点agent节点执行 systemctl restart k3s-agent
2. 验证私有仓库的证书链完整性
Let's Encrypt的证书需要完整的证书链(叶子证书 + 中间证书,比如R3)才能被正确信任。检查你的私有仓库是否配置了全链证书:
- 在节点上执行以下命令查看仓库返回的证书链:
openssl s_client -connect 192.168.42.50:5000 -showcerts - 确认输出中包含ISRG Root X1根证书和R3中间证书,若缺失中间证书,需要更新私有仓库的证书配置,使用cert-manager生成的Secret中
tls.crt文件(该文件默认包含完整证书链)。
3. 测试镜像拉取
在节点上直接使用containerd的命令测试拉取:
ctr images pull 192.168.42.50:5000/dev-backend:latest
若能成功拉取,说明证书信任配置生效,再重新部署你的应用即可。
Kubernetes默认信任的CA说明
Kubernetes本身不直接管理证书信任逻辑,镜像拉取的证书验证由容器运行时(如containerd、Docker)负责:
- 容器运行时默认信任节点系统的根CA库(通常位于
/etc/ssl/certs/或/usr/local/share/ca-certificates/),多数Linux发行版已预装ISRG Root X1等公共CA根证书。 - 对于containerd,除了系统根CA,还可以通过
certs.d目录为特定仓库添加自定义信任CA,这是针对私有仓库的精准配置方式。
额外排查点
- 检查节点系统根CA是否包含ISRG Root X1:执行
openssl verify -CApath /etc/ssl/certs/ <仓库证书文件>,确认验证通过。 - 确认你的imagePullSecret配置正确(虽然当前报错是证书问题,但可通过
kubectl describe secret docker-registry-config -n dev验证凭证有效性)。
内容的提问来源于stack exchange,提问作者neogeek23
相关产品推荐
相关产品推荐

