containerd拉取私有仓库镜像报错x509: certificate signed by unknown authority

当使用crictl尝试从使用HTTPS的私有Harbor仓库拉取镜像时,由于默认缺少证书,操作会失败。解决方法包括下载证书到指定目录,修改containerd配置文件添加endpoint、ca_file、用户名和密码,然后重启containerd服务。完成这些步骤后,可以成功拉取镜像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

报错

在这里插入图片描述

原因分析

私有仓库使用的是harbor,由于harbor连接默认需要https认证,crictl拉取镜像默认不带证书访问,所以会报错

解决

#下载证书并放到指定目录,证书如何下载看下图
mkdir /etc/containerd/core.harbor.domain
cp ca.crt  /etc/containerd/core.harbor.domain/

在这里插入图片描述
修改containerd配置文件

vim /etc/containerd/config.toml
#配置endpoint连接地址
[plugins."io.containerd.grpc.v1.cri".registry.mirrors]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors."core.harbor.domain"]
    endpoint = ["https://core.harbor.domain"]

#配置ca文件路径和用户名密码
[plugins."io.containerd.grpc.v1.cri".registry.configs]
  [plugins."io.containerd.grpc.v1.cri".registry.configs."core.harbor.domain".tls]
    ca_file = "/etc/containerd/core.harbor.domain/ca.crt"
  [plugins."io.containerd.grpc.v1.cri".registry.configs."core.harbor.domain".auth]
    username = "admin"
    password = "Harbor12345"

在这里插入图片描述
重启containerd

#重新加载配置
systemctl daemon-reload
#重启containerd
systemctl restart containerd

拉取镜像

crictl pull core.harbor.domain/library/nginx:v1.0

在这里插入图片描述
在这里插入图片描述

拉取镜像成功。

<think>好的,我现在需要解决用户在Kubernetes中使用自定义镜像仓库镜像时遇到的TLS证书验证失败问题,具体错误是“tls: failed to verify certificate: x509: certificate signed by unknown authority”,使用的Kubernetes版本是v1.28.2。让我先理清这个问题的可能原因和解决方法。 首先,用户提到的是自定义镜像仓库,所以问题很可能与镜像仓库的TLS证书有关。根据引用[1]和[2],证书不被信任或配置错误会导致这类问题。Kubernetes组件(如kubelet)在镜像时,需要信任镜像仓库的CA证书,否则会验证失败。 接下来,我需要考虑如何让Kubernetes节点信任这个自定义仓库的证书。可能的步骤包括将CA证书添加到节点的信任存储中,或者配置Docker/containerd使用该CA。另外,如果是私有仓库,可能需要配置镜像密钥,但这里的问题更可能是证书信任的问题,而不是认证问题。 对于kubeadm config images pull命令,这个命令用于预先控制平面镜像,所以需要确保执行该命令的节点能够正确访问自定义仓库并信任其证书。如果节点没有正确配置信任,就会报错。 可能的解决方案步骤: 1. 将自定义镜像仓库的CA证书添加到每个Kubernetes节点的系统信任证书中,比如在Ubuntu上复制到/usr/local/share/ca-certificates/并运行update-ca-certificates。 2. 配置Docker或containerd信任该CA证书。例如,在Docker中,将CA证书放入/etc/docker/certs.d/<仓库域名>/目录下,并重启Docker服务。 3. 检查kubelet的配置,确保它使用正确的证书。有时候,kubelet可能需要单独配置证书信任链。 4. 如果使用私有仓库,可能需要创建Secret并在Pod定义中引用,但证书信任问题可能需要先解决。 5. 确保自定义仓库的证书是有效的,包括域名匹配和未过期。 另外,根据Kubernetes版本v1.28.2,可能需要检查是否有已知的证书处理变更,但暂时没有相关信息。需要用户确认证书是否正确部署到所有节点,并确保服务重启以应用更改。 用户提到的错误信息与引用[1]中的情况类似,都是证书不被信任,所以解决方案应该围绕添加CA证书到信任链展开。可能需要分步骤指导用户如何添加证书到系统、Docker/containerd,并验证配置是否正确。 最后,生成相关问题,可能涉及其他证书问题、私有仓库配置或kubeadm的其他问题。</think>### 解决方案:Kubernetes自定义镜像仓库TLS证书验证失败问题 #### 问题原因分析 此错误表明Kubernetes节点不信任自定义镜像仓库的TLS证书。主要原因包括: 1. 自定义镜像仓库的证书是自签名的,或未被系统信任的CA签发[^2]; 2. 节点未正确配置信任该证书的CA; 3. Docker/containerd未加载更新后的证书链。 --- ### 解决步骤 #### 1. 将CA证书添加到系统信任链 **操作流程:** - **步骤1**:获镜像仓库的CA证书文件(通常为`.crt`或`.pem`格式) - **步骤2**:将证书复制到系统证书目录: ```bash # Ubuntu/Debian sudo cp custom-repo-ca.crt /usr/local/share/ca-certificates/ sudo update-ca-certificates # CentOS/RHEL sudo cp custom-repo-ca.crt /etc/pki/ca-trust/source/anchors/ sudo update-ca-trust ``` - **步骤3**:重启容器运行时服务: ```bash # Docker sudo systemctl restart docker # containerd sudo systemctl restart containerd ``` #### 2. 配置Docker/containerd信任证书 **Docker专用配置:** - 创建证书目录并复制证书: ```bash # 格式:/etc/docker/certs.d/<仓库域名>:<端口>/ca.crt sudo mkdir -p /etc/docker/certs.d/custom.repo.com:5000 sudo cp custom-repo-ca.crt /etc/docker/certs.d/custom.repo.com:5000/ca.crt ``` - 重启Docker服务: ```bash sudo systemctl restart docker ``` **containerd配置:** - 修改`/etc/containerd/config.toml`,添加证书路径: ```toml [plugins."io.containerd.grpc.v1.cri".registry.configs] [plugins."io.containerd.grpc.v1.cri".registry.configs."custom.repo.com:5000".tls] ca_file = "/path/to/custom-repo-ca.crt" ``` - 重启containerd: ```bash sudo systemctl restart containerd ``` #### 3. 验证证书加载 - 使用`curl`测试证书是否被信任: ```bash curl https://custom.repo.com:5000/v2/_catalog ``` 若返回镜像列表,则证书信任成功。 #### 4. 针对kubeadm的特殊配置 如果使用`kubeadm config images pull`命令: - 确保执行该命令的节点已完成上述证书配置; - 若仍失败,尝试手动指定镜像仓库地址: ```bash kubeadm config images pull --image-repository=custom.repo.com:5000/k8s ``` --- ### 补充说明 - **证书有效性检查**:使用`openssl x509 -in custom-repo-ca.crt -text -noout`确认证书有效期和域名匹配; - **集群节点同步**:所有节点(包括控制平面和工作节点)均需完成证书配置; - **Kubelet配置**:若kubelet独立配置证书,需检查`/var/lib/kubelet/config.yaml`中的`serverTLSBootstrap`参数[^1]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

平凡似水的人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值