×

在带宽受限的环境中,如果您使用 GitOps 零接触配置 (ZTP) 解决方案部署大量集群,则需要避免下载引导和安装 OpenShift Container Platform 所需的所有镜像。远程单节点 OpenShift 站点的带宽受限会导致部署时间过长。factory-precaching-cli 工具允许您在将服务器运送到远程站点进行 ZTP 配置之前预先准备服务器。

factory-precaching-cli 工具执行以下操作

  • 下载最小 ISO 启动所需的 RHCOS 根文件系统镜像。

  • 从标记为data的安装磁盘创建分区。

  • 在 xfs 中格式化磁盘。

  • 在磁盘末尾创建一个 GUID 分区表 (GPT) 数据分区,其中分区大小可由工具配置。

  • 复制安装 OpenShift Container Platform 所需的容器镜像。

  • 复制 ZTP 安装 OpenShift Container Platform 所需的容器镜像。

  • 可选:将 Day-2 Operators 复制到分区。

factory-precaching-cli 工具仅为技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且可能功能不完整。Red Hat 不建议在生产环境中使用它们。这些功能提供对即将推出的产品功能的早期访问,使客户能够在开发过程中测试功能并提供反馈。

有关 Red Hat 技术预览功能的支持范围的更多信息,请参阅技术预览功能支持范围

获取 factory-precaching-cli 工具

factory-precaching-cli 工具 Go 二进制文件可在the {rds-first} tools 容器镜像中公开获取。容器镜像中的 factory-precaching-cli 工具 Go 二进制文件使用podman在运行 RHCOS 实时映像的服务器上执行。如果您在断开连接的环境中工作或拥有私有注册表,则需要将镜像复制到那里,以便您可以将镜像下载到服务器。

步骤
  • 通过运行以下命令拉取 factory-precaching-cli 工具镜像

    # podman pull quay.io/openshift-kni/telco-ran-tools:latest
验证
  • 要检查工具是否可用,请查询 factory-precaching-cli 工具 Go 二进制文件的当前版本

    # podman run quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli -v
    示例输出
    factory-precaching-cli version 20221018.120852+main.feecf17

从实时操作系统映像启动

您可以使用 factory-precaching-cli 工具引导仅有一个磁盘可用且无法将外部磁盘驱动器连接到服务器的服务器。

当磁盘即将写入 RHCOS 镜像时,RHCOS 需要磁盘未被使用。

根据服务器硬件,您可以使用以下方法之一在空白服务器上挂载 RHCOS 实时 ISO

  • 在 Dell 服务器上使用 Dell RACADM 工具。

  • 在 HP 服务器上使用 HPONCFG 工具。

  • 使用 Redfish BMC API。

建议自动化挂载过程。要自动化此过程,您需要拉取所需的镜像并将它们托管在本地 HTTP 服务器上。

先决条件
  • 您已启动主机。

  • 您具有到主机的网络连接。

步骤

此示例过程使用 Redfish BMC API 挂载 RHCOS 实时 ISO。

  1. 挂载 RHCOS 实时 ISO

    1. 检查虚拟介质状态

      $ curl --globoff -H "Content-Type: application/json" -H \
      "Accept: application/json" -k -X GET --user ${username_password} \
      https://$BMC_ADDRESS/redfish/v1/Managers/Self/VirtualMedia/1 | python -m json.tool
    2. 将 ISO 文件作为虚拟介质挂载

      $ curl --globoff -L -w "%{http_code} %{url_effective}\\n" -ku ${username_password} -H "Content-Type: application/json" -H "Accept: application/json" -d '{"Image": "http://[$HTTPd_IP]/RHCOS-live.iso"}' -X POST https://$BMC_ADDRESS/redfish/v1/Managers/Self/VirtualMedia/1/Actions/VirtualMedia.InsertMedia
    3. 将引导顺序设置为一次从虚拟介质引导

      $ curl --globoff  -L -w "%{http_code} %{url_effective}\\n"  -ku ${username_password}  -H "Content-Type: application/json" -H "Accept: application/json" -d '{"Boot":{ "BootSourceOverrideEnabled": "Once", "BootSourceOverrideTarget": "Cd", "BootSourceOverrideMode": "UEFI"}}' -X PATCH https://$BMC_ADDRESS/redfish/v1/Systems/Self
  2. 重新引导并确保服务器正在从虚拟介质引导。

其他资源

分区磁盘

要运行完整的预缓存过程,您必须从实时 ISO 引导,并使用容器映像中的 factory-precaching-cli 工具来分区和预缓存所有必需的工件。

需要实时 ISO 或 RHCOS 实时 ISO,因为在预配过程中将操作系统 (RHCOS) 写入设备时,磁盘不能被使用。使用此过程也可以启用单磁盘服务器。

先决条件
  • 您有一个未分区的磁盘。

  • 您可以访问 quay.io/openshift-kni/telco-ran-tools:latest 镜像。

  • 您有足够的存储空间来安装 OpenShift Container Platform 并预缓存所需的镜像。

步骤
  1. 验证磁盘是否已清除

    # lsblk
    示例输出
    NAME    MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    loop0     7:0    0  93.8G  0 loop /run/ephemeral
    loop1     7:1    0 897.3M  1 loop /sysroot
    sr0      11:0    1   999M  0 rom  /run/media/iso
    nvme0n1 259:1    0   1.5T  0 disk
  2. 从设备中擦除任何文件系统、RAID 或分区表签名。

    # wipefs -a /dev/nvme0n1
    示例输出
    /dev/nvme0n1: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54
    /dev/nvme0n1: 8 bytes were erased at offset 0x1749a955e00 (gpt): 45 46 49 20 50 41 52 54
    /dev/nvme0n1: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa

