7.3. 使用 on-cluster 层应用自定义分层镜像


要使用 on-cluster 构建过程将自定义分层镜像应用到集群,请创建一个 MachineOSConfig 自定义资源 (CR) 来指定以下参数:

  • 要构建的 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 副本,以便拉取基础操作系统镜像。

    例如,如果您使用全局 pull secret,您可以运行以下命令:

    $oc create secret docker-registry global-pull-secret-copy \
      --namespace "openshift-machine-config-operator" \
      --from-file=.dockerconfigjson=<(oc get secret/pull-secret -n openshift-config -o go-template='{{index .data ".dockerconfigjson" | base64decode}}')
    Copy to Clipboard Toggle word wrap
  • openshift-machine-api 命名空间中有 etc-pki-entitlement secret 的副本。
  • 具有 MCO 所需的推送 secret,才能将新的自定义分层镜像推送到 registry。
  • 您有一个 pull secret,节点需要从 registry 中拉取新的自定义分层镜像。这应该与用于将镜像推送到存储库的 secret 不同。
  • 您熟悉如何配置 Containerfile。有关如何创建 Containerfile 的说明超出了本文档的范围。
  • 可选:为要应用自定义分层镜像的节点有单独的机器配置池。

流程

  1. 创建 machineOSconfig 对象:

    1. 创建一个类似以下示例的 YAML 文件:

      apiVersion: machineconfiguration.openshift.io/v1alpha1
      kind: MachineOSConfig
      metadata:
        name: layered
      spec:
        machineConfigPool:
          name: <mcp_name> 
      1
      
        buildInputs:
          containerFile: 
      2
      
          - containerfileArch: noarch 
      3
      
            content: |-
              FROM configs AS final 
      4
      
              RUN rpm-ostree install tree && \
                  ostree container commit
          imageBuilder: 
      5
      
            imageBuilderType: PodImageBuilder
          baseImagePullSecret: 
      6
      
            name: global-pull-secret-copy
          renderedImagePushspec: image-registry.openshift-image-registry.svc:5000/openshift/os-image:latest  
      7
      
          renderedImagePushSecret: 
      8
      
            name: builder-dockercfg-7lzwl
        buildOutputs: 
      9
      
          currentImagePullSecret:
            name: builder-dockercfg-mtcl23
      Copy to Clipboard Toggle word wrap
      1
      指定要部署自定义分层镜像的机器配置池。
      2
      指定用于配置自定义分层镜像的 Containerfile。您可以在 Containerfile 中指定多个构建阶段。
      3
      指定要构建镜像的架构。您必须将此参数设为 noarch
      4
      将构建阶段指定为 final。此字段是必需的,并应用到构建中的最后一个镜像。
      5
      指定要使用的镜像构建器的名称。您必须将此参数设为 PodImageBuilder
      6
      指定 MCO 需要的 pull secret 名称,以便从 registry 中拉取基本操作系统镜像。
      7
      指定要将新构建的自定义分层镜像推送到的镜像 registry。这可以是集群可访问的任何 registry。本例使用内部 OpenShift Container Platform registry。
      8
      指定 MCO 需要的推送 secret 名称,将新构建的自定义分层镜像推送到 registry。
      9
      指定节点需要的镜像 registry 所需的 secret,以便拉取新构建的自定义分层镜像。这应该与用于将镜像推送到存储库的 secret 不同。
    2. 创建 MachineOSConfig 对象:

      $ oc create -f <file_name>.yaml
      Copy to Clipboard Toggle word wrap
  2. 如果需要,当 MachineOSBuild 对象被创建且处于 READY 状态时,修改您要使用新自定义分层镜像的节点 spec:

    1. 检查 MachineOSBuild 对象是否为 READY。当 SUCCEEDED 值为 True 时,构建已完成。

      $ oc get machineosbuild
      Copy to Clipboard Toggle word wrap

      显示 MachineOSBuild 对象已就绪的输出示例

      NAME                                                                PREPARED   BUILDING   SUCCEEDED   INTERRUPTED   FAILED
      layered-rendered-layered-ad5a3cad36303c363cf458ab0524e7c0-builder   False      False      True        False         False
      Copy to Clipboard Toggle word wrap

    2. 通过为 MachineOSConfig 对象中指定的机器配置池添加标签来编辑您要部署自定义分层镜像的节点:

      $ oc label node <node_name> 'node-role.kubernetes.io/<mcp_name>='
      Copy to Clipboard Toggle word wrap

      其中:

      node-role.kubernetes.io/<mcp_name>=
      指定用于标识用于部署自定义分层镜像的节点选择器。

      当您保存更改时,MCO 会排空、封锁并重启节点。重新引导后,该节点将使用新的自定义分层镜像。

验证

  1. 运行以下命令验证新 pod 是否已就绪:

    $ oc get pods -n openshift-machine-config-operator
    Copy to Clipboard Toggle word wrap

    输出示例

    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
    Copy to Clipboard Toggle word wrap

    1
    这是自定义分层镜像构建的构建 pod。
    2
    此 pod 可用于故障排除。
  2. 运行以下命令,验证分层构建的当前阶段:

    $ oc get machineosbuilds
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                                                PREPARED   BUILDING   SUCCEEDED   INTERRUPTED   FAILED
    layered-rendered-layered-ef6460613affe503b530047a11b28710-builder   False      True       False       False         False
    Copy to Clipboard Toggle word wrap

  3. 运行以下命令,验证 MachineOSBuild 对象是否包含对新自定义分层镜像的引用:

    $ oc describe machineosbuild <object_name>
    Copy to Clipboard Toggle word wrap

    输出示例

    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
    Copy to Clipboard Toggle word wrap

    1
    新自定义分层镜像的摘要镜像拉取 spec。
  4. 验证适当的节点是否使用新的自定义分层镜像:

    1. 以 root 用户身份为 control plane 节点启动一个 debug 会话:

      $ oc debug node/<node_name>
      Copy to Clipboard Toggle word wrap
    2. /host 设置为 debug shell 中的根目录:

      sh-4.4# chroot /host
      Copy to Clipboard Toggle word wrap
    3. 运行 rpm-ostree status 命令,以查看自定义分层镜像正在使用:

      sh-5.1# rpm-ostree status
      Copy to Clipboard Toggle word wrap

      输出示例

      # ...
      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)
      Copy to Clipboard Toggle word wrap

      1
      新自定义分层镜像的摘要镜像拉取 spec。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat