《OpenShift / RHEL / DevSecOps 汇总目录》
本文适合 OpenShift 4.11 及其以上版本。
文章目录
- 在离线环境中用 OpenShift 准备 Mirror Registry
- 环境说明
- 向隔离环境复制镜像
- 准备节点环境
- bastion 节点操作
- support 节点操作
- 网络完全隔离环境-复制镜像
- bastion 节点操作
- support 节点操作
- 网络部分隔离环境-复制镜像
- bastion 节点操作
- 切换 Catalog Source
- 更新 Operator 列表
- oc-mirror 命令说明
- 列出已有 release 版本
- 查看 operator 列表
- 初始化 imageset config 文件
- 下载 Image
- 检查 Image 是否有更新
- 参考
在离线环境中用 OpenShift 准备 Mirror Registry
环境说明
bastion 节点 | support 节点 | |
---|---|---|
作用 | 可以访问互联网,但不可以访问 OpenShift 集群,用来下载离线的容器 Image | 不能访问互联网,但可以访问 OpenShift 集群,用来运行 mirror registry 服务 |
配置 | RHEL8/1vcpu/4GB 250GB (根据需要调整) | RHEL8/2vcpu/8GB 500GB (根据需要调整) |
向隔离环境复制镜像
向隔离环境复制容器镜像可以分为 “网络完全隔离环境” 和 “网络部分隔离环境” 两种场景。无论是哪种场景,都先按以下说明准备 bastion 和 support 节点环境。
准备节点环境
- 先在两个节点中执行以下命令,其中为 SUPPORT_HOSTNAME 设置了完整的全域名。
yum install podman rsync glibc -y
export SUPPORT_HOSTNAME=<SUPPORT-NODE-FQDN>
export OCP_VER_S=4.16
export OCP_VER_L=4.16.4
export MIRROR_DATA_PATH=/data/ocp4/mirror-data
export MIRROR_REGISTRY_PATH=/data/ocp4/mirror-registry
export COMMAND_PATH=/data/ocp4/oc
mkdir -p $MIRROR_DATA_PATH $MIRROR_REGISTRY_PATH $COMMAND_PATH
bastion 节点操作
- 下载 mirror-registry 软件,oc 客户端和 oc-mirror 插件。
curl -L -o $MIRROR_REGISTRY_PATH/mirror-registry.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/mirror-registry/latest/mirror-registry.tar.gz## OCP 4.14 及其以前版本
curl -L -o $COMMAND_PATH/oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$OCP_VER_L/openshift-client-linux.tar.gz
## OCP 4.15 及其以后版本
curl -L -o $COMMAND_PATH/oc.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$OCP_VER_L/openshift-client-linux-amd64-rhel8.tar.gz
tar -xzf $COMMAND_PATH/oc.tar.gz -C $COMMAND_PATH occurl -L -o $COMMAND_PATH/oc-mirror.tar.gz https://mirror.openshift.com/pub/openshift-v4/clients/ocp/$OCP_VER_L/oc-mirror.tar.gz
tar -xzf $COMMAND_PATH/oc-mirror.tar.gz -C $COMMAND_PATH
chmod +x $COMMAND_PATH/oc-mirrorrm -f $COMMAND_PATH/oc.tar.gz $COMMAND_PATH/oc-mirror.tar.gz
- 下载用来从 registry.redhat.io、quay.io 等官方网站下载镜像的 pull-secret 。
mkdir $HOME/.docker
curl -L -o $HOME/.docker/config.json https://gitee.com/dawnskyliu/ocp/raw/master/pull-secret.json
- 将以上下载的文件从 bastion 节点传到 support 节点对应目录。
rsync -avP $MIRROR_REGISTRY_PATH/* root@$SUPPORT_HOSTNAME:$MIRROR_REGISTRY_PATH
rsync -avP $COMMAND_PATH/* root@$SUPPORT_HOSTNAME:$COMMAND_PATH
support 节点操作
- 创建 mirror registry 运行环境,默认软件将安装在 $HOME/quay-install 目录下。完成后可以看到 mirror registry 的访问地址,可以用浏览器访问该地址。
$ tar -xzvf $MIRROR_REGISTRY_PATH/mirror-registry.tar.gz -C $MIRROR_REGISTRY_PATH
$ cd $MIRROR_REGISTRY_PATH && ./mirror-registry install --initUser quayadmin --initPassword PASSWORD
。。。。
PLAY RECAP *****************************************************************************************************************************
lab-user@ip-10-0-50-115.us-east-2.compute.internal : ok=55 changed=35 unreachable=0 failed=0 skipped=16 rescued=0 ignored=0INFO[2024-08-01 11:38:05] Quay installed successfully, config data is stored in ~/quay-install
INFO[2024-08-01 11:38:05] Quay is available at https://ip-10-0-50-115.us-east-2.compute.internal:8443 with credentials (quayadmin, PASSWORD)
- 让 support 系统信任 mirror registry 的自签名 TLS 证书。
cp -v $HOME/quay-install/quay-rootCA/rootCA.pem /etc/pki/ca-trust/source/anchors/
update-ca-trust
- 确认可以登录 mirror registry,然后查看生成的默认认证文件。
$ podman login $SUPPORT_HOSTNAME:8443 -u quayadmin -p PASSWORD
$ more $XDG_RUNTIME_DIR/containers/auth.json
{"auths": {"ip-10-0-50-115.us-east-2.compute.internal:8443": {"auth": "cXVheWFkbWluOlBBU1NXT1JE"}}
}
网络完全隔离环境-复制镜像
完全隔离环境是指 bastion 和 support 节点之间的网络无法直接连通的情况,这样只能先在 bastion 节点用 oc-mirror 命令将容器 Image 下载到文件系统中,然后再将离线文件传到 support 节点,最后再在 support 节点中用 oc-mirror 命令将这些 Image 从文件导入到运行在 support 节点的 mirror registry 里。
bastion 节点操作
- 创建 imageset-config.yaml 文件,它定义了将在 mirror registry 中存储的的 OpenShift 发行版、Operator 和其他独立镜像。如果需要增加其他 Image,可以向以下文件追加内容即可。说明:可参考下节使用 oc-mirror 命令获得 OpenShift 和 Operator 的版本信息。
cat << EOF > $MIRROR_DATA_PATH/imageset-config-1.yaml
kind: ImageSetConfiguration
apiVersion: mirror.openshift.io/v1alpha2
storageConfig:local:path: $MIRROR_DATA_PATH
mirror:platform:channels:- name: stable-$OCP_VER_Stype: ocpminVersion: $OCP_VER_LmaxVersion: $OCP_VER_Loperators:- catalog: registry.redhat.io/redhat/redhat-operator-index:v$OCP_VER_Spackages:- name: web-terminalchannels:- name: fastadditionalImages:- name: registry.redhat.io/rhel8/support-toolshelm: {}
EOF
- 将 Image 离线文件下载到 bastion 节点本地,最后会看到生成 mirror_seq1_000000.tar 文件的提示。
$COMMAND_PATH/oc-mirror --config $MIRROR_DATA_PATH/imageset-config-1.yaml file://$MIRROR_DATA_PATH
- 将离线文件复制到被隔离的 support 节点。
rsync -avP $MIRROR_DATA_PATH/* root@$SUPPORT_HOSTNAME:$MIRROR_DATA_PATH
support 节点操作
- 将离线 Image 文件导入 mirror registry。
$ cd $MIRROR_DATA_PATH && $COMMAND_PATH/oc-mirror --from=./mirror_seq1_000000.tar docker://$SUPPORT_HOSTNAME:8443
。。。
Wrote release signatures to oc-mirror-workspace/results-1722514691
Rendering catalog image "ip-10-0-50-115.us-east-2.compute.internal:8443/redhat/redhat-operator-index:v4.14" with file-based catalog
Writing image mapping to oc-mirror-workspace/results-1722514691/mapping.txt
Writing CatalogSource manifests to oc-mirror-workspace/results-1722514691
Writing ICSP manifests to oc-mirror-workspace/results-1722514691
网络部分隔离环境-复制镜像
部分隔离环境是指 bastion 和 support 节点之间的网络可以直接连通的情况,这样可以直接在 bastion 节点用 oc-mirror 命令下载 Image 并同时传入运行在 support 节点上的 mirror registry 里,在这个过程中 Image 无需落地到 bastion 节点的存储中。
bastion 节点操作
- 将访问 support 节点上 mirror registry 的认证信息写入用来保存 pull-secret 的 config.json 文件。
podman login -u quayadmin -p PASSWORD $SUPPORT_HOSTNAME:8443 --authfile $HOME/.docker/config.json
- 此时可通过 config.json 同时访问外部 registry 和内部的 mirror registry(如下面的 ip-10-0-50-115.us-east-2.compute.internal:8443)。
$ cat $HOME/.docker/config.json
{"auths": {"cloud.openshift.com": {"auth": "b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K29jbV9hY2Nlc3NfOGI1MGUwNjBiNWYwNDAzMGIxM2YwNjBlMjRhYzQzZWU6UEtHNlpWVTlPNzhRS0ZGS1UzTTA0SkpZWFNEOTBBSUgzU0JMN1RQUFhTWlRGWFY3UzBDUzBEUDZBU0xITVlHMA=="},"ip-10-0-50-115.us-east-2.compute.internal:8443": {"auth": "cXVheWFkbWluOlBBU1NXT1JE"},"quay.io": {"auth": "b3BlbnNoaWZ0LXJlbGVhc2UtZGV2K29jbV9hY2Nlc3NfOGI1MGUwNjBiNWYwNDAzMGIxM2YwNjBlMjRhYzQzZWU6UEtHNlpWVTlPNzhRS0ZGS1UzTTA0SkpZWFNEOTBBSUgzU0JMN1RQUFhTWlRGWFY3UzBDUzBEUDZBU0xITVlHMA=="},"registry.connect.redhat.com": {"auth": "fHVoYy1wb29sLWY1ZjAwNDllLTQwNzktNDJkZi05YzA3LTUzODVjM2UyZGE5NTpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSm1aV0l5TW1Ga09ETmxORFUwT0dKa09XUTVaR1JpTmpRME1tSTFaVEk1T0NKOS5TalV0VTJUYzVQWEw0UVZVS0U4NWpFaGNmajNzR1NmQWFmbTRGclVVR09UNWc3RlBOZHB4V2lFeTd4eVVRbmtTaTBxSERselcyczJlN3lhQzE0ODE4N05VUmFvZ0Q5UGptMWozWG9SUTBRY2R6c3VBdkNKcTY5dW9rQXU4MjU3T2tMQWNxWjJ5T3huS19LVXlIc01FZ2pLMXFtWWU4c0xfOE91UmV4Yk8weGlhNTZYSV9fdlc4cUNMZUZXRTdPQkMzSFJDcE5oRWRJeElYZEVPV3dMZnhIblN0ZFA3TVZaRTZveEowblZpckFyZUh5SV85bnU2aDFTSm5fa2pvTW5vM3l5MU1KdVk4MkNoY1JFa0VsUkRaNDMxRUo0R0lUM1YtRGxyNVdRNHhUcG15M3V2TDdFQXQ1cTlwZldDdUNiNWRLXzdwR2dMbkRmOWtRb3k1U053dS13TDI0UEFta2J6b1ZWV0FDclY4WFhGZ2cyTTBoRS1OVkExdGlvLUlLelFRX2ZlWm53cVpLZWEwek1HRzVtY3lKTzlsYlNGRHE3X0Q1TnpDandMVzhOY3RRYzJTRVVrMnBkWjd1eWdqQ1N3dWpNbTVmRWNLcVp5eWh4UTlGMDhSanMyZTd2Vm44enFwQWEzNWlhb2V1U0RtVVhpa0xfZzZ6VDA5VzlWRHExM2JDeXR4eVAzUFJhdExNUGlIcXpjZ0NZd0dJcTl5a3FIMXd3X0RzdDRtcEpUUl85QlphVVRZN0NQQjg5a3Z2SzFWQTM3RWVtTnl3YlZOR1FIcDA5NGJvcmwtZk8zNTIteGFhaHY5TEg2dDlwTUsxWmRTT2RIR21PQXZEUmc0NkV3T0RIY0tBX1B0eFZOYTVUbjVuLXNGVUlJYkl0eC1DcDdSUXVGaFo4QndMMA=="},"registry.redhat.io": {"auth": "fHVoYy1wb29sLWY1ZjAwNDllLTQwNzktNDJkZi05YzA3LTUzODVjM2UyZGE5NTpleUpoYkdjaU9pSlNVelV4TWlKOS5leUp6ZFdJaU9pSm1aV0l5TW1Ga09ETmxORFUwT0dKa09XUTVaR1JpTmpRME1tSTFaVEk1T0NKOS5TalV0VTJUYzVQWEw0UVZVS0U4NWpFaGNmajNzR1NmQWFmbTRGclVVR09UNWc3RlBOZHB4V2lFeTd4eVVRbmtTaTBxSERselcyczJlN3lhQzE0ODE4N05VUmFvZ0Q5UGptMWozWG9SUTBRY2R6c3VBdkNKcTY5dW9rQXU4MjU3T2tMQWNxWjJ5T3huS19LVXlIc01FZ2pLMXFtWWU4c0xfOE91UmV4Yk8weGlhNTZYSV9fdlc4cUNMZUZXRTdPQkMzSFJDcE5oRWRJeElYZEVPV3dMZnhIblN0ZFA3TVZaRTZveEowblZpckFyZUh5SV85bnU2aDFTSm5fa2pvTW5vM3l5MU1KdVk4MkNoY1JFa0VsUkRaNDMxRUo0R0lUM1YtRGxyNVdRNHhUcG15M3V2TDdFQXQ1cTlwZldDdUNiNWRLXzdwR2dMbkRmOWtRb3k1U053dS13TDI0UEFta2J6b1ZWV0FDclY4WFhGZ2cyTTBoRS1OVkExdGlvLUlLelFRX2ZlWm53cVpLZWEwek1HRzVtY3lKTzlsYlNGRHE3X0Q1TnpDandMVzhOY3RRYzJTRVVrMnBkWjd1eWdqQ1N3dWpNbTVmRWNLcVp5eWh4UTlGMDhSanMyZTd2Vm44enFwQWEzNWlhb2V1U0RtVVhpa0xfZzZ6VDA5VzlWRHExM2JDeXR4eVAzUFJhdExNUGlIcXpjZ0NZd0dJcTl5a3FIMXd3X0RzdDRtcEpUUl85QlphVVRZN0NQQjg5a3Z2SzFWQTM3RWVtTnl3YlZOR1FIcDA5NGJvcmwtZk8zNTIteGFhaHY5TEg2dDlwTUsxWmRTT2RIR21PQXZEUmc0NkV3T0RIY0tBX1B0eFZOYTVUbjVuLXNGVUlJYkl0eC1DcDdSUXVGaFo4QndMMA=="}}
}
- 生成以下 imageset-config-2.yaml 文件。它定义了将在 mirror registry 中存储的的 OpenShift 发行版、Operator 和其他独立镜像。如果需要增加新的 Image,向文件追加内容即可。
$ cat << EOF > $MIRROR_DATA_PATH/imageset-config-2.yaml
kind: ImageSetConfiguration
apiVersion: mirror.openshift.io/v1alpha2
storageConfig:registry:imageURL: $SUPPORT_HOSTNAME:8443/mirror/metadataskipTLS: false
mirror:platform:channels:- name: stable-$OCP_VER_Stype: ocpminVersion: $OCP_VER_LmaxVersion: $OCP_VER_Loperators:- catalog: registry.redhat.io/redhat/redhat-operator-index:v$OCP_VER_Spackages:- name: web-terminalchannels:- name: fastadditionalImages:- name: registry.redhat.io/rhel8/support-toolshelm: {}
EOF
- 根据 imageset-config-2.yaml 下载镜像,并将镜像直接推送到 support 节点上的 mirror registry 中。
$ cd $MIRROR_DATA_PATH && $COMMAND_PATH/oc-mirror --config ./imageset-config-2.yaml docker://$SUPPORT_HOSTNAME:8443
。。。
Writing image mapping to oc-mirror-workspace/results-1722516790/mapping.txt
Writing CatalogSource manifests to oc-mirror-workspace/results-1722516790
Writing ICSP manifests to oc-mirror-workspace/results-1722516790
deleting directory /tmp/render-unpack-1928395028
deleting directory /tmp/imageset-catalog-registry-3569095946
- 将同步结果 oc-mirror-workspace/result* 文件夹复制到能够访问 OpenShift 集群的 support 节点。
rsync -avP $MIRROR_DATA_PATH/oc-mirror-workspace/result* root@$SUPPORT_HOSTNAME:$MIRROR_DATA_PATH/oc-mirror-workspace
切换 Catalog Source
在可以访问到 OpenShift 集群的 support 节点上执行:
- 在安装好的 OpenShift 离线集群中需要关闭其缺省自带的 catalog source。
$ oc get CatalogSource -n openshift-marketplace
NAME DISPLAY TYPE PUBLISHER AGE
certified-operators Certified Operators grpc Red Hat 28m
community-operators Community Operators grpc Red Hat 28m
redhat-marketplace Red Hat Marketplace grpc Red Hat 28m
redhat-operators Red Hat Operators grpc Red Hat 28m$ oc patch OperatorHub cluster --type merge -p '{"spec": {"disableAllDefaultSources": true}}'
- 编辑 oc-mirror-workspace/result*/catalogSource-cs-redhat-operator-index.yaml 文件,添加以下内容(每 3 分钟自动更新 Operator 列表),然后创建 CatalogSource 对象,这样就启用了自己的 catalog source。注意:由于 oc - mirror 每次在 results-XXXXX 目录生成的 catalogSource-cs-redhat-operator-index.yaml 文件内容都一样,因此以下命令只需要执行一次即可。
cat << EOF >> $MIRROR_DATA_PATH/oc-mirror-workspace/results-XXXXX/catalogSource-cs-redhat-operator-index.yamldisplayName: Disconnected Red Hat Catalogpublisher: MeupdateStrategy:registryPoll:interval: 3m
EOF oc create -f $MIRROR_DATA_PATH/oc-mirror-workspace/results-XXXXX/catalogSource-cs-redhat-operator-index.yaml
更新 Operator 列表
每次有新的 OpenShift 发行版、新的 Operator 或新的 Image 同步到 mirror registry 后,如果没有为 CatalogSource 配置上一步的 updateStrategy 自动更新策略,则还需要在可以访问到 OpenShift 集群的节点上执行以下命令:
- 添加 ImageContentSourcePolicy 配置。
oc apply -f oc-mirror-workspace/results-XXXXX/imageContentSourcePolicy.yaml
- 查看运行 cs-redhat-operator-index 的 Pod 更新情况。
oc get pod -n openshift-marketplace -w
- 确认新的 Operator 已出现在 OperatorHub 中,例如 vertical-pod-autoscaler 是新追加的 Operator。
$ oc get packagemanifest -n openshift-marketplace
NAME CATALOG AGE
web-terminal 2m36s
devworkspace-operator 2m36s
vertical-pod-autoscaler 2m36s
oc-mirror 命令说明
oc-mirror 插件会使用名为 imageset-config 的配置文件,该文件定义了镜像注册表的内容。oc-mirror 的两个主要输出是镜像注册表有效载荷(称为图像集)和元数据文件(用于存储先前生成的图像集的信息)。
列出已有 release 版本
列出 OpenShift 发行版本,缺省会使用 default channel。
oc-mirror list releases
oc-mirror list releases --version=4.16
查看 operator 列表
oc-mirror list operators --catalogs --version=4.14
oc-mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.14 > redhat-operator.out
oc-mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.14--package=openshift-pipelines-operator-rh
oc-mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v--package=openshift-pipelines-operator-rh --channel=stable
初始化 imageset config 文件
oc-mirror init
下载 Image
适用于网络完全隔离环境:
oc-mirror --config imageset-config.yaml file:///path/to/archives
oc-mirror --from /path/to/archives docker://$SUPPORT_HOSTNAME:8443
适用于网络部分隔离环境:
oc-mirror --config imageset-config.yaml docker://$SUPPORT_HOSTNAME:8443
检查 Image 是否有更新
oc-mirror list updates --config imageset-config.yaml
参考
https://www.redhat.com/en/blog/mirroring-openshift-registries-the-easy-way
https://www.redhat.com/en/blog/how-oc-mirror-will-help-you-reduce-container-management-complexity
https://www.redhat.com/en/blog/introducing-mirror-registry-for-red-hat-openshift
https://two-oes.medium.com/deploying-a-single-operator-on-openshift-disconnected-22e01b44a5d1
https://medium.com/@santivelazquez/how-to-install-operators-in-openshift-on-an-air-gapped-environment-oc-mirror-480204e06ac6
https://naps-product-sa.github.io/ocp4-disconnected-workshop/modules/index.html
https://danielchg.github.io/posts/oc-mirror/
https://access.redhat.com/solutions/7047539
https://access.redhat.com/solutions/6994677
https://github.com/openshift/oc-mirror/blob/main/docs/usage.md
https://people.redhat.com/mskinner/rhug/q4.2022/Edge-with-OC-Mirror.pdf
https://medium.com/@abhichandra1998/installing-operators-in-a-disconnected-openshift-cluster-129af21cd904
https://docs.openshift.com/container-platform/4.16/operators/admin/olm-managing-custom-catalogs.html#olm-creating-catalog-from-index_olm-managing-custom-catalogs
https://shonpaz.medium.com/dealing-with-air-gapped-environments-just-got-much-easier-bab6b76e44f2
https://developers.redhat.com/articles/2024/07/23/how-get-red-hat-openshift-operators-information-without-oc-mirror-plug