如果磁盘不为空,则工具会失败,因为它使用设备的分区号 1 来预缓存工件。

创建分区

设备准备就绪后,您可以创建一个单分区和一个 GPT 分区表。分区会自动标记为 data 并创建在设备的末尾。否则,分区将被 coreos-installer 覆盖。

coreos-installer 要求分区创建在设备的末尾,并标记为 data。这两个要求对于在将 RHCOS 映像写入磁盘时保存分区都是必要的。

先决条件
  • 由于要格式化主机设备,因此容器必须以 privileged 权限运行。

  • 您必须挂载 /dev 文件夹,以便可以在容器内执行此过程。

步骤

在以下示例中,分区大小为 250 GiB,这是为了允许预缓存 Day 2 Operators 的 DU 配置文件。

  1. privileged 权限运行容器并对磁盘进行分区

    # podman run -v /dev:/dev --privileged \
    --rm quay.io/openshift-kni/telco-ran-tools:latest -- \
    factory-precaching-cli partition \ (1)
    -d /dev/nvme0n1 \ (2)
    -s 250 (3)
    
    1 指定 factory-precaching-cli 工具的分区功能。
    2 定义磁盘上的根目录。
    3 定义磁盘大小(以 GB 为单位)。
  2. 检查存储信息

    # lsblk
    示例输出
    NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    loop0         7:0    0  93.8G  0 loop /run/ephemeral
    loop1         7:1    0 897.3M  1 loop /sysroot
    sr0          11:0    1   999M  0 rom  /run/media/iso
    nvme0n1     259:1    0   1.5T  0 disk
    └─nvme0n1p1 259:3    0   250G  0 part
验证

您必须验证是否满足以下要求

  • 设备具有 GPT 分区表

  • 分区使用设备的最新扇区。

  • 分区已正确标记为 data

查询磁盘状态以验证磁盘是否按预期进行分区

# gdisk -l /dev/nvme0n1
示例输出
GPT fdisk (gdisk) version 1.0.3

Partition table scan:
  MBR: protective
  BSD: not present
  APM: not present
  GPT: present

Found valid GPT with protective MBR; using GPT.
Disk /dev/nvme0n1: 3125627568 sectors, 1.5 TiB
Model: Dell Express Flash PM1725b 1.6TB SFF
Sector size (logical/physical): 512/512 bytes
Disk identifier (GUID): CB5A9D44-9B3C-4174-A5C1-C64957910B61
Partition table holds up to 128 entries
Main partition table begins at sector 2 and ends at sector 33
First usable sector is 34, last usable sector is 3125627534
Partitions will be aligned on 2048-sector boundaries
Total free space is 2601338846 sectors (1.2 TiB)

Number  Start (sector)    End (sector)  Size       Code  Name
   1      2601338880      3125627534   250.0 GiB   8300  data

挂载分区

验证磁盘已正确分区后,您可以将设备挂载到 /mnt

建议将设备挂载到 /mnt,因为在 GitOps ZTP 准备期间会使用该挂载点。

  1. 验证分区是否格式化为 xfs

    # lsblk -f /dev/nvme0n1
    示例输出
    NAME        FSTYPE LABEL UUID                                 MOUNTPOINT
    nvme0n1
    └─nvme0n1p1 xfs          1bee8ea4-d6cf-4339-b690-a76594794071
  2. 挂载分区

    # mount /dev/nvme0n1p1 /mnt/
验证
  • 检查分区是否已挂载

    # lsblk
    示例输出
    NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    loop0         7:0    0  93.8G  0 loop /run/ephemeral
    loop1         7:1    0 897.3M  1 loop /sysroot
    sr0          11:0    1   999M  0 rom  /run/media/iso
    nvme0n1     259:1    0   1.5T  0 disk
    └─nvme0n1p1 259:2    0   250G  0 part /var/mnt (1)
    
    1 挂载点是 /var/mnt,因为 RHCOS 中的 /mnt 文件夹是 /var/mnt 的链接。

下载镜像

factory-precaching-cli 工具允许您将以下镜像下载到已分区的服务器

  • OpenShift Container Platform 镜像

  • 5G RAN 站点分布式单元 (DU) 配置文件中包含的操作符镜像

  • 来自断开连接的注册表的操作符镜像

可用操作符镜像的列表在不同的 OpenShift Container Platform 版本中可能有所不同。

使用并行工作器下载

factory-precaching-cli 工具使用并行工作器同时下载多个镜像。您可以使用 --parallel-p 选项配置工作器的数量。默认数量设置为服务器可用 CPU 的 80%。

您的登录 shell 可能限制为一部分 CPU,这会减少容器可用的 CPU。要删除此限制,您可以使用 taskset 0xffffffff 在命令前加上,例如

# taskset 0xffffffff podman run --rm quay.io/openshift-kni/telco-ran-tools:latest factory-precaching-cli download --help

准备下载 OpenShift Container Platform 镜像

要下载 OpenShift Container Platform 容器镜像,您需要知道多集群引擎版本。当您使用 --du-profile 标志时,您还需要指定将在要预配单节点 OpenShift 的 hub 集群中运行的 Red Hat Advanced Cluster Management (RHACM) 版本。

先决条件
  • 您已安装 RHACM 和多集群引擎 Operator。

  • 您已对存储设备进行分区。

  • 您在已分区的设备上有足够的镜像空间。

  • 您已将裸机服务器连接到互联网。

  • 您拥有有效的拉取密钥。

