问题摘要
我有一个 Kubernetes 集群 1.30,运行在 3 个 AWS EC2 服务器、1 个主节点和 2 个工作节点上。我正在尝试使用registry:2.8.2
CNCF 分发项目的映像部署私有容器注册表。我已按照下面列出的步骤操作,但在尝试执行 docker 登录注册表时收到错误“x509 证书由未知机构签名”。
注意:我正在使用自签名证书。
重现步骤
创建自签名证书和用户身份验证。TLS 证书使用 OpenSSL:
mkdir registry cd registry mkdir certs mkdir auth openssl req -x509 -newkey rsa:4096 -days 365 -nodes -sha256 -keyout certs/tls.key -out certs/tls.crt -subj "/CN=my-registry" -addext "subjectAltName = DNS:my-registry"
用于
htpasswd
添加注册表访问的用户身份验证。私有注册表的凭据为myuser/mypasswd
:docker run --entrypoint htpasswd httpd:2 -Bbn myuser mypasswd > auth/htpasswd
创建一个 secret 来挂载证书(secret type
tls
):kubectl create secret tls certs-secret --cert=/home/ubuntu/day42/registry/certs/tls.crt --key=/home/ubuntu/day42/registry/certs/tls.key
创建身份验证的秘密:
kubectl create secret generic auth-secret --from-file=/home/ubuntu/day42/registry/auth/htpasswd
创建本地目录并应用 PV PVC。
创建注册表 pod。
apiVersion: v1
kind: Pod
metadata:
name: docker-registry-pod
labels:
app: registry
spec:
containers:
- name: registry
image: registry:2.8.2
volumeMounts:
- name: repo-vol
mountPath: "/var/lib/registry"
- name: certs-vol
mountPath: "/certs"
readOnly: true
- name: auth-vol
mountPath: "/auth"
readOnly: true
env:
- name: REGISTRY_AUTH
value: "htpasswd"
- name: REGISTRY_AUTH_HTPASSWD_REALM
value: "Registry Realm"
- name: REGISTRY_AUTH_HTPASSWD_PATH
value: "/auth/htpasswd"
- name: REGISTRY_HTTP_TLS_CERTIFICATE
value: "/certs/tls.crt"
- name: REGISTRY_HTTP_TLS_KEY
value: "/certs/tls.key"
volumes:
- name: repo-vol
persistentVolumeClaim:
claimName: registry-pvc
- name: certs-vol
secret:
secretName: certs-secret
- name: auth-vol
secret:
secretName: auth-secret
创建服务舱。
导出环境变量:
export REGISTRY_NAME="my-registry" Master-->export REGISTRY_IP="10.100.175.12" # (Above IP is the NodePort service IP)
/etc/hosts
在所有节点中添加以下条目:10.100.175.12 my-registry
复制
tls.crt
到/usr/local/share/ca-certificates
所有节点并运行以下命令:sudo update-ca-certificates
尝试登录注册表:
docker login my-registry:5000 -u myuser -p mypasswd
错误详细信息
Error response from daemon: Get "https://my-registry:5000/v2/": tls: failed to verify certificate: x509: certificate signed by unknown authority
输出crictl info
crictl info |grep -i tls
"enableTLSStreaming": false,
"tlsCertFile": "",
"tlsKeyFile": ""
对于 SSL 之类的证书,您需要将整个证书链添加到您使用 nginx 运行注册表的证书文件中。许多操作系统不信任中间 CA ,只信任根 CA,因此您需要在主机证书和操作系统信任的根 CA之间填写缺失的步骤。
在您收到证书的电子邮件中,您还应该找到中间 CA 和根 CA 的链接。打开docker-registry.crt文件,滚动到底部,并附加中间 CA,最后附加 PositiveSSL 链的根 CA 证书。完成后,重新启动 nginx。现在您应该可以开始了。
注意:如果您拥有域名,您可以使用 Let's Encrypt免费获取可信证书。
呼!花了三天时间解决这个问题后,我终于搞清楚了。
以下是我为解决该问题所采取的步骤:
确保所有节点都信任自签名证书:
tls.crt
已复制到/usr/local/share/ca-certificates
所有节点sudo update-ca-certificates
在每个节点上运行。配置Docker以信任自签名证书:
需要明确配置 Docker 以信任您的自签名证书。您必须将 复制
tls.crt
到 Docker 的受信任证书目录。再次运行 docker login