第 15 章 RHCOS 镜像分层

Red Hat Enterprise Linux CoreOS (RHCOS) 镜像分层允许您通过将额外镜像分层到基础镜像来轻松地扩展基本 RHCOS 镜像的功能。此分层不会修改基本 RHCOS 镜像。相反,它会创建一个自定义层次镜像,其中包含所有 RHCOS 功能,并为集群中的特定节点添加额外的功能。

您可以使用 Containerfile 创建自定义分层镜像,并使用 MachineConfig 对象将其应用到节点。Machine Config Operator 覆盖基础 RHCOS 镜像,由关联的机器配置中的 osImageURL 值指定,并引导新镜像。您可以通过删除机器配置来删除自定义层次镜像,MCO 会将节点重启回基础 RHCOS 镜像。

使用 RHCOS 镜像分层时,您可以在基础镜像中安装 RPM,自定义内容将与 RHCOS 一起引导。Machine Config Operator (MCO) 可以推出这些自定义分层镜像,并像默认 RHCOS 镜像一样监控这些自定义容器。RHCOS 镜像分层为管理 RHCOS 节点的方式提供了更大的灵活性。

重要

不建议将实时内核和扩展 RPM 作为自定义分层内容安装。这是因为这些 RPM 可能会与使用机器配置安装的 RPM 冲突。如果存在冲突,MCO 会在尝试安装机器配置 RPM 时进入 degraded 状态。在继续操作前,您需要从机器配置中删除冲突扩展。

将自定义分层镜像应用到集群后,您可以有效地 获取自定义分层镜像和这些节点的所有权。虽然红帽仍负责维护和更新标准节点上的基础 RHCOS 镜像,但在使用自定义分层镜像的节点中维护和更新镜像。假定您对自定义分层镜像应用的软件包及软件包可能出现的问题负责。

重要

镜像分层只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。

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

目前,RHCOS 镜像分层允许您与 h Customer Experience and Engagement (CEE) 团队合作,在 RHCOS 镜像的顶部获取并应用 Hotfix 软件包。在某些情况下,您可能需要在一个官方的 OpenShift Container Platform 发行版本中包括程序错误修复或功能增强。RHCOS 镜像分层允许您在正式发布前轻松添加 Hotfix,并在底层 RHCOS 镜像包含修复时删除 Hotfix。

重要

有些 Hotfixes 需要红帽支持例外,且不在 OpenShift Container Platform 支持覆盖范围或生命周期政策之外。

如果您需要热修复,它将遵循红帽 Hotfix 策略提供给您。将它应用到基础镜像的顶部,并测试在非生产环境中的新的自定义分层镜像。当您满足自定义分层镜像在生产环境中安全使用时,您可以将其按您自己的计划部署到特定的节点池。因此,您可以轻松地回滚自定义分层镜像,并使用默认 RHCOS 返回。

注意

计划在以后的发行版本,您可以使用 RHCOS 镜像分层来融合第三方软件包,如 Libreswan 或 numactl。

要应用自定义分层镜像,您可以创建一个 Containerfile 来引用 OpenShift Container Platform 镜像和您要应用的 Hotfix。例如:

应用 Hotfix 的 Containerfile 示例

# Using a 4.12.0 image
FROM quay.io/openshift-release-dev/ocp-release@sha256...
#Install hotfix rpm
RUN rpm-ostree override replace https://example.com/myrepo/haproxy-1.0.16-5.el8.src.rpm && \
    rpm-ostree cleanup -m && \
    ostree container commit

注意

使用在集群的其余部分上安装的同一基本 RHCOS 镜像。使用 oc adm release info --image-for rhel-coreos-8 命令获取集群中使用的基础镜像。

将生成的自定义分层镜像推送到镜像 registry。在非生产环境的 OpenShift Container Platform 集群中,为指向新镜像的目标节点池创建一个 MachineConfig 对象。

Machine Config Operator (MCO) 使用机器配置中提供的内容更新操作系统。这会创建一个自定义层次镜像,用于覆盖这些节点上的基本 RHCOS 镜像。

创建机器配置后,MCO:

  1. 为指定池呈现新机器配置。
  2. 对池中的节点执行 cordon 和 drain 操作。
  3. 将其余机器配置参数写入节点。
  4. 将自定义分层镜像应用到节点。
  5. 使用新镜像重启节点。