步骤
  1. 通过在 hub 集群中运行以下命令来检查 RHACM 版本和多集群引擎版本

    $ oc get csv -A | grep -i advanced-cluster-management
    示例输出
    open-cluster-management                            advanced-cluster-management.v2.6.3           Advanced Cluster Management for Kubernetes   2.6.3                 advanced-cluster-management.v2.6.3                Succeeded
    $ oc get csv -A | grep -i multicluster-engine
    示例输出
    multicluster-engine                                cluster-group-upgrades-operator.v0.0.3       cluster-group-upgrades-operator              0.0.3                                                                   Pending
    multicluster-engine                                multicluster-engine.v2.1.4                   multicluster engine for Kubernetes           2.1.4                 multicluster-engine.v2.0.3                        Succeeded
    multicluster-engine                                openshift-gitops-operator.v1.5.7             Red Hat OpenShift GitOps                     1.5.7                 openshift-gitops-operator.v1.5.6-0.1664915551.p   Succeeded
    multicluster-engine                                openshift-pipelines-operator-rh.v1.6.4       Red Hat OpenShift Pipelines                  1.6.4                 openshift-pipelines-operator-rh.v1.6.3            Succeeded
  2. 要访问容器注册表,请将有效的拉取密钥复制到要安装的服务器。

    1. 创建 .docker 文件夹

      $ mkdir /root/.docker
    2. 将有效的拉取密钥(在 config.json 文件中)复制到先前创建的 .docker/ 文件夹。

      $ cp config.json /root/.docker/config.json (1)
      1 /root/.docker/config.jsonpodman 检查注册表登录凭据的默认路径。

如果您使用不同的注册表来拉取所需的工件,则需要复制正确的拉取密钥。如果本地注册表使用 TLS,则还需要包含注册表的证书。

下载 OpenShift Container Platform 镜像

factory-precaching-cli 工具允许您预缓存预配特定 OpenShift Container Platform 版本所需的所有容器镜像。

步骤
  • 通过运行以下命令来预缓存发行版

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools -- \
       factory-precaching-cli download \ (1)
       -r 4.17.0 \ (2)
       --acm-version 2.6.3 \ (3)
       --mce-version 2.1.4 \ (4)
       -f /mnt \ (5)
       --img quay.io/custom/repository (6)
    
    1 指定 factory-precaching-cli 工具的下载功能。
    2 定义 OpenShift Container Platform 发行版版本。
    3 定义 RHACM 版本。
    4 定义多集群引擎版本。
    5 定义要在磁盘上下载镜像的文件夹。
    6 可选。定义存储额外镜像的存储库。这些镜像将下载并预缓存到磁盘上。
    示例输出
    Generated /mnt/imageset.yaml
    Generating list of pre-cached artifacts...
    Processing artifact [1/176]: ocp-v4.0-art-dev@sha256_6ac2b96bf4899c01a87366fd0feae9f57b1b61878e3b5823da0c3f34f707fbf5
    Processing artifact [2/176]: ocp-v4.0-art-dev@sha256_f48b68d5960ba903a0d018a10544ae08db5802e21c2fa5615a14fc58b1c1657c
    Processing artifact [3/176]: ocp-v4.0-art-dev@sha256_a480390e91b1c07e10091c3da2257180654f6b2a735a4ad4c3b69dbdb77bbc06
    Processing artifact [4/176]: ocp-v4.0-art-dev@sha256_ecc5d8dbd77e326dba6594ff8c2d091eefbc4d90c963a9a85b0b2f0e6155f995
    Processing artifact [5/176]: ocp-v4.0-art-dev@sha256_274b6d561558a2f54db08ea96df9892315bb773fc203b1dbcea418d20f4c7ad1
    Processing artifact [6/176]: ocp-v4.0-art-dev@sha256_e142bf5020f5ca0d1bdda0026bf97f89b72d21a97c9cc2dc71bf85050e822bbf
    ...
    Processing artifact [175/176]: ocp-v4.0-art-dev@sha256_16cd7eda26f0fb0fc965a589e1e96ff8577e560fcd14f06b5fda1643036ed6c8
    Processing artifact [176/176]: ocp-v4.0-art-dev@sha256_cf4d862b4a4170d4f611b39d06c31c97658e309724f9788e155999ae51e7188f
    ...
    Summary:
    
    Release:                            4.17.0
    Hub Version:                        2.6.3
    ACM Version:                        2.6.3
    MCE Version:                        2.1.4
    Include DU Profile:                 No
    Workers:                            83
