8.3. 关于 on-cluster 镜像模式
您可以通过创建 MachineOSConfig 自定义资源(CR)来使用 OpenShift on-cluster 构建过程的镜像模式将自定义分层镜像应用到节点,如 "Using On-cluster image mode to apply a custom layered image" 所述。
在创建对象时,Machine Config Operator (MCO) 会创建一个 MachineOSBuild 对象和 builder pod。此过程还会创建临时对象,如配置映射,这些对象会在构建完成后进行清理。MachineOSBuild 对象和相关 builder github pod 使用相同的命名方案 <MachineOSConfig_CR_name>-<hash>,例如:
MachineOSBuild 对象示例
NAME PREPARED BUILDING SUCCEEDED INTERRUPTED FAILED
layered-image-c8765e26ebc87e1e17a7d6e0a78e8bae False False True False False
builder pod 示例
NAME READY STATUS RESTARTS AGE
build-layered-image-c8765e26ebc87e1e17a7d6e0a78e8bae 2/2 Running 0 11m
您不需要与这些新对象或 machine-os-builder pod 交互。但是,如果需要,您可以使用所有这些资源进行故障排除。
构建完成后,MCO 将新的自定义分层镜像推送到仓库,并应用到关联的机器配置池中的节点。您可以在 MachineOSConfig 对象中看到新自定义分层镜像的摘要镜像拉取 spec。现在,这是此 MachineOSConfig 的活跃镜像拉取规格。
摘要镜像拉取规格示例
apiVersion: machineconfiguration.openshift.io/v1
kind: MachineOSConfig
metadata:
annotations:
machineconfiguration.openshift.io/current-machine-os-build: layered-9a8f89455246fa0c42ecee6ff1fa1a45
labels:
machineconfiguration.openshift.io/createdByOnClusterBuildsHelper: ""
name: layered-image
# ...
status:
currentImagePullSpec: image-registry.openshift-image-registry.svc:5000/openshift-machine-config-operator/os-image@sha256:3c8fc667adcb432ce0c83581f16086afec08a961dd28fed69bb6bad6db0a0754
您可以使用包含非生产环境节点的自定义机器配置池,测试 MachineOSBuild 对象,以确保它在不将自定义分层镜像部署到活跃节点的情况下正确构建。另外,您可以使用没有节点的自定义机器配置池。即使没有 MCO 的节点将自定义分层镜像部署到其中,MachineOSBuild 对象也会构建。
您可以将自定义分层镜像应用到集群中的任何机器配置池,包括 control plane、worker 或自定义池。
对于单节点 OpenShift 集群,您只能将自定义分层镜像应用到 control plane 节点。
对 MachineOSConfig 对象进行某些更改会触发关联的自定义分层镜像自动重建。您可以通过暂停应用自定义分层镜像的机器配置池来缓解重建的影响,如"使用机器配置池"中所述。当池暂停时,MCO 在构建完成后不会向节点推出新构建的镜像。但是,无论池是否暂停,构建仍会运行。例如,如果要删除并替换 MachineOSCOnfig 对象,请在进行更改前暂停机器配置池,防止 MCO 将关联的节点恢复到基础镜像,从而减少所需的重启数量。
当机器配置池暂停时,oc get machineconfigpools 会报告以下状态:
输出示例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE
master rendered-master-a0b404d061a6183cc36d302363422aba True False False 3 3 3 0 4h14m
worker rendered-worker-221507009cbcdec0eec8ab3ccd789d18 False False False 2 2 2 0 4h14m
- 1
worker机器配置池已暂停,由三个False状态和READYMACHINECOUNT为0表示。
推出更改后,您可以取消暂停机器配置池。
如果构建失败,例如因为网络问题或无效的 secret,MCO 会在作业失败前重试构建三次。MCO 为每个构建尝试创建不同的构建 pod。您可以使用构建 pod 日志排除任何构建失败。但请注意,MCO 会在短时间内自动删除这些构建 pod。
失败的 MachineOSBuild 对象示例
NAME PREPARED BUILDING SUCCEEDED INTERRUPTED FAILED AGE
layered-image-c8765e26ebc87e1e17a7d6e0a78e8bae False False False False True 12m
您可以通过修改 MachineOSConfig 对象或将注解应用到 MachineOSConfig 对象来手动重建自定义层次镜像。如需更多信息,请参阅"重新构建集群自定义分层镜像"。
如果您使用自定义机器配置池将集群分层镜像应用到节点,您可以从节点中删除自定义分层镜像,并恢复到基础镜像。如需更多信息,请参阅"恢复集群分层节点"。
您可以通过编辑 MachineOSConfig 对象来修改 on-custom 分层镜像,安装附加软件包、删除现有软件包、更改仓库、更新 secret 或其他类似的更改。如需更多信息,请参阅"修改自定义分层镜像"。
8.3.1. On-cluster 镜像模式已知限制 复制链接链接已复制到粘贴板!
在使用集群层功能时请注意以下限制:
- 在多架构计算机器上不支持 on-cluster 镜像模式。
-
不支持在同一机器配置池中使用多个
MachineOSConfig对象。对于您要使用不同的自定义分层镜像的每个机器配置池,您需要单独的MachineOSConfigCR。 - 如果您扩展使用自定义分层镜像的机器集,节点会重新引导两次。首先,节点最初使用基础镜像创建,第二次应用自定义分层镜像时。
使用自定义分层镜像的节点上不支持节点中断策略。因此,以下配置更改会导致节点重新引导:
-
修改
/var或/etc目录中的配置文件 - 添加或修改 systemd 服务
- 更改 SSH 密钥
-
从
ICSP、ITMS和IDMS对象中删除镜像规则 -
通过更新
openshift-config命名空间中的user-ca-bundleconfigmap 来更改可信 CA
-
修改
-
创建自定义分层镜像中使用的镜像在推送 registry 中占用空间。始终注意 registry 中的可用空间,并根据需要修剪镜像。您可以通过删除创建镜像的
MachineOSBuild对象,从仓库自动删除 on-cluster 自定义分层镜像。请注意,registry push secret 提供的凭证还必须授予从 registry 中删除镜像的权限。如需更多信息,请参阅"删除集群自定义分层镜像"。
8.3.2. 使用 on-cluster 镜像模式应用自定义分层镜像 复制链接链接已复制到粘贴板!
要使用 on-cluster 构建过程将自定义分层镜像应用到集群,请创建一个 MachineOSConfig 自定义资源 (CR) 来指定以下参数:
- 要构建的 Containerfile
- 关联构建的机器配置池
- 应该推送和拉取最终镜像的位置
- 要使用的推送和 pull secret
您只能为每个机器配置池创建一个 MachineOSConfig CR。
先决条件
-
在
openshift-machine-config-operator命名空间中具有 Machine Config Operator (MCO) 所需的 pull secret,以便从存储库拉取基础操作系统镜像。默认情况下,MCO 使用集群全局 pull secret,它将同步到openshift-machine-config-operator命名空间中。您可以将 pull secret 添加到 OpenShift Container Platform 全局 pull secret 中,也可以使用不同的 pull secret。有关修改全局 pull secret 的详情,请参考"更新全局集群 pull secret"。 具有 MCO 将新的自定义分层镜像推送到的 registry 的推送 secret。secret 提供的凭证还必须授予从 registry 中删除镜像的权限。
注意在断开连接的环境中,确保断开连接的集群可以访问您要推送镜像的 registry。Image mirroring 仅适用于拉取镜像。
- 您有一个 pull secret,节点需要从 registry 中拉取新的自定义分层镜像。这应该与用于将镜像推送到存储库的 secret 不同。
- 您熟悉如何配置 Containerfile。有关如何创建 Containerfile 的说明超出了本文档的范围。
- 可选:为要应用自定义分层镜像的节点有单独的机器配置池。为具有自定义机器配置池的节点具有其中一个好处,您可以根据需要轻松恢复到基础镜像。如需更多信息,请参阅"恢复集群分层节点"。
流程
创建
MachineOSconfig对象:创建一个类似以下示例的 YAML 文件:
apiVersion: machineconfiguration.openshift.io/v11 kind: MachineOSConfig metadata: name: layered-image2 spec: machineConfigPool: name: layered-image3 containerFile:4 - containerfileArch: NoArch5 content: |- FROM configs AS final RUN dnf install -y cowsay && \ dnf clean all && \ ostree container commit imageBuilder:6 imageBuilderType: Job baseImagePullSecret:7 name: global-pull-secret-copy renderedImagePushSpec: image-registry.openshift-image-registry.svc:5000/openshift/os-image:latest8 renderedImagePushSecret:9 name: builder-dockercfg-mtcl23- 1
- 指定
MachineConfigCR 所需的machineconfiguration.openshift.io/v1API。 - 2
- 指定
MachineOSConfig对象的名称。名称必须与关联的机器配置池的名称匹配。此名称与其他 on-cluster 镜像模式资源一起使用。本文档中的示例使用名称layered-image。 - 3
- 指定与要部署自定义分层镜像的节点关联的机器配置池的名称。本文档中的示例使用
layered-image机器配置池。 - 4
- 指定用于配置自定义分层镜像的 Containerfile。
- 5
- 指定此容器文件要针对的构架:
ARM64,AMD64,PPC64LE,S390X, 或NoArch。默认值为NoArch,它定义了一个可应用于任何架构的 Containerfile。 - 6
- 指定要使用的镜像构建器的名称。这必须是
Job,这是对管理镜像构建的job对象的引用。 - 7
- 可选:指定 MCO 从 registry 中拉取基础操作系统镜像的 pull secret 名称。默认情况下使用全局 pull secret。
- 8
- 指定要将新构建的自定义分层镜像推送到的镜像 registry。这可以是集群可以访问的任何 registry,格式为
host[:port][/namespace]/name或svc_name.namespace.svc[:port]/repository/name:<tag>格式。本例使用内部 OpenShift Container Platform registry。如果集群被正确配置为使用镜像 registry,您可以指定镜像 registry。 - 9
- 指定 MCO 将新构建的自定义分层镜像推送到该 registry 的推送 secret 名称。
创建
MachineOSConfig对象:$ oc create -f <filename>.yaml
如果需要,当
MachineOSBuild对象被创建且处于READY状态时,修改您要使用新自定义分层镜像的节点 spec:运行以下命令,检查
MachineOSBuild对象是否已就绪:$ oc get machineosbuild当
SUCCEEDED值为True时,构建已完成:显示
MachineOSBuild对象已就绪的输出示例NAME PREPARED BUILDING SUCCEEDED INTERRUPTED FAILED AGE layered-image-ad5a3cad36303c363cf458ab0524e7c0-builder False False True False False 43s通过为
MachineOSConfig对象中指定的机器配置池添加标签来编辑您要部署自定义分层镜像的节点:$ oc label node <node_name> 'node-role.kubernetes.io/<mcp_name>='其中:
- node-role.kubernetes.io/<mcp_name>=
- 指定用于标识用于部署自定义分层镜像的节点选择器。
当您保存更改时,MCO 会排空、封锁并重启节点。重新引导后,节点将使用新的自定义分层镜像。
验证
运行以下命令验证新 pod 是否已就绪:
$ oc get pods -n openshift-machine-config-operator输出示例
NAME READY STATUS RESTARTS AGE build-layered-image-ad5a3cad36303c363cf458ab0524e7c0-hxrws 2/2 Running 0 2m40s1 # ... machine-os-builder-6fb66cfb99-zcpvq 1/1 Running 0 2m42s2 运行以下命令,验证分层构建的当前阶段:
$ oc get machineosbuilds输出示例
NAME PREPARED BUILDING SUCCEEDED INTERRUPTED FAILED AGE layered-image-ad5a3cad36303c363cf458ab0524e7c0 False True False False False 12m1 - 1
MachineOSBuild以<MachineOSConfig_CR_name>-<hash>格式命名。
运行以下命令,验证
MachineOSConfig对象是否包含对新自定义分层镜像的引用:$ oc describe machineosconfig <object_name>摘要镜像拉取规格示例
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineOSConfig metadata: annotations: machineconfiguration.openshift.io/current-machine-os-build: layered-9a8f89455246fa0c42ecee6ff1fa1a45 labels: machineconfiguration.openshift.io/createdByOnClusterBuildsHelper: "" name: layered-image # ... status: currentImagePullSpec: image-registry.openshift-image-registry.svc:5000/openshift-machine-config-operator/os-image@sha256:3c8fc667adcb432ce0c83581f16086afec08a961dd28fed69bb6bad6db0a07541 - 1
- 新自定义分层镜像的摘要镜像拉取 spec。
验证适当的节点是否使用新的自定义分层镜像:
运行以下命令,以 root 用户身份为 control plane 节点启动一个 debug 会话:
$ oc debug node/<node_name>将
/host设置为 debug shell 中的根目录:sh-4.4# chroot /host运行
rpm-ostree status命令,以查看自定义分层镜像正在使用:sh-5.1# rpm-ostree status输出示例
# ... Deployments: * ostree-unverified-registry:image-registry.openshift-image-registry.svc:5000/openshift-machine-config-operator/os-images@sha256:3c8fc667adcb432ce0c83581f16086afec08a961dd28fed69bb6bad6db0a0754 Digest: sha256:3c8fc667adcb432ce0c83581f16086afec08a961dd28fed69bb6bad6db0a07541 Version: 419.94.202502100215-0 (2025-02-12T19:20:44Z)- 1
- 新自定义分层镜像的摘要镜像拉取 spec。
8.3.3. 修改集群自定义分层镜像 复制链接链接已复制到粘贴板!
您可以根据需要修改集群自定义分层镜像。这可让您安装附加软件包、删除现有软件包、更改拉取或推送仓库、更新 secret 或其他类似的更改。您可以编辑 MachineOSConfig 对象,将更改应用到创建 MachineOSConfig 对象的 YAML 文件,或为该目的创建新的 YAML 文件。
如果您修改并应用 MachineOSConfig 对象 YAML 或创建新的 YAML 文件,YAML 会覆盖您直接对 MachineOSConfig 对象本身所做的任何更改。
对 MachineOSConfig 对象进行某些更改会触发关联的自定义分层镜像自动重建。您可以通过暂停应用自定义分层镜像的机器配置池来缓解重建的影响,如"使用机器配置池"中所述。当池暂停时,MCO 在构建完成后不会向节点推出新构建的镜像。但是,无论池是否暂停,构建仍会运行。例如,如果要删除并替换 MachineOSCOnfig 对象,请在进行更改前暂停机器配置池,防止 MCO 将关联的节点恢复到基础镜像,从而减少所需的重启数量。
当机器配置池暂停时,oc get machineconfigpools 会报告以下状态:
输出示例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE
master rendered-master-a0b404d061a6183cc36d302363422aba True False False 3 3 3 0 4h14m
worker rendered-worker-221507009cbcdec0eec8ab3ccd789d18 False False False 2 2 2 0 4h14m
- 1
worker机器配置池已暂停,由三个False状态和READYMACHINECOUNT为0表示。
推出更改后,您可以取消暂停机器配置池。
先决条件
-
您可以通过创建
MachineOSConfig对象来选择 on-cluster 镜像模式。
流程
修改对象以更新关联的自定义分层镜像:
编辑
MachineOSConfig对象以修改自定义分层镜像。以下示例将rngd守护进程添加到已具有使用自定义分层镜像安装的 tree 软件包的节点。apiVersion: machineconfiguration.openshift.io/v1 kind: MachineOSConfig metadata: name: layered-image spec: machineConfigPool: name: layered-image containerFile: - containerfileArch: noarch content: |-1 FROM configs AS final RUN rpm-ostree install rng-tools && \ systemctl enable rngd && \ rpm-ostree cleanup -m && \ ostree container commit RUN rpm-ostree install tree && \ ostree container commit imageBuilder: imageBuilderType: PodImageBuilder baseImagePullSecret: name: global-pull-secret-copy2 renderedImagePushspec: image-registry.openshift-image-registry.svc:5000/openshift-machine-config-operator/os-images:latest3 renderedImagePushSecret:4 name: new-secret-name当您保存更改时,MCO 会排空、封锁并重启节点。重启后,节点使用集群基本 Red Hat Enterprise Linux CoreOS (RHCOS) 镜像。如果您的更改仅修改 secret,则不会触发新构建,且不会执行重启。
验证
使用以下命令验证新的
MachineOSBuild对象是否已创建:$ oc get machineosbuild输出示例
NAME PREPARED BUILDING SUCCEEDED INTERRUPTED FAILED AGE layered-image-a5457b883f5239cdcb71b57e1a30b6ef False False True False False 4d17h layered-image-f91f0f5593dd337d89bf4d38c877590b False True False False False 2m41s1 - 1
BUILDING列中的值True表示MachineOSBuild对象正在构建。当SUCCEEDED列报告True时,构建已完成。
您可以使用以下命令观察新机器配置是否已应用到节点:
$ oc get machineconfigpools输出示例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-a0b404d061a6183cc36d302363422aba True False False 3 3 3 0 3h38m worker rendered-worker-221507009cbcdec0eec8ab3ccd789d18 False True False 2 2 2 0 3h38m1 - 1
UPDATED列中的值FALSE表示MachineOSBuild对象正在构建。当UPDATED列报告FALSE时,新的自定义分层镜像已应用到节点。
当节点重新处于
Ready状态时,检查是否应用了更改:运行以下命令,打开节点的
oc debug会话:$ oc debug node/<node_name>运行以下命令,将
/host设置为 debug shell 中的根目录:sh-5.1# chroot /host使用适当的命令来验证是否应用了更改。以下示例显示安装了
rngd守护进程:sh-5.1# rpm -qa |grep rng-tools输出示例
rng-tools-6.17-3.fc41.x86_64sh-5.1# rngd -v输出示例
rngd 6.16
其他资源
8.3.4. 重建集群自定义分层镜像 复制链接链接已复制到粘贴板!
如果要重建集群自定义分层镜像时,您可以修改 MachineOSConfig 对象,或向 MachineOSConfig 对象添加注解。这两个操作都触发对象自动重建。例如,如果您更改 Containerfile 或需要更新机器配置中的 osimageurl 位置,您可以执行重建。
添加注解后,Machine Config Operator (MCO)会删除当前的 MachineOSBuild 对象,并在该位置创建一个新 MachineOSBuild 对象。构建过程完成后,MCO 会自动删除注解。
先决条件
-
您可以通过创建
MachineOSConfig对象来选择集群镜像模式。
流程
编辑
MachineOSConfig对象,使用以下命令添加machineconfiguration.openshift.io/rebuild注解:$ oc edit MachineOSConfig <object_name>MachineOSConfig对象示例apiVersion: machineconfiguration.openshift.io/v1 kind: MachineOSConfig metadata: annotations: machineconfiguration.openshift.io/current-machine-os-build: layering-c26d4a003432df70ee66c83981144cfa machineconfiguration.openshift.io/rebuild: ""1 # ... name: layered-image # ...- 1
- 添加此注解以触发自定义分层镜像的重新构建。
验证
使用以下命令检查
MachineOSBuild对象是否已构建:$ oc get machineosbuild输出示例
NAME PREPARED BUILDING SUCCEEDED INTERRUPTED FAILED AGE layered-image-d6b929a29c6dbfa8e4007c8069a2fd08 False True False False False 2m41s1 - 1
BUILDING列中的值True表示MachineOSBuild对象正在构建。
编辑
MachineOSConfig对象,使用以下命令验证 MCO 是否删除了machineconfiguration.openshift.io/rebuild注解:$ oc edit MachineOSConfig <object_name>MachineOSConfig对象示例apiVersion: machineconfiguration.openshift.io/v1 kind: MachineOSConfig metadata: annotations: machineconfiguration.openshift.io/current-machine-os-build: layering-c26d4a003432df70ee66c83981144cfa # ... name: layered-image # ...
8.3.5. 恢复集群自定义分层镜像 复制链接链接已复制到粘贴板!
如果您将 on-cluster 分层镜像应用到自定义机器配置池(MCP)中的节点,您可以从节点中删除自定义分层镜像,并恢复到基础镜像。
要恢复节点,请通过从节点中删除自定义机器配置池标签从自定义 MCP 中删除节点。删除标签后,Machine Config Operator (MCO)使用集群基本 Red Hat Enterprise Linux CoreOS (RHCOS)镜像重启节点,覆盖自定义分层镜像。
在删除标签前,请确保节点与另一个 MCP 关联。
先决条件
-
您可以通过创建
MachineOSConfig对象来选择 On-cluster 镜像模式。 -
您已将
MachineOSConfig对象应用到自定义机器配置池中的节点。
流程
使用以下命令从节点中删除该标签:
$ oc label node/<node_name> node-role.kubernetes.io/<mcp_name>-当您保存更改时,MCO 会排空、封锁并重启节点。重启后,节点使用集群基本 Red Hat Enterprise Linux CoreOS (RHCOS) 镜像。
验证
通过执行以下任一方式来验证自定义层次镜像是否已移除:
检查 worker 机器配置池是否使用以前的机器配置更新:
$ oc get mcp输出示例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE layered rendered-layered-e8c8bc1de69777325003e80bc0c04b82 True False False 0 0 0 0 4h20m1 master rendered-master-50d7bc27ee8b9ca2250383f0647ade7f True False False 3 3 3 0 5h39m worker rendered-worker-e8c8bc1de69777325003e80bc0c04b82 True False False 3 3 3 0 5h39m2 检查节点以查看是否禁用了在节点上调度。这表示要应用更改:
$ oc get nodes输出示例
NAME STATUS ROLES AGE VERSION ip-10-0-148-79.us-west-1.compute.internal Ready worker 32m v1.32.3 ip-10-0-155-125.us-west-1.compute.internal Ready,SchedulingDisabled worker 35m v1.32.3 ip-10-0-170-47.us-west-1.compute.internal Ready control-plane,master 42m v1.32.3 ip-10-0-174-77.us-west-1.compute.internal Ready control-plane,master 42m v1.32.3 ip-10-0-211-49.us-west-1.compute.internal Ready control-plane,master 42m v1.32.3 ip-10-0-218-151.us-west-1.compute.internal Ready worker 31m v1.32.3当节点重新处于
Ready状态时,检查该节点是否使用基础镜像:打开节点的
oc debug会话。例如:$ oc debug node/ip-10-0-155-125.us-west-1.compute.internal将
/host设置为 debug shell 中的根目录:sh-4.4# chroot /host运行
rpm-ostree status命令,以查看基础镜像正在使用:sh-4.4# rpm-ostree status输出示例
State: idle Deployments: * ostree-unverified-registry:registry.build05.ci.openshift.org/ci-ln-qd0hmqk/stable@sha256:a8bd32573f787f6d1c23e1d669abbefd1e31339826d06e750c0ca632ad6c414f Digest: sha256:a8bd32573f787f6d1c23e1d669abbefd1e31339826d06e750c0ca632ad6c414f Version: 419.96.202501202201-0 (2025-01-20T22:06:13Z)
8.3.6. 删除集群自定义分层镜像 复制链接链接已复制到粘贴板!
要防止自定义分层镜像在 registry 中占用过量空间,您可以通过删除创建镜像的 MachineOSBuild 对象来从仓库自动删除 on-cluster 自定义分层镜像。
您添加到 MachineOSBuild 对象的 registry push secret 提供的凭证必须授予从 registry 中删除镜像的权限。如果没有提供 delete 权限,则在删除 MachineOSBuild 对象时不会删除镜像。
如果镜像当前在节点上使用,或者节点需要,则自定义分层镜像不会被删除,如 machineconfiguration.openshift.io/currentImage 或 machineconfiguration.openshift.io/desiredImage 注解,在创建 MachineOSConfig 对象时添加到节点。