避坑指南:K8s拉取Harbor镜像时的x509证书错误解决方案

张开发
2026/5/24 4:12:48 15 分钟阅读
避坑指南:K8s拉取Harbor镜像时的x509证书错误解决方案
避坑指南K8s拉取Harbor镜像时的x509证书错误解决方案当你在Kubernetes集群中尝试从私有Harbor仓库拉取镜像时突然遇到x509: certificate signed by unknown authority错误那种感觉就像在高速公路上突然爆胎——明明目的地就在眼前却被一个看似简单的问题卡住。这种证书验证错误在自签名证书环境中尤为常见但解决起来并不复杂只要掌握正确的方法。1. 理解证书验证错误的本质在Kubernetes环境中证书验证发生在多个层面。当你在节点上直接使用nerdctl pull或crictl pull命令时能够成功但通过Kubernetes API创建Pod时却失败这通常意味着容器运行时(containerd或CRI-O)没有正确配置信任你的Harbor仓库证书。关键概念区分节点级证书信任通过操作系统CA证书存储实现容器运行时级证书信任需要单独配置Pod级证书信任通过Pod定义中的imagePullSecrets实现提示自签名证书问题通常出现在开发环境或企业内部部署中生产环境建议使用受信任的CA签发证书。2. Containerd环境下的证书配置对于使用containerd作为容器运行时的集群以下是详细的解决方案2.1 证书目录结构准备containerd期望特定的目录结构来存放私有仓库的证书# 创建Harbor仓库专用的证书目录 sudo mkdir -p /etc/containerd/certs.d/your-harbor-domain/将你的Harbor CA证书复制到该目录并重命名sudo cp harbor-ca.crt /etc/containerd/certs.d/your-harbor-domain/ca.crt2.2 修改containerd配置文件编辑containerd的主配置文件通常位于/etc/containerd/config.toml添加以下内容[plugins.io.containerd.grpc.v1.cri.registry] [plugins.io.containerd.grpc.v1.cri.registry.mirrors] [plugins.io.containerd.grpc.v1.cri.registry.mirrors.your-harbor-domain] endpoint [https://your-harbor-domain] [plugins.io.containerd.grpc.v1.cri.registry.configs.your-harbor-domain.tls] ca_file /etc/containerd/certs.d/your-harbor-domain/ca.crt配置参数说明参数说明必填endpoint仓库访问地址是ca_fileCA证书路径是insecure_skip_verify跳过验证(不推荐)否2.3 应用配置变更完成配置后重启containerd服务使更改生效sudo systemctl restart containerd验证服务状态sudo systemctl status containerd3. 多节点集群的特殊考量在生产环境中Kubernetes集群通常由多个工作节点组成每个节点都需要相同的证书配置。以下是几种管理多节点配置的方法3.1 手动同步方案在主节点上完成上述配置将配置文件和证书打包tar czvf containerd-certs.tar.gz /etc/containerd/certs.d/使用scp将文件复制到其他节点for node in node1 node2 node3; do scp containerd-certs.tar.gz $node:/tmp/ ssh $node sudo tar xzvf /tmp/containerd-certs.tar.gz -C / done3.2 使用配置管理工具对于大型集群推荐使用Ansible等配置管理工具自动化部署- name: Configure containerd certificates hosts: k8s-workers tasks: - name: Create certs directory file: path: /etc/containerd/certs.d/{{ harbor_domain }} state: directory mode: 0755 - name: Copy CA certificate copy: src: files/{{ harbor_domain }}.crt dest: /etc/containerd/certs.d/{{ harbor_domain }}/ca.crt mode: 0644 - name: Update containerd config blockinfile: path: /etc/containerd/config.toml marker: # {mark} HARBOR CONFIG block: | [plugins.io.containerd.grpc.v1.cri.registry] [plugins.io.containerd.grpc.v1.cri.registry.mirrors] [plugins.io.containerd.grpc.v1.cri.registry.mirrors.{{ harbor_domain }}] endpoint [https://{{ harbor_domain }}] [plugins.io.containerd.grpc.v1.cri.registry.configs.{{ harbor_domain }}.tls] ca_file /etc/containerd/certs.d/{{ harbor_domain }}/ca.crt - name: Restart containerd service: name: containerd state: restarted4. 验证与故障排查完成配置后建议通过以下步骤验证解决方案是否生效4.1 直接测试镜像拉取sudo crictl pull your-harbor-domain/library/nginx:latest4.2 部署测试Pod创建一个简单的Pod定义文件test-pod.yamlapiVersion: v1 kind: Pod metadata: name: test-pod spec: containers: - name: nginx image: your-harbor-domain/library/nginx:latest应用并观察kubectl apply -f test-pod.yaml kubectl get pods -w4.3 常见问题排查如果仍然遇到问题可以检查以下方面证书路径是否正确sudo ls -l /etc/containerd/certs.d/your-harbor-domain/containerd日志journalctl -u containerd -fPod事件kubectl describe pod test-pod5. 长期维护策略证书配置不是一劳永逸的工作需要考虑以下长期维护因素5.1 证书更新流程当Harbor证书更新时需要将新证书分发到所有节点替换旧的CA证书文件重启containerd服务5.2 自动化监控考虑设置监控检查证书有效期openssl x509 -in /etc/containerd/certs.d/your-harbor-domain/ca.crt -noout -dates5.3 文档记录维护一个集群证书配置矩阵组件证书位置配置方式负责人containerd/etc/containerd/certs.d/config.toml运维团队kubelet/etc/kubernetes/pki/kubelet配置运维团队应用Pod镜像仓库secretimagePullSecrets开发团队

更多文章