验证
  • 检查服务器的目标文件夹中所有镜像是否都已压缩。

    $ ls -l /mnt (1)
    1 建议您在 /mnt 文件夹中预缓存镜像。
    示例输出
    -rw-r--r--. 1 root root  136352323 Oct 31 15:19 ocp-v4.0-art-dev@sha256_edec37e7cd8b1611d0031d45e7958361c65e2005f145b471a8108f1b54316c07.tgz
    -rw-r--r--. 1 root root  156092894 Oct 31 15:33 ocp-v4.0-art-dev@sha256_ee51b062b9c3c9f4fe77bd5b3cc9a3b12355d040119a1434425a824f137c61a9.tgz
    -rw-r--r--. 1 root root  172297800 Oct 31 15:29 ocp-v4.0-art-dev@sha256_ef23d9057c367a36e4a5c4877d23ee097a731e1186ed28a26c8d21501cd82718.tgz
    -rw-r--r--. 1 root root  171539614 Oct 31 15:23 ocp-v4.0-art-dev@sha256_f0497bb63ef6834a619d4208be9da459510df697596b891c0c633da144dbb025.tgz
    -rw-r--r--. 1 root root  160399150 Oct 31 15:20 ocp-v4.0-art-dev@sha256_f0c339da117cde44c9aae8d0bd054bceb6f19fdb191928f6912a703182330ac2.tgz
    -rw-r--r--. 1 root root  175962005 Oct 31 15:17 ocp-v4.0-art-dev@sha256_f19dd2e80fb41ef31d62bb8c08b339c50d193fdb10fc39cc15b353cbbfeb9b24.tgz
    -rw-r--r--. 1 root root  174942008 Oct 31 15:33 ocp-v4.0-art-dev@sha256_f1dbb81fa1aa724e96dd2b296b855ff52a565fbef003d08030d63590ae6454df.tgz
    -rw-r--r--. 1 root root  246693315 Oct 31 15:31 ocp-v4.0-art-dev@sha256_f44dcf2c94e4fd843cbbf9b11128df2ba856cd813786e42e3da1fdfb0f6ddd01.tgz
    -rw-r--r--. 1 root root  170148293 Oct 31 15:00 ocp-v4.0-art-dev@sha256_f48b68d5960ba903a0d018a10544ae08db5802e21c2fa5615a14fc58b1c1657c.tgz
    -rw-r--r--. 1 root root  168899617 Oct 31 15:16 ocp-v4.0-art-dev@sha256_f5099b0989120a8d08a963601214b5c5cb23417a707a8624b7eb52ab788a7f75.tgz
    -rw-r--r--. 1 root root  176592362 Oct 31 15:05 ocp-v4.0-art-dev@sha256_f68c0e6f5e17b0b0f7ab2d4c39559ea89f900751e64b97cb42311a478338d9c3.tgz
    -rw-r--r--. 1 root root  157937478 Oct 31 15:37 ocp-v4.0-art-dev@sha256_f7ba33a6a9db9cfc4b0ab0f368569e19b9fa08f4c01a0d5f6a243d61ab781bd8.tgz
    -rw-r--r--. 1 root root  145535253 Oct 31 15:26 ocp-v4.0-art-dev@sha256_f8f098911d670287826e9499806553f7a1dd3e2b5332abbec740008c36e84de5.tgz
    -rw-r--r--. 1 root root  158048761 Oct 31 15:40 ocp-v4.0-art-dev@sha256_f914228ddbb99120986262168a705903a9f49724ffa958bb4bf12b2ec1d7fb47.tgz
    -rw-r--r--. 1 root root  167914526 Oct 31 15:37 ocp-v4.0-art-dev@sha256_fa3ca9401c7a9efda0502240aeb8d3ae2d239d38890454f17fe5158b62305010.tgz
    -rw-r--r--. 1 root root  164432422 Oct 31 15:24 ocp-v4.0-art-dev@sha256_fc4783b446c70df30b3120685254b40ce13ba6a2b0bf8fb1645f116cf6a392f1.tgz
    -rw-r--r--. 1 root root  306643814 Oct 31 15:11 troubleshoot@sha256_b86b8aea29a818a9c22944fd18243fa0347c7a2bf1ad8864113ff2bb2d8e0726.tgz

下载 Operator 镜像

您还可以预缓存在 5G 无线电接入网络 (RAN) 分布式单元 (DU) 集群配置中使用的 Day-2 Operators。Day-2 Operators 依赖于已安装的 OpenShift Container Platform 版本。

您需要使用 --acm-version--mce-version 标志包含 RHACM hub 和多集群引擎 Operator 版本,以便 factory-precaching-cli 工具可以为 RHACM 和多集群引擎 Operator 预缓存相应的容器镜像。

步骤
  • 预缓存 Operator 镜像

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download \ (1)
       -r 4.17.0 \ (2)
       --acm-version 2.6.3 \ (3)
       --mce-version 2.1.4 \ (4)
       -f /mnt \ (5)
       --img quay.io/custom/repository (6)
       --du-profile -s (7)
    
    1 指定 factory-precaching-cli 工具的下载功能。
    2 定义 OpenShift Container Platform 发行版版本。
    3 定义 RHACM 版本。
    4 定义多集群引擎版本。
    5 定义要在磁盘上下载镜像的文件夹。
    6 可选。定义存储额外镜像的存储库。这些镜像将下载并预缓存到磁盘上。
    7 指定预缓存DU配置中包含的操作符。
    示例输出
    Generated /mnt/imageset.yaml
    Generating list of pre-cached artifacts...
    Processing artifact [1/379]: ocp-v4.0-art-dev@sha256_7753a8d9dd5974be8c90649aadd7c914a3d8a1f1e016774c7ac7c9422e9f9958
    Processing artifact [2/379]: ose-kube-rbac-proxy@sha256_c27a7c01e5968aff16b6bb6670423f992d1a1de1a16e7e260d12908d3322431c
    Processing artifact [3/379]: ocp-v4.0-art-dev@sha256_370e47a14c798ca3f8707a38b28cfc28114f492bb35fe1112e55d1eb51022c99
    ...
    Processing artifact [378/379]: ose-local-storage-operator@sha256_0c81c2b79f79307305e51ce9d3837657cf9ba5866194e464b4d1b299f85034d0
    Processing artifact [379/379]: multicluster-operators-channel-rhel8@sha256_c10f6bbb84fe36e05816e873a72188018856ad6aac6cc16271a1b3966f73ceb3
    ...
    Summary:
    
    Release:                            4.17.0
    Hub Version:                        2.6.3
    ACM Version:                        2.6.3
    MCE Version:                        2.1.4
    Include DU Profile:                 Yes
    Workers:                            83

在脱机环境中预缓存自定义镜像

