Kubernetes集群私有Registry Pod自签名TLS证书配置问题求助
问题根因
你生成自签名证书时未配置使用者备用名称(SAN, Subject Alternative Name),默认生成的x509证书不包含k8s-master主机名的校验标识,导致Docker客户端做TLS握手时无法匹配证书域名,触发校验失败。
解决步骤
第一步:重新生成带SAN的自签名证书
先在master节点的/opt/certs目录下创建OpenSSL配置文件openssl.conf,内容如下:
[req] req_extensions = v3_req distinguished_name = req_distinguished_name [req_distinguished_name] C = CN ST = 替换为你的省份拼音 L = 替换为你的城市拼音 O = 替换为你的组织名称 OU = 替换为你的部门名称 CN = k8s-master [v3_req] basicConstraints = CA:FALSE keyUsage = nonRepudiation, digitalSignature, keyEncipherment extendedKeyUsage = serverAuth subjectAltName = @alt_names [alt_names] DNS.1 = k8s-master # 如有IP访问需求,补充master节点实际IP,示例如下: # IP.1 = 192.168.10.10
替换配置内的自定义信息后,执行以下命令备份旧证书、生成新证书:
# 备份旧证书 sudo mv /opt/certs/registry.crt /opt/certs/registry.crt.bak sudo mv /opt/certs/registry.key /opt/certs/registry.key.bak # 生成带SAN的新证书 sudo openssl req -newkey rsa:4096 -nodes -sha256 -keyout /opt/certs/registry.key -x509 -days 365 -out /opt/certs/registry.crt -config openssl.conf -extensions v3_req
生成过程中一路回车确认即可,配置文件内已预设好所需的证书字段信息。
第二步:重启Registry Pod加载新证书
因为证书目录是HostPath挂载,直接删除旧Pod触发Deployment重建即可加载新证书:
kubectl delete pod private-repository-k8s-686564966d-8grr8
等待新Pod启动后,确认STATUS为Running状态即可。
第三步:配置Mac端Docker客户端信任证书
Mac端Docker Desktop有独立的证书校验路径,仅添加到系统钥匙串不会生效,需手动将证书放到Docker指定目录:
- 创建对应仓库地址的证书目录:
sudo mkdir -p ~/.docker/certs.d/k8s-master:31320
- 将master节点上新生成的
registry.crt文件下载到Mac本地,拷贝到上述目录并重命名为ca.crt:
# 示例为证书已下载到Mac的Downloads目录,可根据实际路径调整 sudo cp ~/Downloads/registry.crt ~/.docker/certs.d/k8s-master:31320/ca.crt
- 重启Mac端的Docker Desktop服务,让证书配置生效。
第四步:验证推送功能
执行镜像推送命令确认配置生效:
docker push k8s-master:31320/nginx:1.17
额外补充
如果后续需要在K8s集群内部拉取该私有仓库的镜像,需要把新生成的registry.crt文件拷贝到所有K8s节点的/etc/docker/certs.d/k8s-master:31320/目录下,重启节点的Docker服务即可。
内容的提问来源于stack exchange,提问作者jersey bean
相关产品推荐
相关产品推荐

