第 16 章 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 镜像,但在使用自定义分层镜像的节点中维护和更新镜像。假定您对自定义分层镜像应用的软件包及软件包可能出现的问题负责。
要应用自定义分层镜像,您可以创建一个 Containerfile 来引用 OpenShift Container Platform 镜像和您要应用的 RPM。然后,您将生成的自定义分层镜像推送到镜像 registry。在非生产环境的 OpenShift Container Platform 集群中,为指向新镜像的目标节点池创建一个 MachineConfig
对象。
使用在集群的其余部分上安装的同一基本 RHCOS 镜像。使用 oc adm release info --image-for rhel-coreos
命令获取集群中使用的基础镜像。
RHCOS 镜像分层允许您使用以下类型的镜像来创建自定义分层镜像:
OpenShift 容器平台 Hotfixes.您可以使用客户体验和参与(CEE)在 RHCOS 镜像之上获取并应用 Hotfix 软件包。在某些情况下,您可能需要在一个官方的 OpenShift Container Platform 发行版本中包括程序错误修复或功能增强。RHCOS 镜像分层允许您在正式发布前轻松添加 Hotfix,并在底层 RHCOS 镜像包含修复时删除 Hotfix。
重要有些 Hotfixes 需要红帽支持例外,且不在 OpenShift Container Platform 支持覆盖范围或生命周期政策之外。
如果您需要热修复,它将遵循红帽 Hotfix 策略提供给您。将它应用到基础镜像的顶部,并测试在非生产环境中的新的自定义分层镜像。当您满足自定义分层镜像在生产环境中安全使用时,您可以将其按您自己的计划部署到特定的节点池。因此,您可以轻松地回滚自定义分层镜像,并使用默认 RHCOS 返回。
应用 Hotfix 的 Containerfile 示例
# Using a 4.12.0 image FROM quay.io/openshift-release-dev/ocp-v4.0-art-dev@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
RHEL 软件包.您可以从红帽客户门户网站下载 Red Hat Enterprise Linux (RHEL) 软件包,如 chrony, firewalld, and iputils。
应用 firewalld 工具的 Containerfile 示例
FROM quay.io/openshift-release-dev/ocp-release@sha256... ADD configure-firewall-playbook.yml . RUN rpm-ostree install firewalld ansible && \ ansible-playbook configure-firewall-playbook.yml && \ rpm -e ansible && \ ostree container commit
应用 libreswan 工具的 Containerfile 示例
# Get RHCOS base image of target cluster `oc adm release info --image-for rhel-coreos` # hadolint ignore=DL3006 FROM quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256... # Install our config file COPY my-host-to-host.conf /etc/ipsec.d/ # RHEL entitled host is needed here to access RHEL packages # Install libreswan as extra RHEL package RUN rpm-ostree install libreswan && \ systemctl enable ipsec && \ ostree container commit
因为 libreswan 需要额外的 RHEL 软件包,所以必须在授权的 RHEL 主机上构建镜像。
第三方软件包。您可以从第三方机构下载并安装 RPM,如以下类型的软件包:
- 增强边缘驱动程序和内核增强,以提高性能或添加功能。
- 用于调查可能和实际分类的客户端工具。
- 安全代理。
- 提供整个集群一致的视图的清单代理。
- SSH 密钥管理软件包。
从 EPEL 应用第三方软件包的 Containerfile 示例
# Get RHCOS base image of target cluster `oc adm release info --image-for rhel-coreos` # hadolint ignore=DL3006 FROM quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256... # Install our config file COPY my-host-to-host.conf /etc/ipsec.d/ # RHEL entitled host is needed here to access RHEL packages # Install libreswan as extra RHEL package RUN rpm-ostree install libreswan && \ systemctl enable ipsec && \ ostree container commit
应用具有 RHEL 依赖项的第三方软件包的 Containerfile 示例
# Get RHCOS base image of target cluster `oc adm release info --image-for rhel-coreos` # hadolint ignore=DL3006 FROM quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256... # Install our config file COPY my-host-to-host.conf /etc/ipsec.d/ # RHEL entitled host is needed here to access RHEL packages # Install libreswan as extra RHEL package RUN rpm-ostree install libreswan && \ systemctl enable ipsec && \ ostree container commit
这个 Containerfile 安装 Linux fish 程序。由于 fish 需要额外的 RHEL 软件包,所以必须在授权的 RHEL 主机上构建镜像。
创建机器配置后,Machine Config Operator (MCO) 执行以下步骤:
- 为指定池呈现新机器配置。
- 对池中的节点执行 cordon 和 drain 操作。
- 将其余机器配置参数写入节点。
- 将自定义分层镜像应用到节点。
- 使用新镜像重启节点。
强烈建议您在推出集群前测试生产环境中的镜像。
16.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
命令获取集群中使用的基础镜像。例如,以下 Containerfile 从 OpenShift Container Platform 4.13 镜像创建一个自定义分层镜像,并使用 CentOS 9 Stream 之一覆盖内核软件包:
自定义层镜像的 Containerfile 示例
# Using a 4.13.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.stream.centos.org/9-stream/BaseOS/x86_64/os/Packages/kernel-{,core-,modules-,modules-core-,modules-extra-}5.14.0-295.el9.x86_64.rpm && \ 3 rpm-ostree cleanup -m && \ ostree container commit
注意有关如何创建 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
手册页。 - 您必须将自定义分层镜像推送到集群可访问的存储库。
流程
创建机器配置文件。
创建一个类似以下示例的 YAML 文件:
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker 1 name: os-layer-custom spec: osImageURL: quay.io/my-registry/custom-image@sha256... 2
创建
MachineConfig
对象:$ oc create -f <file_name>.yaml
重要强烈建议您在推出集群前测试生产环境中的镜像。
验证
您可以通过执行以下任一方式来验证是否应用了自定义层次镜像:
检查 worker 机器配置池已使用新机器配置推出:
检查是否创建了新机器配置:
$ 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-custom 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
检查新机器配置中的
osImageURL
值是否指向预期的镜像:$ oc describe mc rendered-worker-5de4837625b1cbc237de6b22bc0bc873
输出示例
Name: rendered-worker-5de4837625b1cbc237de6b22bc0bc873 Namespace: Labels: <none> Annotations: machineconfiguration.openshift.io/generated-by-controller-version: 5bdb57489b720096ef912f738b46330a8f577803 machineconfiguration.openshift.io/release-image-version: {product-version}.0-ec.3 API Version: machineconfiguration.openshift.io/v1 Kind: MachineConfig ... Os Image URL: quay.io/my-registry/custom-image@sha256...
检查关联的机器配置池是否使用新机器配置更新:
$ oc get mcp
输出示例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-15961f1da260f7be141006404d17d39b True False False 3 3 3 0 39m worker rendered-worker-5de4837625b1cbc237de6b22bc0bc873 True False False 3 0 0 0 39m 1
- 1
- 当
UPDATING
字段为True
时,机器配置池会使用新机器配置进行更新。在这种情况下,您将无法在输出看到新机器配置列表。当字段变为False
时,代表 worker 机器配置池已应用到新机器配置。
检查节点以查看是否禁用了在节点上调度。这表示要应用更改:
$ oc get nodes
输出示例
NAME STATUS ROLES AGE VERSION ip-10-0-148-79.us-west-1.compute.internal Ready worker 32m v1.26.0 ip-10-0-155-125.us-west-1.compute.internal Ready,SchedulingDisabled worker 35m v1.26.0 ip-10-0-170-47.us-west-1.compute.internal Ready control-plane,master 42m v1.26.0 ip-10-0-174-77.us-west-1.compute.internal Ready control-plane,master 42m v1.26.0 ip-10-0-211-49.us-west-1.compute.internal Ready control-plane,master 42m v1.26.0 ip-10-0-218-151.us-west-1.compute.internal Ready worker 31m v1.26.0
当节点重新处于
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# sudo rpm-ostree status
输出示例
State: idle Deployments: * ostree-unverified-registry:quay.io/my-registry/... Digest: sha256:...
其他资源