--generate-imageset 参数在生成 ImageSetConfiguration 自定义资源 (CR) 后停止 factory-precaching-cli 工具。这允许您在下载任何镜像之前自定义 ImageSetConfiguration CR。自定义 CR 后,您可以使用 --skip-imageset 参数下载在 ImageSetConfiguration CR 中指定的镜像。

您可以通过以下方式自定义 ImageSetConfiguration CR:

  • 添加操作符和附加镜像

  • 删除操作符和附加镜像

  • 将操作符和目录源更改为本地或脱机注册表

步骤
  1. 预缓存镜像

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download \ (1)
       -r 4.17.0 \ (2)
       --acm-version 2.6.3 \ (3)
       --mce-version 2.1.4 \ (4)
       -f /mnt \ (5)
       --img quay.io/custom/repository (6)
       --du-profile -s \ (7)
       --generate-imageset (8)
    
    1 指定 factory-precaching-cli 工具的下载功能。
    2 定义 OpenShift Container Platform 发行版版本。
    3 定义 RHACM 版本。
    4 定义多集群引擎版本。
    5 定义要在磁盘上下载镜像的文件夹。
    6 可选。定义存储额外镜像的存储库。这些镜像将下载并预缓存到磁盘上。
    7 指定预缓存DU配置中包含的操作符。
    8 --generate-imageset 参数仅生成 ImageSetConfiguration CR,允许您自定义 CR。
    示例输出
    Generated /mnt/imageset.yaml
    ImageSetConfiguration CR 示例
    apiVersion: mirror.openshift.io/v1alpha2
    kind: ImageSetConfiguration
    mirror:
      platform:
        channels:
        - name: stable-4.17
          minVersion: 4.17.0 (1)
          maxVersion: 4.17.0
      additionalImages:
        - name: quay.io/custom/repository
      operators:
        - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.17
          packages:
            - name: advanced-cluster-management (2)
              channels:
                 - name: 'release-2.6'
                   minVersion: 2.6.3
                   maxVersion: 2.6.3
            - name: multicluster-engine (2)
              channels:
                 - name: 'stable-2.1'
                   minVersion: 2.1.4
                   maxVersion: 2.1.4
            - name: local-storage-operator (3)
              channels:
                - name: 'stable'
            - name: ptp-operator (3)
              channels:
                - name: 'stable'
            - name: sriov-network-operator (3)
              channels:
                - name: 'stable'
            - name: cluster-logging (3)
              channels:
                - name: 'stable'
            - name: lvms-operator (3)
              channels:
                - name: 'stable-4.17'
            - name: amq7-interconnect-operator (3)
              channels:
                - name: '1.10.x'
            - name: bare-metal-event-relay (3)
              channels:
                - name: 'stable'
        - catalog: registry.redhat.io/redhat/certified-operator-index:v4.17
          packages:
            - name: sriov-fec (3)
              channels:
                - name: 'stable'
    1 平台版本与传递给工具的版本匹配。
    2 RHACM 和多集群引擎操作符的版本与传递给工具的版本匹配。
    3 CR 包含所有指定的 DU 操作符。
  2. 自定义 CR 中的目录资源

    apiVersion: mirror.openshift.io/v1alpha2
    kind: ImageSetConfiguration
    mirror:
      platform:
    [...]
      operators:
        - catalog: eko4.cloud.lab.eng.bos.redhat.com:8443/redhat/certified-operator-index:v4.17
          packages:
            - name: sriov-fec
              channels:
                - name: 'stable'

    使用本地或脱机注册表下载镜像时,必须首先添加要从中拉取内容的注册表的证书。

  3. 为避免任何错误,请将注册表证书复制到您的服务器。

    # cp /tmp/eko4-ca.crt /etc/pki/ca-trust/source/anchors/.
  4. 然后,更新证书信任库。

    # update-ca-trust
  5. 将主机 /etc/pki 文件夹挂载到 factory-cli 镜像。

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker -v /etc/pki:/etc/pki --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- \
    factory-precaching-cli download \ (1)
       -r 4.17.0 \ (2)
       --acm-version 2.6.3 \ (3)
       --mce-version 2.1.4 \ (4)
       -f /mnt \ (5)
       --img quay.io/custom/repository (6)
       --du-profile -s \ (7)
       --skip-imageset (8)
    
    1 指定 factory-precaching-cli 工具的下载功能。
    2 定义 OpenShift Container Platform 发行版版本。
    3 定义 RHACM 版本。
    4 定义多集群引擎版本。
    5 定义要在磁盘上下载镜像的文件夹。
    6 可选。定义存储额外镜像的存储库。这些镜像将下载并预缓存到磁盘上。
    7 指定预缓存DU配置中包含的操作符。
    8 --skip-imageset 参数允许您下载在自定义的 ImageSetConfiguration CR 中指定的镜像。
  6. 下载镜像而不生成新的 imageSetConfiguration CR

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download -r 4.17.0 \
    --acm-version 2.6.3 --mce-version 2.1.4 -f /mnt \
    --img quay.io/custom/repository \
    --du-profile -s \
    --skip-imageset
其他资源

在 GitOps ZTP 中预缓存镜像

SiteConfig 清单定义了如何安装和配置 OpenShift 集群。在 GitOps 零接触配置 (ZTP) 配置工作流中,factory-precaching-cli 工具需要在 SiteConfig 清单中添加以下字段:

  • clusters.ignitionConfigOverride

  • nodes.installerArgs

  • nodes.ignitionConfigOverride

包含附加字段的 SiteConfig 示例
apiVersion: ran.openshift.io/v1
kind: SiteConfig
metadata:
  name: "example-5g-lab"
  namespace: "example-5g-lab"
spec:
  baseDomain: "example.domain.redhat.com"
  pullSecretRef:
    name: "assisted-deployment-pull-secret"
  clusterImageSetNameRef: "img4.9.10-x86-64-appsub" (1)
  sshPublicKey: "ssh-rsa ..."
  clusters:
  - clusterName: "sno-worker-0"
    clusterImageSetNameRef: "eko4-img4.11.5-x86-64-appsub" (2)
    clusterLabels:
      group-du-sno: ""
      common-411: true
      sites : "example-5g-lab"
      vendor: "OpenShift"
    clusterNetwork:
      - cidr: 10.128.0.0/14
        hostPrefix: 23
    machineNetwork:
      - cidr: 10.19.32.192/26
    serviceNetwork:
      - 172.30.0.0/16
    networkType: "OVNKubernetes"
    additionalNTPSources:
      - clock.corp.redhat.com
    ignitionConfigOverride:
      '{
        "ignition": {
          "version": "3.1.0"
        },
        "systemd": {
          "units": [
            {
              "name": "var-mnt.mount",
              "enabled": true,
              "contents": "[Unit]\nDescription=Mount partition with artifacts\nBefore=precache-images.service\nBindsTo=precache-images.service\nStopWhenUnneeded=true\n\n[Mount]\nWhat=/dev/disk/by-partlabel/data\nWhere=/var/mnt\nType=xfs\nTimeoutSec=30\n\n[Install]\nRequiredBy=precache-images.service"
            },
            {
              "name": "precache-images.service",
              "enabled": true,
              "contents": "[Unit]\nDescription=Extracts the precached images in discovery stage\nAfter=var-mnt.mount\nBefore=agent.service\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/var/mnt\nExecStart=bash /usr/local/bin/extract-ai.sh\n#TimeoutStopSec=30\n\n[Install]\nWantedBy=multi-user.target default.target\nWantedBy=agent.service"
            }
          ]
        },
        "storage": {
          "files": [
            {
              "overwrite": true,
              "path": "/usr/local/bin/extract-ai.sh",
              "mode": 755,
              "user": {
                "name": "root"
              },
              "contents": {
                "source": "data:,%23%21%2Fbin%2Fbash%0A%0AFOLDER%3D%22%24%7BFOLDER%3A-%24%28pwd%29%7D%22%0AOCP_RELEASE_LIST%3D%22%24%7BOCP_RELEASE_LIST%3A-ai-images.txt%7D%22%0ABINARY_FOLDER%3D%2Fvar%2Fmnt%0A%0Apushd%20%24FOLDER%0A%0Atotal_copies%3D%24%28sort%20-u%20%24BINARY_FOLDER%2F%24OCP_RELEASE_LIST%20%7C%20wc%20-l%29%20%20%23%20Required%20to%20keep%20track%20of%20the%20pull%20task%20vs%20total%0Acurrent_copy%3D1%0A%0Awhile%20read%20-r%20line%3B%0Ado%0A%20%20uri%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%241%7D%27%29%0A%20%20%23tar%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%242%7D%27%29%0A%20%20podman%20image%20exists%20%24uri%0A%20%20if%20%5B%5B%20%24%3F%20-eq%200%20%5D%5D%3B%20then%0A%20%20%20%20%20%20echo%20%22Skipping%20existing%20image%20%24tar%22%0A%20%20%20%20%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20%20%20%20%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%0A%20%20%20%20%20%20continue%0A%20%20fi%0A%20%20tar%3D%24%28echo%20%22%24uri%22%20%7C%20%20rev%20%7C%20cut%20-d%20%22%2F%22%20-f1%20%7C%20rev%20%7C%20tr%20%22%3A%22%20%22_%22%29%0A%20%20tar%20zxvf%20%24%7Btar%7D.tgz%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-f%20%24%7Btar%7D.gz%3B%20fi%0A%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20skopeo%20copy%20dir%3A%2F%2F%24%28pwd%29%2F%24%7Btar%7D%20containers-storage%3A%24%7Buri%7D%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-rf%20%24%7Btar%7D%3B%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%3B%20fi%0Adone%20%3C%20%24%7BBINARY_FOLDER%7D%2F%24%7BOCP_RELEASE_LIST%7D%0A%0A%23%20workaround%20while%20https%3A%2F%2Fgithub.com%2Fopenshift%2Fassisted-service%2Fpull%2F3546%0A%23cp%20%2Fvar%2Fmnt%2Fmodified-rhcos-4.10.3-x86_64-metal.x86_64.raw.gz%20%2Fvar%2Ftmp%2F.%0A%0Aexit%200"
              }
            },
            {
              "overwrite": true,
              "path": "/usr/local/bin/agent-fix-bz1964591",
              "mode": 755,
              "user": {
                "name": "root"
              },
              "contents": {
                "source": "data:,%23%21%2Fusr%2Fbin%2Fsh%0A%0A%23%20This%20script%20is%20a%20workaround%20for%20bugzilla%201964591%20where%20symlinks%20inside%20%2Fvar%2Flib%2Fcontainers%2F%20get%0A%23%20corrupted%20under%20some%20circumstances.%0A%23%0A%23%20In%20order%20to%20let%20agent.service%20start%20correctly%20we%20are%20checking%20here%20whether%20the%20requested%0A%23%20container%20image%20exists%20and%20in%20case%20%22podman%20images%22%20returns%20an%20error%20we%20try%20removing%20the%20faulty%0A%23%20image.%0A%23%0A%23%20In%20such%20a%20scenario%20agent.service%20will%20detect%20the%20image%20is%20not%20present%20and%20pull%20it%20again.%20In%20case%0A%23%20the%20image%20is%20present%20and%20can%20be%20detected%20correctly%2C%20no%20any%20action%20is%20required.%0A%0AIMAGE%3D%24%28echo%20%241%20%7C%20sed%20%27s%2F%3A.%2A%2F%2F%27%29%0Apodman%20image%20exists%20%24IMAGE%20%7C%7C%20echo%20%22already%20loaded%22%20%7C%7C%20echo%20%22need%20to%20be%20pulled%22%0A%23podman%20images%20%7C%20grep%20%24IMAGE%20%7C%7C%20podman%20rmi%20--force%20%241%20%7C%7C%20true"
              }
            }
          ]
        }
      }'
    nodes:
      - hostName: "snonode.sno-worker-0.example.domain.redhat.com"
        role: "master"
        bmcAddress: "idrac-virtualmedia+https://10.19.28.53/redfish/v1/Systems/System.Embedded.1"
        bmcCredentialsName:
          name: "worker0-bmh-secret"
        bootMACAddress: "e4:43:4b:bd:90:46"
        bootMode: "UEFI"
        rootDeviceHints:
          deviceName: /dev/disk/by-path/pci-0000:01:00.0-scsi-0:2:0:0
        installerArgs: '["--save-partlabel", "data"]'
        ignitionConfigOverride: |
           {
            "ignition": {
              "version": "3.1.0"
            },
            "systemd": {
              "units": [
                {
                  "name": "var-mnt.mount",
                  "enabled": true,
                  "contents": "[Unit]\nDescription=Mount partition with artifacts\nBefore=precache-ocp-images.service\nBindsTo=precache-ocp-images.service\nStopWhenUnneeded=true\n\n[Mount]\nWhat=/dev/disk/by-partlabel/data\nWhere=/var/mnt\nType=xfs\nTimeoutSec=30\n\n[Install]\nRequiredBy=precache-ocp-images.service"
                },
                {
                  "name": "precache-ocp-images.service",
                  "enabled": true,
                  "contents": "[Unit]\nDescription=Extracts the precached OCP images into containers storage\nAfter=var-mnt.mount\nBefore=machine-config-daemon-pull.service nodeip-configuration.service\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/var/mnt\nExecStart=bash /usr/local/bin/extract-ocp.sh\nTimeoutStopSec=60\n\n[Install]\nWantedBy=multi-user.target"
                }
              ]
            },
            "storage": {
              "files": [
                {
                  "overwrite": true,
                  "path": "/usr/local/bin/extract-ocp.sh",
                  "mode": 755,
                  "user": {
                    "name": "root"
                  },
                  "contents": {
                    "source": "data:,%23%21%2Fbin%2Fbash%0A%0AFOLDER%3D%22%24%7BFOLDER%3A-%24%28pwd%29%7D%22%0AOCP_RELEASE_LIST%3D%22%24%7BOCP_RELEASE_LIST%3A-ocp-images.txt%7D%22%0ABINARY_FOLDER%3D%2Fvar%2Fmnt%0A%0Apushd%20%24FOLDER%0A%0Atotal_copies%3D%24%28sort%20-u%20%24BINARY_FOLDER%2F%24OCP_RELEASE_LIST%20%7C%20wc%20-l%29%20%20%23%20Required%20to%20keep%20track%20of%20the%20pull%20task%20vs%20total%0Acurrent_copy%3D1%0A%0Awhile%20read%20-r%20line%3B%0Ado%0A%20%20uri%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%241%7D%27%29%0A%20%20%23tar%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%242%7D%27%29%0A%20%20podman%20image%20exists%20%24uri%0A%20%20if%20%5B%5B%20%24%3F%20-eq%200%20%5D%5D%3B%20then%0A%20%20%20%20%20%20echo%20%22Skipping%20existing%20image%20%24tar%22%0A%20%20%20%20%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20%20%20%20%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%0A%20%20%20%20%20%20continue%0A%20%20fi%0A%20%20tar%3D%24%28echo%20%22%24uri%22%20%7C%20%20rev%20%7C%20cut%20-d%20%22%2F%22%20-f1%20%7C%20rev%20%7C%20tr%20%22%3A%22%20%22_%22%29%0A%20%20tar%20zxvf%20%24%7Btar%7D.tgz%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-f%20%24%7Btar%7D.gz%3B%20fi%0A%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20skopeo%20copy%20dir%3A%2F%2F%24%28pwd%29%2F%24%7Btar%7D%20containers-storage%3A%24%7Buri%7D%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-rf%20%24%7Btar%7D%3B%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%3B%20fi%0Adone%20%3C%20%24%7BBINARY_FOLDER%7D%2F%24%7BOCP_RELEASE_LIST%7D%0A%0Aexit%200"
                  }
                }
              ]
            }
           }
        nodeNetwork:
          config:
            interfaces:
              - name: ens1f0
                type: ethernet
                state: up
                macAddress: "AA:BB:CC:11:22:33"
                ipv4:
                  enabled: true
                  dhcp: true
                ipv6:
                  enabled: false
          interfaces:
            - name: "ens1f0"
              macAddress: "AA:BB:CC:11:22:33"
