OpenShift 4 - 用 oc-mirror 为离线 OpenShift 集群的 Mirror Registry 同步容器镜像

OpenShift / RHEL / DevSecOps 汇总目录
本文适合 OpenShift 4.11 及其以上版本。

在离线环境中用 OpenShift 准备 Mirror Registry

环境说明

bastion 节点support 节点
作用可以访问互联网,但不可以访问 OpenShift 集群,用来下载离线的容器 Image不能访问互联网,但可以访问 OpenShift 集群,用来运行 mirror registry 服务
配置RHEL8/1vcpu/4GB 250GB (根据需要调整)RHEL8/2vcpu/8GB 500GB (根据需要调整)

向隔离环境复制镜像

向隔离环境复制容器镜像可以分为 “网络完全隔离环境” 和 “网络部分隔离环境” 两种场景。无论是哪种场景,都先按以下说明准备 bastion 和 support 节点环境。

准备节点环境

  1. 先在两个节点中执行以下命令,其中为 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 节点操作
  1. 下载 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 oc
 
curl -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-mirror

rm -f $COMMAND_PATH/oc.tar.gz $COMMAND_PATH/oc-mirror.tar.gz
  1. 下载用来从 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
  1. 将以上下载的文件从 bastion 节点传到 support 节点对应目录。
rsync -avP $MIRROR_REGISTRY_PATH/* root@$SUPPORT_HOSTNAME:$MIRROR_REGISTRY_PATH
rsync -avP $COMMAND_PATH/* root@$SUPPORT_HOSTNAME:$COMMAND_PATH
support 节点操作
  1. 创建 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=0

INFO[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)
  1. 让 support 系统信任 mirror registry 的自签名 TLS 证书。
cp -v $HOME/quay-install/quay-rootCA/rootCA.pem /etc/pki/ca-trust/source/anchors/
update-ca-trust
  1. 确认可以登录 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 节点操作
  1. 创建 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_S
      type: ocp
      minVersion: $OCP_VER_L
      maxVersion: $OCP_VER_L
 
  operators:
  - catalog: registry.redhat.io/redhat/redhat-operator-index:v$OCP_VER_S
    packages:
    - name: web-terminal
      channels:
      - name: fast
 
  additionalImages:
  - name: registry.redhat.io/rhel8/support-tools
  
  helm: {}
EOF
  1. 将 Image 离线文件下载到 bastion 节点本地,最后会看到生成 mirror_seq1_000000.tar 文件的提示。
$COMMAND_PATH/oc-mirror --config $MIRROR_DATA_PATH/imageset-config-1.yaml file://$MIRROR_DATA_PATH
  1. 将离线文件复制到被隔离的 support 节点。
rsync -avP $MIRROR_DATA_PATH/* root@$SUPPORT_HOSTNAME:$MIRROR_DATA_PATH
support 节点操作
  1. 将离线 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 节点操作
  1. 将访问 support 节点上 mirror registry 的认证信息写入用来保存 pull-secret 的 config.json 文件。
podman login -u quayadmin -p PASSWORD $SUPPORT_HOSTNAME:8443 --authfile $HOME/.docker/config.json
  1. 此时可通过 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=="
                }
        }
}
  1. 生成以下 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/metadata
   skipTLS: false
mirror:
  platform:
    channels:
    - name: stable-$OCP_VER_S
      type: ocp
      minVersion: $OCP_VER_L
      maxVersion: $OCP_VER_L

  operators:
  - catalog: registry.redhat.io/redhat/redhat-operator-index:v$OCP_VER_S
    packages:
    - name: web-terminal
      channels:
      - name: fast

  additionalImages:
  - name: registry.redhat.io/rhel8/support-tools

  helm: {}
EOF
  1. 根据 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
  1. 将同步结果 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 节点上执行:

  1. 在安装好的 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}}'

在这里插入图片描述

  1. 编辑 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.yaml
  displayName: Disconnected Red Hat Catalog
  publisher: Me
  updateStrategy:
    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 集群的节点上执行以下命令:

  1. 添加 ImageContentSourcePolicy 配置。
oc apply -f oc-mirror-workspace/results-XXXXX/imageContentSourcePolicy.yaml
  1. 查看运行 cs-redhat-operator-index 的 Pod 更新情况。
oc get pod -n openshift-marketplace -w
  1. 确认新的 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

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值