7.3. 使用 on-cluster 层应用自定义分层镜像
要使用集群构建过程将自定义分层镜像应用到集群,请创建一个 MachineOSConfig
自定义资源,其中包含 Containerfile、机器配置池引用、存储库推送和 pull secret 和其他参数,如先决条件中所述。
在创建对象时,Machine Config Operator (MCO) 会创建一个 MachineOSBuild
对象和 machine-os-builder
pod。构建过程还会创建临时对象,如配置映射,这些对象会在构建完成后进行清理。
构建完成后,MCO 将新的自定义分层镜像推送到您的存储库中,以便在部署新节点时使用。您可以在 MachineOSBuild
对象和 machine-os-builder
pod 中看到新自定义分层镜像的摘要镜像拉取 spec。
您不需要与这些新对象或 machine-os-builder
pod 交互。但是,如果需要,您可以使用所有这些资源进行故障排除。
您要使用自定义分层镜像的每个机器配置池需要单独的 MachineOSConfig
CR。
集群镜像分层只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
先决条件
-
已使用功能门启用
TechPreviewNoUpgrade
功能集。如需更多信息,请参阅“使用功能门启用功能”。 -
在 MCO 需要拉取基本操作系统镜像的
openshift-machine-config-operator
命名空间中有 pull secret。 - 具有 MCO 需要将新的自定义分层镜像推送到 registry 所需的推送 secret。
- 您有一个 pull secret,节点需要从 registry 中拉取新的自定义分层镜像。这应该与用于将镜像推送到存储库的 secret 不同。
- 您熟悉如何配置 Containerfile。有关如何创建 Containerfile 的说明超出了本文档的范围。
- 可选:为要应用自定义分层镜像的节点有单独的机器配置池。
流程
创建
machineOSconfig
对象:创建一个类似以下示例的 YAML 文件:
apiVersion: machineconfiguration.openshift.io/v1alpha1 kind: MachineOSConfig metadata: name: layered spec: machineConfigPool: name: <mcp_name> 1 buildInputs: containerFile: 2 - containerfileArch: noarch content: |- FROM configs AS final RUN rpm-ostree install cowsay && \ ostree container commit imageBuilder: 3 imageBuilderType: PodImageBuilder baseImagePullSecret: 4 name: global-pull-secret-copy renderedImagePushspec: image-registry.openshift-image-registry.svc:5000/openshift/os-image:latest 5 renderedImagePushSecret: 6 name: builder-dockercfg-7lzwl buildOutputs: 7 currentImagePullSecret: name: builder-dockercfg-7lzwl
- 1
- 指定与要部署自定义分层镜像的节点关联的机器配置池的名称。
- 2
- 指定用于配置自定义分层镜像的 Containerfile。
- 3
- 指定要使用的镜像构建器的名称。这必须是
PodImageBuilder
。 - 4
- 指定 MCO 从 registry 中拉取基础操作系统镜像的 pull secret 名称。
- 5
- 指定要将新构建的自定义分层镜像推送到的镜像 registry。这可以是集群可访问的任何 registry。本例使用内部 OpenShift Container Platform registry。
- 6
- 指定 MCO 将新构建的自定义分层镜像推送到该 registry 的推送 secret 名称。
- 7
- 指定镜像 registry 所需的 secret,节点需要拉取新构建的自定义分层镜像。这应该与用于将镜像推送到存储库的 secret 不同。
创建
MachineOSConfig
对象:$ oc create -f <file_name>.yaml
如果需要,当
MachineOSBuild
对象被创建且处于READY
状态时,修改您要使用新自定义分层镜像的节点 spec:检查
MachineOSBuild
对象是否为READY
。当SUCCEEDED
值为True
时,构建已完成。$ oc get machineosbuild
显示
MachineOSBuild
对象已就绪的输出示例NAME PREPARED BUILDING SUCCEEDED INTERRUPTED FAILED layered-rendered-layered-ad5a3cad36303c363cf458ab0524e7c0-builder False False True False False
通过为
MachineOSConfig
对象中指定的机器配置池添加标签来编辑您要部署自定义分层镜像的节点:$ oc label node <node_name> 'node-role.kubernetes.io/<mcp_name>='
其中:
- node-role.kubernetes.io/<mcp_name>=
- 指定用于标识用于部署自定义分层镜像的节点选择器。
当您保存更改时,MCO 会排空、封锁并重启节点。重新引导后,该节点将使用新的自定义分层镜像。
验证
使用以下命令验证新 pod 是否正在运行:
$ oc get pods -n <machineosbuilds_namespace>
NAME READY STATUS RESTARTS AGE build-rendered-layered-ad5a3cad36303c363cf458ab0524e7c0 2/2 Running 0 2m40s 1 # ... machine-os-builder-6fb66cfb99-zcpvq 1/1 Running 0 2m42s 2
验证
MachineOSConfig
对象是否包含对新自定义分层镜像的引用:$ oc describe MachineOSConfig <object_name>
apiVersion: machineconfiguration.openshift.io/v1alpha1 kind: MachineOSConfig metadata: name: layered spec: buildInputs: baseImagePullSecret: name: global-pull-secret-copy containerFile: - containerfileArch: noarch content: "" imageBuilder: imageBuilderType: PodImageBuilder renderedImagePushSecret: name: builder-dockercfg-ng82t-canonical renderedImagePushspec: image-registry.openshift-image-registry.svc:5000/openshift-machine-config-operator/os-image:latest buildOutputs: currentImagePullSecret: name: global-pull-secret-copy machineConfigPool: name: layered status: currentImagePullspec: image-registry.openshift-image-registry.svc:5000/openshift-machine-config-operator/os-image@sha256:f636fa5b504e92e6faa22ecd71a60b089dab72200f3d130c68dfec07148d11cd 1
- 1
- 新自定义分层镜像的摘要镜像拉取 spec。
验证
MachineOSBuild
对象是否包含对新自定义分层镜像的引用。$ oc describe machineosbuild <object_name>
apiVersion: machineconfiguration.openshift.io/v1alpha1 kind: MachineOSBuild metadata: name: layered-rendered-layered-ad5a3cad36303c363cf458ab0524e7c0-builder spec: desiredConfig: name: rendered-layered-ad5a3cad36303c363cf458ab0524e7c0 machineOSConfig: name: layered renderedImagePushspec: image-registry.openshift-image-registry.svc:5000/openshift-machine-config-operator/os-image:latest # ... status: conditions: - lastTransitionTime: "2024-05-21T20:25:06Z" message: Build Ready reason: Ready status: "True" type: Succeeded finalImagePullspec: image-registry.openshift-image-registry.svc:5000/openshift-machine-config-operator/os-image@sha256:f636fa5b504e92e6faa22ecd71a60b089dab72200f3d130c68dfec07148d11cd 1
- 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:quay.io/openshift-release-dev/os-image@sha256:f636fa5b504e92e6faa22ecd71a60b089dab72200f3d130c68dfec07148d11cd 1 Digest: sha256:bcea2546295b2a55e0a9bf6dd4789433a9867e378661093b6fdee0031ed1e8a4 Version: 416.94.202405141654-0 (2024-05-14T16:58:43Z)
- 1
- 新自定义分层镜像的摘要镜像拉取 spec。
其他资源