1 指定用于部署的集群镜像集,除非您在 spec.clusters.clusterImageSetNameRef 字段中指定了不同的镜像集。
2 指定用于部署单个集群的集群镜像集。如果已定义,它将覆盖站点级别的 spec.clusterImageSetNameRef

理解 clusters.ignitionConfigOverride 字段

clusters.ignitionConfigOverride 字段在 GitOps ZTP 发现阶段添加 Ignition 格式的配置。此配置包括挂载在虚拟介质中的 ISO 中的 systemd 服务。这样,脚本就成为发现 RHCOS 实时 ISO 的一部分,并且可以用于加载 Assisted Installer (AI) 镜像。

systemd 服务

systemd 服务为 var-mnt.mountprecache-images.servicesprecache-images.service 依赖于 var-mnt.mount 单元在 /var/mnt 中挂载的磁盘分区。该服务调用名为 extract-ai.sh 的脚本。

extract-ai.sh

extract-ai.sh 脚本从磁盘分区提取并加载所需的镜像到本地容器存储。脚本成功完成时,您可以本地使用这些镜像。

agent-fix-bz1964591

agent-fix-bz1964591 脚本是针对 AI 问题的解决方法。为了防止 AI 删除镜像(这可能会强制 agent.service 再次从注册表拉取镜像),agent-fix-bz1964591 脚本检查请求的容器镜像是否存在。