重要

强烈建议您在推出集群前测试生产环境中的镜像。

15.1. 应用 RHCOS 自定义层次镜像

您可以在特定机器配置池中的节点上轻松配置 Red Hat Enterprise Linux CoreOS (RHCOS) 镜像层。Machine Config Operator (MCO) 使用新的自定义分层镜像重启这些节点,覆盖基本 Red Hat Enterprise Linux CoreOS (RHCOS) 镜像。

要将自定义分层镜像应用到集群,您必须在集群可访问的存储库中具有自定义层次镜像。然后,创建一个指向自定义分层镜像的 MachineConfig 对象。对于每个需要配置的集群配置池,都需要一个独立的 MachineConfig 对象。

重要

当您配置自定义分层镜像时,OpenShift Container Platform 不再自动更新任何使用自定义分层镜像的节点。根据需要手动进行节点更新是您自己的责任。如果您回滚自定义层,OpenShift Container Platform 将再次自动更新该节点。有关更新使用自定义分层镜像的节点的重要信息,请参阅以下附加资源部分。

先决条件

  • 您必须创建一个基于 OpenShift Container Platform 镜像摘要的自定义层次镜像,而不是标签。

    注意

    您应该使用与集群的其余部分上安装相同的基本 RHCOS 镜像。使用 oc adm release info --image-for rhel-coreos-8 命令获取集群中使用的基础镜像。

    例如,以下 Containerfile 从 OpenShift Container Platform 4.12 镜像创建一个自定义分层镜像,并使用 CentOS 8 Stream 之一覆盖内核软件包:

    自定义层镜像的 Containerfile 示例

    # Using a 4.12.0 image
    FROM quay.io/openshift-release/ocp-release@sha256... 1
    #Install hotfix rpm
    RUN rpm-ostree cliwrap install-to-root / \ 2
        rpm-ostree override replace http://mirror.centos.org/centos/8-stream/BaseOS/x86_64/os/Packages/kernel-{,core-,modules-,modules-extra-}4.18.0-483.el8.x86_64.rpm && \ 3
        rpm-ostree cleanup -m && \
        ostree container commit

    1
    指定集群的 RHCOS 基础镜像。
    2
    启用 cliwrap。目前需要截获从内核脚本进行的一些命令调用。
    3
    替换内核软件包。
    注意

    有关如何创建 Containerfile 的说明超出了本文档的范围。

  • 由于构建自定义分层镜像的过程是在集群之外执行,所以您必须在 Podman 或 Buildah 中使用 --authfile /path/to/pull-secret 选项。或者,要自动读取这些工具的 pull secret,您可以将其添加到默认文件位置之一:~/.docker/config.json, $XDG_RUNTIME_DIR/containers/auth.json, ~/.docker/config.json, 或 ~/.dockercfg。如需更多信息,请参阅 containers-auth.json 手册页。
  • 您必须将自定义分层镜像推送到集群可访问的存储库。

流程

  1. 创建机器配置文件。

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

      apiVersion: machineconfiguration.openshift.io/v1
      kind: MachineConfig
      metadata:
        labels:
          machineconfiguration.openshift.io/role: worker 1
        name: os-layer-hotfix
      spec:
        osImageURL: quay.io/my-registry/custom-image@sha256... 2
      1
      指定要应用自定义分层镜像的机器配置池。
      2
      指定存储库中自定义分层镜像的路径。
    2. 创建 MachineConfig 对象:

      $ oc create -f <file_name>.yaml
      重要

      强烈建议您在推出集群前测试生产环境中的镜像。

验证

您可以通过执行以下任一方式来验证是否应用了自定义层次镜像:

  1. 检查 worker 机器配置池已使用新机器配置推出:

    1. 检查是否创建了新机器配置:

      $ oc get mc

      输出示例

      NAME                                               GENERATEDBYCONTROLLER                      IGNITIONVERSION   AGE
      00-master                                          5bdb57489b720096ef912f738b46330a8f577803   3.2.0             95m
      00-worker                                          5bdb57489b720096ef912f738b46330a8f577803   3.2.0             95m
      01-master-container-runtime                        5bdb57489b720096ef912f738b46330a8f577803   3.2.0             95m
      01-master-kubelet                                  5bdb57489b720096ef912f738b46330a8f577803   3.2.0             95m
      01-worker-container-runtime                        5bdb57489b720096ef912f738b46330a8f577803   3.2.0             95m
      01-worker-kubelet                                  5bdb57489b720096ef912f738b46330a8f577803   3.2.0             95m
      99-master-generated-registries                     5bdb57489b720096ef912f738b46330a8f577803   3.2.0             95m
      99-master-ssh                                                                                 3.2.0             98m
      99-worker-generated-registries                     5bdb57489b720096ef912f738b46330a8f577803   3.2.0             95m
      99-worker-ssh                                                                                 3.2.0             98m
      os-layer-hotfix                                                                                                 10s 1
      rendered-master-15961f1da260f7be141006404d17d39b   5bdb57489b720096ef912f738b46330a8f577803   3.2.0             95m
      rendered-worker-5aff604cb1381a4fe07feaf1595a797e   5bdb57489b720096ef912f738b46330a8f577803   3.2.0             95m
      rendered-worker-5de4837625b1cbc237de6b22bc0bc873   5bdb57489b720096ef912f738b46330a8f577803   3.2.0             4s  2

      1
      新机器配置
      2
      新的渲染机器配置
    2. 检查新机器配置中的 osImageURL 值是否指向预期的镜像:

      $ oc describe mc rendered-master-4e8be63aef68b843b546827b6ebe0913

      输出示例

      Name:         rendered-master-4e8be63aef68b843b546827b6ebe0913
      Namespace:
      Labels:       <none>
      Annotations:  machineconfiguration.openshift.io/generated-by-controller-version: 8276d9c1f574481043d3661a1ace1f36cd8c3b62
                    machineconfiguration.openshift.io/release-image-version: 4.12.0-ec.3
      API Version:  machineconfiguration.openshift.io/v1
      Kind:         MachineConfig
      ...
        Os Image URL: quay.io/my-registry/custom-image@sha256...

    3. 检查关联的机器配置池是否使用新机器配置更新:

      $ oc get mcp

      输出示例

      NAME     CONFIG                                             UPDATED   UPDATING   DEGRADED   MACHINECOUNT   READYMACHINECOUNT   UPDATEDMACHINECOUNT   DEGRADEDMACHINECOUNT   AGE
      master   rendered-master-6faecdfa1b25c114a58cf178fbaa45e2   True      False      False      3              3                   3                     0                      39m
      worker   rendered-worker-6b000dbc31aaee63c6a2d56d04cd4c1b   False     True       False      3              0                   0                     0                      39m 1

      1
      UPDATING 字段为 True 时,机器配置池会使用新机器配置进行更新。当字段变为 False 时,代表 worker 机器配置池已应用到新机器配置。
    4. 检查节点以查看是否禁用了在节点上调度。这表示要应用更改:

      $ oc get nodes

      输出示例

      NAME                                         STATUS                     ROLES                  AGE   VERSION
      ip-10-0-148-79.us-west-1.compute.internal    Ready                      worker                 32m   v1.25.0+3ef6ef3
      ip-10-0-155-125.us-west-1.compute.internal   Ready,SchedulingDisabled   worker                 35m   v1.25.0+3ef6ef3
      ip-10-0-170-47.us-west-1.compute.internal    Ready                      control-plane,master   42m   v1.25.0+3ef6ef3
      ip-10-0-174-77.us-west-1.compute.internal    Ready                      control-plane,master   42m   v1.25.0+3ef6ef3
      ip-10-0-211-49.us-west-1.compute.internal    Ready                      control-plane,master   42m   v1.25.0+3ef6ef3
      ip-10-0-218-151.us-west-1.compute.internal   Ready                      worker                 31m   v1.25.0+3ef6ef3

  2. 当节点重新处于 Ready 状态时,检查该节点是否使用自定义分层镜像:

    1. 打开节点的 oc debug 会话。例如:

      $ oc debug node/ip-10-0-155-125.us-west-1.compute.internal
    2. /host 设置为 debug shell 中的根目录:

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

      sh-4.4# sudo rpm-ostree status

      输出示例

      State: idle
      Deployments:
      * ostree-unverified-registry:quay.io/my-registry/...
                         Digest: sha256:...