2.4.2. 手动保护 Registry
手动保护 registry 以通过 TLS 提供流量:
- 部署 registry。
获取 registry 的服务 IP 和端口:
$ oc get svc/docker-registry NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE docker-registry ClusterIP 172.30.82.152 <none> 5000/TCP 1d
您可以使用现有服务器证书,或者创建对指定 CA 签名的指定 IP 和主机名有效的密钥和服务器证书。要为 registry 服务 IP 和 docker-registry.default.svc.cluster.local 主机名创建服务器证书,请在 Ansible 主机清单文件中列出的第一个 master 中运行以下命令,默认为 /etc/ansible/hosts :
$ oc adm ca create-server-cert \ --signer-cert=/etc/origin/master/ca.crt \ --signer-key=/etc/origin/master/ca.key \ --signer-serial=/etc/origin/master/ca.serial.txt \ --hostnames='docker-registry.default.svc.cluster.local,docker-registry.default.svc,172.30.124.220' \ --cert=/etc/secrets/registry.crt \ --key=/etc/secrets/registry.key
如果路由器将在 外部公开,请在
--hostnames
标志中添加公共路由主机名:--hostnames='mydocker-registry.example.com,docker-registry.default.svc.cluster.local,172.30.124.220 \
如需有关更新默认证书的更多详细信息,请参阅重新部署 Registry 和路由器 证书,以便可从外部访问该路由。
注意oc adm ca create-server-cert
命令会生成一个有效期为两年的证书。这可以通过--expire-days
选项进行修改,但出于安全原因,建议不要超过这个值。为 registry 证书创建 secret:
$ oc create secret generic registry-certificates \ --from-file=/etc/secrets/registry.crt \ --from-file=/etc/secrets/registry.key
将该机密添加到 registry 容器集的服务帐户(包括 默认 服务帐户):
$ oc secrets link registry registry-certificates $ oc secrets link default registry-certificates
注意默认情况下,“将 secret 仅限于引用它们的服务帐户”的功能被禁用。这意味着,如果在主配置文件中将
serviceAccountConfig.limitSecretReferences
设置为false
(默认设置),则不需要将 secret 连接到一个特定的服务。暂停
docker-registry
服务:$ oc rollout pause dc/docker-registry
将 secret 卷添加到 registry 部署配置中:
$ oc set volume dc/docker-registry --add --type=secret \ --secret-name=registry-certificates -m /etc/secrets
通过在 registry 部署配置中添加以下环境变量来启用 TLS:
$ oc set env dc/docker-registry \ REGISTRY_HTTP_TLS_CERTIFICATE=/etc/secrets/registry.crt \ REGISTRY_HTTP_TLS_KEY=/etc/secrets/registry.key
如需更多信息,请参阅 Docker 文档中的配置 registry 部分。
将 registry 的存活度探测使用从 HTTP 更新到 HTTPS:
$ oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{ "name":"registry", "livenessProbe": {"httpGet": {"scheme":"HTTPS"}} }]}}}}'
如果您的 registry 最初部署在 OpenShift Container Platform 3.2 或更高版本上,请将用于 registry 的就绪度探测从 HTTP 更新到 HTTPS:
$ oc patch dc/docker-registry -p '{"spec": {"template": {"spec": {"containers":[{ "name":"registry", "readinessProbe": {"httpGet": {"scheme":"HTTPS"}} }]}}}}'
恢复
docker-registry
服务:$ oc rollout resume dc/docker-registry
验证 registry 是否以 TLS 模式运行。等待最新的 docker-registry 部署完成,再验证 registry 容器的 Docker 日志。您应该找到
listening on :5000, tls
的条目。$ oc logs dc/docker-registry | grep tls time="2015-05-27T05:05:53Z" level=info msg="listening on :5000, tls" instance.id=deeba528-c478-41f5-b751-dc48e4935fc2
将 CA 证书复制到 Docker 证书目录。这必须在集群的所有节点上完成:
$ dcertsdir=/etc/docker/certs.d $ destdir_addr=$dcertsdir/172.30.124.220:5000 $ destdir_name=$dcertsdir/docker-registry.default.svc.cluster.local:5000 $ sudo mkdir -p $destdir_addr $destdir_name $ sudo cp ca.crt $destdir_addr 1 $ sudo cp ca.crt $destdir_name
- 1
- ca.crt 文件是 master 上的 /etc/origin/master/ca.crt 的副本。
在使用身份验证时,一些
docker
版本还需要将集群配置为信任操作系统级别的证书。复制证书:
$ cp /etc/origin/master/ca.crt /etc/pki/ca-trust/source/anchors/myregistrydomain.com.crt
运行:
$ update-ca-trust enable
只删除 /etc/sysconfig/docker 文件中的这个特定 registry 的
--insecure-registry
选项。然后,重新载入守护进程并重启 docker 服务来反映这个配置更改:$ sudo systemctl daemon-reload $ sudo systemctl restart docker
验证
docker
客户端连接。运行docker push
到 registry 或 registry 中的docker pull
应该会成功。确保您已登录到 registry。$ docker tag|push <registry/image> <internal_registry/project/image>
例如:
$ docker pull busybox $ docker tag docker.io/busybox 172.30.124.220:5000/openshift/busybox $ docker push 172.30.124.220:5000/openshift/busybox ... cf2616975b4a: Image successfully pushed Digest: sha256:3662dd821983bc4326bee12caec61367e7fb6f6a3ee547cbaff98f77403cab55