理解 nodes.installerArgs 字段

nodes.installerArgs 字段允许您配置 coreos-installer 实用程序如何将 RHCOS 实时 ISO 写入磁盘。您需要指示保存标记为 data 的磁盘分区,因为在 OpenShift Container Platform 安装阶段需要保存在 data 分区中的工件。

额外的参数直接传递给将 RHCOS 实时系统写入磁盘的 coreos-installer 实用程序。在下一次重新引导时,操作系统将从磁盘启动。

您可以将多个选项传递给 coreos-installer 实用程序。

OPTIONS:
...
    -u, --image-url <URL>
            Manually specify the image URL

    -f, --image-file <path>
            Manually specify a local image file

    -i, --ignition-file <path>
            Embed an Ignition config from a file

    -I, --ignition-url <URL>
            Embed an Ignition config from a URL
...
        --save-partlabel <lx>...
            Save partitions with this label glob

        --save-partindex <id>...
            Save partitions with this number or range
...
        --insecure-ignition
            Allow Ignition URL without HTTPS or hash

理解 nodes.ignitionConfigOverride 字段

clusters.ignitionConfigOverride 类似,nodes.ignitionConfigOverride 字段允许在 OpenShift Container Platform 安装阶段向 coreos-installer 实用程序添加 Ignition 格式的配置。当 RHCOS 写入磁盘时,GitOps ZTP 发现 ISO 中包含的额外配置将不再可用。在发现阶段,额外配置存储在实时操作系统的内存中。

在此阶段,提取和加载的容器镜像数量大于发现阶段。根据 OpenShift Container Platform 版本以及您是否安装了 Day-2 操作符,安装时间可能会有所不同。

在安装阶段,将使用 var-mnt.mountprecache-ocp.services systemd 服务。

precache-ocp.service

precache-ocp.service 依赖于 var-mnt.mount 单元在 /var/mnt 中挂载的磁盘分区。precache-ocp.service 服务调用名为 extract-ocp.sh 的脚本。

要在 OpenShift Container Platform 安装之前提取所有镜像,必须在执行 machine-config-daemon-pull.servicenodeip-configuration.service 服务之前执行 precache-ocp.service

extract-ocp.sh

extract-ocp.sh 脚本从磁盘分区提取并加载所需的镜像到本地容器存储。

SiteConfig 和可选的 PolicyGeneratorPolicyGenTemplate 自定义资源 (CR) 提交到 Argo CD 正在监视的 Git 仓库后,您可以通过将 CR 与中心集群同步来启动 GitOps ZTP 工作流。

排查“渲染的目录无效”错误

使用本地或脱机注册表下载镜像时,您可能会看到 渲染的目录无效 错误。这意味着您缺少要从中拉取内容的新注册表的证书。

factory-precaching-cli 工具镜像基于 UBI RHEL 镜像构建。证书路径和位置在 RHCOS 上相同。

错误示例
Generating list of pre-cached artifacts...
error: unable to run command oc-mirror -c /mnt/imageset.yaml file:///tmp/fp-cli-3218002584/mirror --ignore-history --dry-run: Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/publish
Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/v2
Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/charts
Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/release-signatures
backend is not configured in /mnt/imageset.yaml, using stateless mode
backend is not configured in /mnt/imageset.yaml, using stateless mode
No metadata detected, creating new workspace
level=info msg=trying next host error=failed to do request: Head "https://eko4.cloud.lab.eng.bos.redhat.com:8443/v2/redhat/redhat-operator-index/manifests/v4.11": x509: certificate signed by unknown authority host=eko4.cloud.lab.eng.bos.redhat.com:8443

The rendered catalog is invalid.

Run "oc-mirror list operators --catalog CATALOG-NAME --package PACKAGE-NAME" for more information.

error: error rendering new refs: render reference "eko4.cloud.lab.eng.bos.redhat.com:8443/redhat/redhat-operator-index:v4.11": error resolving name : failed to do request: Head "https://eko4.cloud.lab.eng.bos.redhat.com:8443/v2/redhat/redhat-operator-index/manifests/v4.11": x509: certificate signed by unknown authority
步骤
  1. 将注册表证书复制到您的服务器。

    # cp /tmp/eko4-ca.crt /etc/pki/ca-trust/source/anchors/.
  2. 更新证书信任库。

    # update-ca-trust
  3. 将主机 /etc/pki 文件夹挂载到 factory-cli 镜像。

    # podman run -v /mnt:/mnt -v /root/.docker:/root/.docker -v /etc/pki:/etc/pki --privileged -it --rm quay.io/openshift-kni/telco-ran-tools:latest -- \
    factory-precaching-cli download -r 4.17.0 --acm-version 2.5.4 \
       --mce-version 2.0.4 -f /mnt \--img quay.io/custom/repository
       --du-profile -s --skip-imageset