在离线安装OpenShift的时候,需要创建一个Mirror Registry,它的作用是将quay.io上用于安装OpenShift的容器镜像缓存在本地镜像仓库中,在安装OpenShift的时候可以从Mirror Registry中获取镜像。Mirror Registry通常是外部镜像仓库,高可用方案参见2.2.3节第4小节。
目前创建Mirror Registry主要有以下三种方法,如图3-7所示。
图3-7 OpenShift离线镜像的同步方式
如果Mirror Registry节点可以连接外网,并且网速比较快,用方法1,将quay.io上的OpenShift镜像直接缓存到Mirror Registry中。
首先配置环境变量。
export OCP_RELEASE=4.4.10-x86_64 #要缓存的容器镜像版本号 export LOCAL_REGISTRY='repo.apps.weixinyucluster.bluecat.ltd:5000/openshift4' #离线镜像仓库的名称和端口号 export LOCAL_REPOSITORY='ocp4/openshift4' #容器镜像仓库的目录 export PRODUCT_REPO='openshift-release-dev' #固定值 export LOCAL_SECRET_JSON='/root/pullsecret_config.json' #指定身份信息文件位置 export RELEASE_NAME="ocp-release" #固定值
缓存镜像,命令执行成功如图3-8所示。
# oc adm -a ${LOCAL_SECRET_JSON} release mirror \ --from=quay.io/${PRODUCT_REPO}/${RELEASE_NAME}:${OCP_RELEASE} \ --to=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY} \ --to-release-image=${LOCAL_REGISTRY}/${LOCAL_REPOSITORY}:${OCP_RELEASE}
图3-8 缓存镜像成功
然后用如下脚本查看Mirror Registry中的OpenShift镜像(david:david是离线仓库的用户名和密码)。
curl -u david:david -s https://repo.apps.weixinyucluster.bluecat.ltd:5000/v2/_catalog | \ jq -r '.["repositories"][]' | \ xargs -I @REPO@ curl -u david:david -s https://repo.apps.weixinyucluster. bluecat.ltd:5000/v2/@REPO@/tags/list | \ jq -r -M '.["name"] + ":" + .["tags"][]'
查看结果如图3-9所示。
图3-9 确认镜像缓存成功
如果Mirror Registry节点不能连接外网(现实是这种情况更多),那么就在自己笔记本上缓存OpenShift镜像到文件系统目录中。
# oc adm -a /root/pullsecret_config.json release mirror --from=quay.io/openshift- release-dev/ocp-release:4.4.10-x86_64 --to-dir=/weixinyu/mirror
执行成功结果如下所示。
Success Update image: openshift/release:4.4.10 To upload local images to a registry, run: oc image mirror --from-dir=/weixinyu/mirror 'file://openshift/ release:4.4.10*' REGISTRY/REPOSITORY Configmap signature file /weixinyu/mirror/config/signature-sha256- 0d1ffca302ae55d3.yaml created
查看保存镜像的目录结构,如图3-10所示。
图3-10 保存镜像的目录结构
接下来,将镜像目录打成tar.gz包。
# tar -zcf /weixinyu/mirror.tar.gz -C /weixinyu/mirror
将镜像mirror.tar.gz上传到Mirror Registry机器并解压缩。
# tar -zxf mirror.tar.gz
将镜像导入离线仓库。
# oc image mirror --from-dir=/davidwei/mirror 'file://openshift/release:4.4.10*' repo.apps.weixinyucluster.bluecat.ltd:5000/ocp4/openshift4
图3-11显示镜像导入过程。
图3-11 镜像导入过程
导入成功后,确保可以拉取镜像。
# podman pull repo.apps.weixinyucluster.bluecat.ltd:5000/ocp4/openshift4:4.4.10- ironic-static-ip-manager Trying to pull repo.apps.weixinyucluster.bluecat.ltd:5000/ocp4/openshift4:4.4.10- ironic-static-ip-manager... Getting image source signatures Copying blob fc5aa93e3b58 done Copying blob 1a6747857d79 done Writing manifest to image destination Storing signatures 6b7a2b05aaaa4829789e600e4a6fe3edf77c523a61509804e8d7781d7bb365e5
方法3是在可以连接到外网的机器(如笔记本)上直接执行离线镜像同步,然后直接压缩同步后的镜像仓库的data目录,再拷贝到Mirror Registry机器上解压缩还原镜像仓库数据。这种方法比较简单易行,但要求笔记本镜像仓库和数据中心镜像仓库都使用Docker Registry V2。
在笔记本环境执行如下命令打包Docker Registry的数据目录。
# tar -zcf registry.tar.gz data/
把registry.tar.gz压缩包上传到Mirror Registry的存储目录(如/opt/registry),然后解压缩。
# cd /opt/registry # tar -zxf registry.tar.gz data/
随后在离线环境通过podman启动Docker Registry时,指定镜像解压缩目录。
# podman run --name mirror-registry -p 5000:5000 -v /data/registry:/var/lib/ registry -v /opt/registry/auth:/auth:z -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e REGISTRY_AUTH_HTPASSWD_PATH= /auth/htpasswd -v /opt/registry/certs:/certs:z -e REGISTRY_HTTP_TLS_ CERTIFICATE=/certs/example.com.crt -e REGISTRY_HTTP_TLS_KEY=/certs/example. com.key -d docker.io/library/registry:2
离线安装OpenShift的时候,我们需要在install-config.yaml文件中添加Mirrror Registry的证书和pull secret,也就是同步镜像输出的imageContentSource数据,这样OpenShift安装过程中会使用Mirror Registry中的镜像,而且安装完毕后会自动将pull secret和证书添加到集群中。
但如果OpenShift安装以后Mirror Registry遇到故障该怎么办呢?
只要auth和certs还存在,问题就不大,将data目录的数据恢复即可(镜像文件易于恢复)。
# ls /opt/registry auth certs data
但如果auth和certs被删除或者破坏了,也就是说之前的Mirror Registry所有相关内容全部消失了,那么就只能重新创建Mirror Registry。但搭建好以后,此时正在运行的OpenShift中没有这个新仓库的证书和pull secret,OpenShift不能再从Mirror Registry中拉取镜像,这不利于容器故障恢复和以后的集群升级。
针对这种问题,需要修改以下两处进行修复:
1)在OpenShift集群中增加新Mirror Registry的CA证书。
2)在OpenShift集群中增加新Mirror Registry的pull secret。
我们先介绍修改证书的方法。OpenShift中使用Configmap管理Registry的CA证书,如图3-12所示。
# oc project openshift-config
图3-12 查看Configmap
而OpenShift集群中定义Configmap的位置如图3-13所示。
# oc edit image.config.openshift.io cluster
图3-13 查看image.config.openshift.io中包含的证书
这时候,registry-config中不包含新的Mirror Registry证书。
我们根据新的Mirror Registry,创建一个Configmap。
切换到新Mirror Registry的Registry目录。
# cd /opt/registry/certs # oc create cm davidwei-crt -n openshift --from-file=repo.apps.weixinyucluster. bluecat.ltd..5000=/opt/registry/certs/example.crt configmap/davidwei-crt created
修改image.config.openshift.io。
# oc edit image.config.openshift.io cluster
修改内容如图3-14所示。
图3-14 image.config.openshift.io中增加新的证书
我们通过一条命令行也可以完成增加新证书的操作。
#oc patch image.config.openshift.io/cluster --patch '{"spec":{"additionalTrustedCA": {"name":"davidwei-crt"}}}' --type=merge
需要注意的是:一套OCP集群只能增加一个additionalTrustedCA,不能使多个生效。因此如果configmap要包含多个证书,则在上面执行oc create cm davidwei-crt时,增加多个--from-file参数指定多个仓库和证书文件。
然后我们还需要在OpenShift中增加Mirror的pull secret。
默认情况下pull secret应既包含Mirror Registry的pull secret,又包含访问外部仓库quay.io的pull secret。(在纯离线环境,只包含前者也可以。)
下载pull-secret文件,并重命名为pullsecret_config.json。下载地址为 https://cloud.redhat.com/openshift/install/pull-secret 。
# cp pull-secret pullsecret_config.json # podman login --authfile ~/pullsecret_config.json repo.apps.weixinyucluster. bluecat.ltd:5000
登录成功以后,pullsecret_config.json文件就同时包含红帽仓库和Mirror Registry的pull secret了。
接下来,对pullsecret_config.json进行base64加密。
# cat ~/pullsecret_config.json | base64 -w 0
将base64加密后的内容,贴在图3-15方框的位置。
# oc edit secrets pull-secret -n openshift-config
图3-15 修改pull-secret
在本地镜像仓库创建成功之后,接下来我们演示在vSphere环境离线安装的具体步骤。