第 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 镜像,但在使用自定义分层镜像的节点中维护和更新镜像。假定您对自定义分层镜像应用的软件包及软件包可能出现的问题负责。
镜像分层只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(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:
- 为指定池呈现新机器配置。
- 对池中的节点执行 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-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
注意有关如何创建 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-hotfix 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-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
检查新机器配置中的
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...
检查关联的机器配置池是否使用新机器配置更新:
$ 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 机器配置池已应用到新机器配置。
检查节点以查看是否禁用了在节点上调度。这表示要应用更改:
$ 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
当节点重新处于
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:...
其他资源