10.10. 配置 Image Registry Operator 以进行镜像的本地缓存
OpenShift Container Platform 使用本地 registry 管理镜像缓存。在边缘计算用例中,集群通常会受到带宽限制,与集中式镜像 registry 通信时,这可能会导致长时间镜像下载时间。
在初始部署期间,长时间下载时间不可避免。随着时间的推移,CRI-O 会在出现意外关闭时擦除 /var/lib/containers/storage 目录的风险。要解决镜像下载时间长的问题,您可以使用 GitOps Zero Touch Provisioning (ZTP) 在远程受管集群上创建本地镜像 registry。当集群部署在网络边缘时,这非常有用。
在使用 GitOps ZTP 设置本地镜像 registry 前,您需要在用于安装远程受管集群的 SiteConfig CR 中配置磁盘分区。安装后,您可以使用 PolicyGenTemplate CR 配置本地镜像 registry。然后,GitOps ZTP 管道创建持久性卷 (PV) 和持久性卷声明(PVC) CR,并修补 imageregistry 配置。
本地镜像 registry 只能用于用户应用程序镜像,不能用于 OpenShift Container Platform 或 Operator Lifecycle Manager operator 镜像。
10.10.1. 使用 SiteConfig 配置磁盘分区 复制链接链接已复制到粘贴板!
使用 SiteConfig CR 和 GitOps Zero Touch Provisioning (ZTP) 为受管集群配置磁盘分区。SiteConfig CR 中的磁盘分区详情必须与底层磁盘匹配。
您必须在安装时完成这个步骤。
先决条件
- 安装 Butane。
流程
使用以下示例 YAML 文件创建
storage.bu文件:variant: fcos version: 1.3.0 storage: disks: - device: /dev/disk/by-path/pci-0000:01:00.0-scsi-0:2:0:01 wipe_table: false partitions: - label: var-lib-containers start_mib: <start_of_partition>2 size_mib: <partition_size>3 filesystems: - path: /var/lib/containers device: /dev/disk/by-partlabel/var-lib-containers format: xfs wipe_filesystem: true with_mount_unit: true mount_options: - defaults - prjquota运行以下命令,将
storage.bu转换为 Ignition 文件:$ butane storage.bu输出示例
{"ignition":{"version":"3.2.0"},"storage":{"disks":[{"device":"/dev/disk/by-path/pci-0000:01:00.0-scsi-0:2:0:0","partitions":[{"label":"var-lib-containers","sizeMiB":0,"startMiB":250000}],"wipeTable":false}],"filesystems":[{"device":"/dev/disk/by-partlabel/var-lib-containers","format":"xfs","mountOptions":["defaults","prjquota"],"path":"/var/lib/containers","wipeFilesystem":true}]},"systemd":{"units":[{"contents":"# # Generated by Butane\n[Unit]\nRequires=systemd-fsck@dev-disk-by\\x2dpartlabel-var\\x2dlib\\x2dcontainers.service\nAfter=systemd-fsck@dev-disk-by\\x2dpartlabel-var\\x2dlib\\x2dcontainers.service\n\n[Mount]\nWhere=/var/lib/containers\nWhat=/dev/disk/by-partlabel/var-lib-containers\nType=xfs\nOptions=defaults,prjquota\n\n[Install]\nRequiredBy=local-fs.target","enabled":true,"name":"var-lib-containers.mount"}]}}- 使用 JSON Pretty Print 等工具将输出转换为 JSON 格式。
将输出复制到
SiteConfigCR 中的.spec.clusters.nodes.ignitionConfigOverride字段中。Example
[...] spec: clusters: - nodes: - ignitionConfigOverride: | { "ignition": { "version": "3.2.0" }, "storage": { "disks": [ { "device": "/dev/disk/by-path/pci-0000:01:00.0-scsi-0:2:0:0", "partitions": [ { "label": "var-lib-containers", "sizeMiB": 0, "startMiB": 250000 } ], "wipeTable": false } ], "filesystems": [ { "device": "/dev/disk/by-partlabel/var-lib-containers", "format": "xfs", "mountOptions": [ "defaults", "prjquota" ], "path": "/var/lib/containers", "wipeFilesystem": true } ] }, "systemd": { "units": [ { "contents": "# # Generated by Butane\n[Unit]\nRequires=systemd-fsck@dev-disk-by\\x2dpartlabel-var\\x2dlib\\x2dcontainers.service\nAfter=systemd-fsck@dev-disk-by\\x2dpartlabel-var\\x2dlib\\x2dcontainers.service\n\n[Mount]\nWhere=/var/lib/containers\nWhat=/dev/disk/by-partlabel/var-lib-containers\nType=xfs\nOptions=defaults,prjquota\n\n[Install]\nRequiredBy=local-fs.target", "enabled": true, "name": "var-lib-containers.mount" } ] } } [...]注意如果
.spec.clusters.nodes.ignitionConfigOverride字段不存在,请创建它。
验证
在安装过程中,运行以下命令来在 hub 集群上验证
BareMetalHost对象显示注解:$ oc get bmh -n my-sno-ns my-sno -ojson | jq '.metadata.annotations["bmac.agent-install.openshift.io/ignition-config-overrides"]输出示例
"{\"ignition\":{\"version\":\"3.2.0\"},\"storage\":{\"disks\":[{\"device\":\"/dev/disk/by-id/wwn-0x6b07b250ebb9d0002a33509f24af1f62\",\"partitions\":[{\"label\":\"var-lib-containers\",\"sizeMiB\":0,\"startMiB\":250000}],\"wipeTable\":false}],\"filesystems\":[{\"device\":\"/dev/disk/by-partlabel/var-lib-containers\",\"format\":\"xfs\",\"mountOptions\":[\"defaults\",\"prjquota\"],\"path\":\"/var/lib/containers\",\"wipeFilesystem\":true}]},\"systemd\":{\"units\":[{\"contents\":\"# Generated by Butane\\n[Unit]\\nRequires=systemd-fsck@dev-disk-by\\\\x2dpartlabel-var\\\\x2dlib\\\\x2dcontainers.service\\nAfter=systemd-fsck@dev-disk-by\\\\x2dpartlabel-var\\\\x2dlib\\\\x2dcontainers.service\\n\\n[Mount]\\nWhere=/var/lib/containers\\nWhat=/dev/disk/by-partlabel/var-lib-containers\\nType=xfs\\nOptions=defaults,prjquota\\n\\n[Install]\\nRequiredBy=local-fs.target\",\"enabled\":true,\"name\":\"var-lib-containers.mount\"}]}}"安装后,检查单节点 OpenShift 磁盘状态。
运行以下命令,在单节点 OpenShift 节点上进入 debug 会话。
此步骤被实例化为一个名为
<node_name>-debug的 debug pod:$ oc debug node/my-sno-node运行以下命令,将
/host设置为 debug shell 中的根目录。debug pod 在 pod 中的
/host中挂载主机的 root 文件系统。将根目录改为/host,您可以运行主机可执行路径中包含的二进制文件:# chroot /host运行以下命令,列出所有可用块设备的信息:
# lsblk输出示例
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 446.6G 0 disk ├─sda1 8:1 0 1M 0 part ├─sda2 8:2 0 127M 0 part ├─sda3 8:3 0 384M 0 part /boot ├─sda4 8:4 0 243.6G 0 part /var │ /sysroot/ostree/deploy/rhcos/var │ /usr │ /etc │ / │ /sysroot └─sda5 8:5 0 202.5G 0 part /var/lib/containers运行以下命令,显示文件系统磁盘空间使用情况的信息:
# df -h输出示例
Filesystem Size Used Avail Use% Mounted on devtmpfs 4.0M 0 4.0M 0% /dev tmpfs 126G 84K 126G 1% /dev/shm tmpfs 51G 93M 51G 1% /run /dev/sda4 244G 5.2G 239G 3% /sysroot tmpfs 126G 4.0K 126G 1% /tmp /dev/sda5 203G 119G 85G 59% /var/lib/containers /dev/sda3 350M 110M 218M 34% /boot tmpfs 26G 0 26G 0% /run/user/1000
10.10.2. 使用 PolicyGenTemplate CR 配置镜像 registry 复制链接链接已复制到粘贴板!
使用 PolicyGenTemplate (PGT) CR 应用配置镜像 registry 所需的 CR 并对 imageregistry 配置进行补丁。
先决条件
- 您已在受管集群中配置了磁盘分区。
-
已安装 OpenShift CLI(
oc)。 -
已以具有
cluster-admin权限的用户身份登录到 hub 集群。 - 您已创建了 Git 存储库,在其中管理自定义站点配置数据以用于 GitOps Zero Touch Provisioning (ZTP)。
流程
在适当的
PolicyGenTemplateCR 中配置存储类、持久性卷声明、持久性卷和镜像 registry 配置。例如,要配置单个站点,请将以下 YAML 添加到文件example-sno-site.yaml中:sourceFiles: # storage class - fileName: StorageClass.yaml policyName: "sc-for-image-registry" metadata: name: image-registry-sc annotations: ran.openshift.io/ztp-deploy-wave: "100"1 # persistent volume claim - fileName: StoragePVC.yaml policyName: "pvc-for-image-registry" metadata: name: image-registry-pvc namespace: openshift-image-registry annotations: ran.openshift.io/ztp-deploy-wave: "100" spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi storageClassName: image-registry-sc volumeMode: Filesystem # persistent volume - fileName: ImageRegistryPV.yaml2 policyName: "pv-for-image-registry" metadata: annotations: ran.openshift.io/ztp-deploy-wave: "100" - fileName: ImageRegistryConfig.yaml policyName: "config-for-image-registry" complianceType: musthave metadata: annotations: ran.openshift.io/ztp-deploy-wave: "100" spec: storage: pvc: claim: "image-registry-pvc"重要不要为
- fileName: ImageRegistryConfig.yaml配置设置complianceType: mustonlyhave。这可能导致 registry pod 部署失败。-
提交 Git 中的
PolicyGenTemplate更改,然后推送到由 GitOps ZTP Argo CD 应用程序监控的 Git 存储库。
验证
使用以下步骤排除受管集群中本地镜像 registry 的错误:
在登录到受管集群时,验证是否成功登录到 registry。运行以下命令:
导出受管集群名称:
$ cluster=<managed_cluster_name>获取受管集群
kubeconfig详情:$ oc get secret -n $cluster $cluster-admin-password -o jsonpath='{.data.password}' | base64 -d > kubeadmin-password-$cluster下载并导出集群
kubeconfig:$ oc get secret -n $cluster $cluster-admin-kubeconfig -o jsonpath='{.data.kubeconfig}' | base64 -d > kubeconfig-$cluster && export KUBECONFIG=./kubeconfig-$cluster- 验证从受管集群访问镜像 registry。请参阅"访问 registry"。
检查
imageregistry.operator.openshift.io组实例的ConfigCRD 是否没有报告错误。登录到受管集群时运行以下命令:$ oc get image.config.openshift.io cluster -o yaml输出示例
apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" release.openshift.io/create-only: "true" creationTimestamp: "2021-10-08T19:02:39Z" generation: 5 name: cluster resourceVersion: "688678648" uid: 0406521b-39c0-4cda-ba75-873697da75a4 spec: additionalTrustedCA: name: acm-ice检查受管集群上的
PersistentVolumeClaim是否填充了数据。登录到受管集群时运行以下命令:$ oc get pv image-registry-sc检查
registry*pod 是否正在运行,并位于openshift-image-registry命名空间下。$ oc get pods -n openshift-image-registry | grep registry*输出示例
cluster-image-registry-operator-68f5c9c589-42cfg 1/1 Running 0 8d image-registry-5f8987879-6nx6h 1/1 Running 0 8d检查受管集群中的磁盘分区是否正确:
为受管集群打开默认 shell:
$ oc debug node/sno-1.example.com运行
lsblk以检查主机磁盘分区:sh-4.4# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 446.6G 0 disk |-sda1 8:1 0 1M 0 part |-sda2 8:2 0 127M 0 part |-sda3 8:3 0 384M 0 part /boot |-sda4 8:4 0 336.3G 0 part /sysroot `-sda5 8:5 0 100.1G 0 part /var/imageregistry1 sdb 8:16 0 446.6G 0 disk sr0 11:0 1 104M 0 rom- 1
/var/imageregistry表示磁盘已被正确分区。