自签名证书Docker私有仓库配置问题及K3S/K8S镜像拉取疑问
问题1:为何添加自签名证书后仍需配置
insecure-registries 你遇到的问题大概率是以下几个原因导致的:
- 端口不匹配:你的Registry实际使用端口是
5045,但/etc/docker/daemon.json里配置的insecure-registries是registry.local.doc:5000,端口不一致导致Docker仍将registry.local.doc:5045视为未受信任的仓库。 - 证书未被Docker正确信任:自签名证书仅生成还不够,需要将证书放置到Docker的专属信任目录:
- 创建目录:
sudo mkdir -p /etc/docker/certs.d/registry.local.doc:5045 - 复制证书到该目录:
sudo cp ./certs/tls.crt /etc/docker/certs.d/registry.local.doc:5045/ca.crt - 重启Docker守护进程:
sudo systemctl restart docker
- 创建目录:
- 系统CA未被Docker识别:Docker默认不会自动读取系统级CA证书,即使你更新了
update-ca-certificates,也需要手动将证书放到上述Docker专属目录才能让Docker信任该Registry。
完成上述步骤后,你可以移除daemon.json中的insecure-registries配置,重启Docker后即可正常推送/拉取镜像。
问题2:K3S拉取镜像为何需重启集群,生产环境无重启方案及K8S对应操作
为何需要重启K3S
K3S是单进程架构,kubelet组件是K3S进程的一部分。你更新系统CA证书并重启containerd后,K3S的kubelet进程可能仍缓存了旧的证书信任状态或镜像拉取配置,必须重启K3S才能让kubelet重新加载新的CA证书和containerd配置。
生产环境无需重启集群的解决方案
针对K3S:
- 仅重启节点的K3S进程:无需重启整个集群,只需在每个节点滚动执行:
逐个节点操作可避免业务中断。sudo systemctl restart k3s-agent # 工作节点执行 sudo systemctl restart k3s # 控制节点执行 - 更新containerd信任配置并重载:
- 将自签名证书复制到系统CA目录:
sudo cp ./certs/tls.crt /etc/ssl/certs/ - 更新系统CA:
sudo update-ca-certificates - 向containerd发送重载信号:
sudo kill -SIGHUP $(pidof containerd) - 删除现有Pod(Deployment会自动重建),新Pod拉取镜像时会使用更新后的CA证书。
- 将自签名证书复制到系统CA目录:
针对标准K8S集群:
- 滚动重启节点的containerd和kubelet:
在每个节点执行以下命令,逐个节点操作避免业务中断:sudo cp ./certs/tls.crt /etc/ssl/certs/ sudo update-ca-certificates sudo systemctl reload containerd sudo systemctl restart kubelet - Pod级CA挂载(临时场景适用):
无需修改节点配置,给需要拉取该Registry镜像的Pod挂载CA证书:
先创建包含自签名证书的ConfigMap:
再修改Deployment配置:kubectl create configmap registry-ca-configmap --from-file=tls.crt=./certs/tls.crt
这种方式适合多租户或临时测试场景,但每个相关Pod都需要配置。apiVersion: apps/v1 kind: Deployment metadata: name: registry-test labels: app: registry-test spec: replicas: 1 selector: matchLabels: app: registry-test template: metadata: labels: app: registry-test spec: containers: - name: registry-test image: registry.local.doc:5045/hello-world volumeMounts: - name: registry-ca mountPath: /etc/ssl/certs/registry.local.doc.crt subPath: tls.crt readOnly: true volumes: - name: registry-ca configMap: name: registry-ca-configmap
内容的提问来源于stack exchange,提问作者e7lT2P
相关产品推荐
相关产品推荐

