可伸缩性和性能
扩展 OpenShift Container Platform 集群并调整产品环境的性能
摘要
第 1 章 推荐的性能和可扩展性实践
1.1. 推荐的 control plane 实践
本主题为 OpenShift Container Platform 中的 control plane 提供推荐的性能和可扩展性实践。
1.1.1. 扩展集群的建议实践
本节中的指导信息仅与使用云供应商集成的安装相关。
应用以下最佳实践来扩展 OpenShift Container Platform 集群中的 worker 机器数量。您可以通过增加或减少 worker MachineSet 中定义的副本数量来扩展 worker 机器集。
将集群扩展到具有更多节点时:
- 将节点分散到所有可用区以获得更高的可用性。
- 同时扩展的机器数量不要超过 25 到 50 个。
- 考虑在每个可用区创建一个具有类似大小的替代实例类型的新计算机器集,以帮助缓解周期性供应商容量限制。例如,在 AWS 上,使用 m5.large 和 m5d.large。
云供应商可能会为 API 服务实施配额。因此,需要对集群逐渐进行扩展。
如果同时将计算机器集中的副本设置为更高数量,则控制器可能无法创建机器。部署 OpenShift Container Platform 的云平台可以处理的请求数量将会影响该进程。当尝试创建、检查和更新有状态的机器时,控制器会开始进行更多的查询。部署 OpenShift Container Platform 的云平台具有 API 请求限制,如果出现过量查询,则可能会因为云平台的限制而导致机器创建失败。
当扩展到具有大量节点时,启用机器健康检查。如果出现故障,健康检查会监控状况并自动修复不健康的机器。
当对大型且高密度的集群减少节点数时,可能需要大量时间,因为这个过程涉及排空或驱除在同时终止的节点上运行的对象。另外,如果要驱除的对象太多,对客户端的请求处理会出现瓶颈。默认客户端查询每秒(QPS)和突发率当前分别设置为 5
和 10
。这些值无法在 OpenShift Container Platform 中修改。
1.1.2. Control plane 节点大小
控制平面节点资源要求取决于集群中的节点和对象的数量和类型。以下控制平面节点大小是基于控制平面密度测试的结果,或 Clusterdensity。此测试会在给定很多命名空间中创建以下对象:
- 1 个镜像流
- 1 个构建
-
5 个部署,其中 2 个 pod 副本处于
睡眠
状态,每个状态都挂载 4 个 secret、4 个配置映射和 1 Downward API 卷 - 5 个服务,每个服务都指向前一个部署的 TCP/8080 和 TCP/8443 端口
- 1 个路由指向上一个服务的第一个路由
- 包含 2048 个随机字符串字符的 10 个 secret
- 10 个配置映射包含 2048 个随机字符串字符
worker 节点数量 | 集群密度(命名空间) | CPU 内核 | 内存 (GB) |
---|---|---|---|
24 | 500 | 4 | 16 |
120 | 1000 | 8 | 32 |
252 | 4000 | 16,但如果使用 OVN-Kubernetes 网络插件,则为 24 | 64,但在使用 OVN-Kubernetes 网络插件时为 128 |
501,但使用 OVN-Kubernetes 网络插件时未测试 | 4000 | 16 | 96 |
上表中的数据基于在 AWS 上运行的 OpenShift Container Platform,使用 r5.4xlarge 实例作为 control-plane 节点,m5.2xlarge 实例作为 worker 节点。
在具有三个 control plane 节点的大型高密度集群中,当其中一个节点停止、重启或失败时,CPU 和内存用量将会激增。故障可能是因为电源、网络、底层基础架构或意外情况造成意外问题,因为集群在关闭后重启,以节约成本。其余两个 control plane 节点必须处理负载才能高度可用,从而增加资源使用量。另外,在升级过程中还会有这个预期,因为 control plane 节点被封锁、排空并按顺序重新引导,以应用操作系统更新以及 control plane Operator 更新。为了避免级联失败,请将 control plane 节点上的总体 CPU 和内存资源使用量保留为最多 60% 的所有可用容量,以处理资源使用量激增。相应地增加 control plane 节点上的 CPU 和内存,以避免因为缺少资源而造成潜在的停机。
节点大小取决于集群中的节点和对象数量。它还取决于集群上是否正在主动创建这些对象。在创建对象时,control plane 在资源使用量方面与对象处于运行(running)
阶段的时间相比更活跃。
Operator Lifecycle Manager(OLM)在 control plane 节点上运行,其内存占用量取决于 OLM 在集群中管理的命名空间和用户安装的 operator 的数量。Control plane 节点需要相应地调整大小,以避免 OOM 终止。以下数据基于集群最大测试的结果。
命名空间数量 | 处于空闲状态的 OLM 内存(GB) | 安装了 5 个用户 operator 的 OLM 内存(GB) |
---|---|---|
500 | 0.823 | 1.7 |
1000 | 1.2 | 2.5 |
1500 | 1.7 | 3.2 |
2000 | 2 | 4.4 |
3000 | 2.7 | 5.6 |
4000 | 3.8 | 7.6 |
5000 | 4.2 | 9.02 |
6000 | 5.8 | 11.3 |
7000 | 6.6 | 12.9 |
8000 | 6.9 | 14.8 |
9000 | 8 | 17.7 |
10,000 | 9.9 | 21.6 |
您只能为以下配置修改正在运行的 OpenShift Container Platform 4.12 集群中的 control plane 节点大小:
- 使用用户置备的安装方法安装的集群。
- 使用安装程序置备的基础架构安装方法安装的 AWS 集群。
- 使用 control plane 机器集管理 control plane 机器的集群。
对于所有其他配置,您必须估计节点总数并在安装过程中使用推荐的 control plane 节点大小。
建议基于在带有 OpenShiftSDN 作为网络插件的 OpenShift Container Platform 集群上捕获的数据点。
在 OpenShift Container Platform 4.12 中,与 OpenShift Container Platform 3.11 及之前的版本相比,系统现在默认保留半个 CPU 内核(500 millicore)。确定大小时应该考虑这一点。
1.1.2.1. 为 control plane 机器选择更大的 Amazon Web Services 实例类型
如果 Amazon Web Services (AWS) 集群中的 control plane 机器需要更多资源,您可以为 control plane 机器选择更大的 AWS 实例类型。
使用 control plane 机器集的集群的步骤与不使用 control plane 机器集的集群的步骤不同。
如果不确定集群中 ControlPlaneMachineSet
CR 的状态,您可以验证 CR 状态。
1.1.2.1.1. 使用 control plane 机器集更改 Amazon Web Services 实例类型
您可以通过更新 control plane 机器集自定义资源 (CR) 中的规格来更改 control plane 机器使用的 Amazon Web Services (AWS) 实例类型。
先决条件
- 您的 AWS 集群使用 control plane 机器集。
流程
运行以下命令来编辑 control plane 机器集 CR:
$ oc --namespace openshift-machine-api edit controlplanemachineset.machine.openshift.io cluster
编辑
providerSpec
字段中的以下行:providerSpec: value: ... instanceType: <compatible_aws_instance_type> 1
- 1
- 使用与之前选择相同的基础指定较大的 AWS 实例类型。例如,您可以将
m6i.xlarge
更改为m6i.2xlarge
或m6i.4xlarge
。
保存您的更改。
-
对于使用默认
RollingUpdate
更新策略的集群,Operator 会自动将更改传播到 control plane 配置。 -
对于配置为使用
OnDelete
更新策略的集群,您必须手动替换 control plane 机器。
-
对于使用默认
1.1.2.1.2. 使用 AWS 控制台更改 Amazon Web Services 实例类型
您可以通过更新 AWS 控制台中的实例类型来更改 control plane 机器使用的 Amazon Web Services (AWS) 实例类型。
先决条件
- 您可以使用修改集群的 EC2 实例所需的权限访问 AWS 控制台。
-
您可以使用具有
cluster-admin
角色的用户访问 OpenShift Container Platform 集群。
流程
- 打开 AWS 控制台并为 control plane 机器获取实例。
选择一个 control plane 机器实例。
- 对于所选 control plane 机器,通过创建 etcd 快照来备份 etcd 数据。如需更多信息,请参阅 "恢复 etcd"。
- 在 AWS 控制台中,停止 control plane 机器实例。
- 选择已停止的实例,然后点 Actions → Instance Settings → Change instance type。
-
将实例更改为较大的类型,确保类型与之前选择相同,并应用更改。例如,您可以将
m6i.xlarge
更改为m6i.2xlarge
或m6i.4xlarge
。 - 启动实例。
-
如果您的 OpenShift Container Platform 集群具有实例对应的
Machine
对象,请更新对象的实例类型以匹配 AWS 控制台中设置的实例类型。
- 为每个 control plane 机器重复此步骤。
其他资源
1.2. 推荐的基础架构实践
本主题为 OpenShift Container Platform 中的基础架构提供推荐的性能和可扩展性实践。
1.2.1. 基础架构节点大小
基础架构节点是标记为运行 OpenShift Container Platform 环境组成部分的节点。基础架构节点的资源要求取决于集群中的集群年龄、节点和对象,因为这些因素可能会导致 Prometheus 的指标或时间序列增加。以下基础架构节点大小是基于在 Control plane 节点大小 部分中详述的集群密度测试中观察到的结果,其中监控堆栈和默认 ingress-controller 被移到这些节点。
worker 节点数量 | 集群密度或命名空间数量 | CPU 内核 | 内存 (GB) |
---|---|---|---|
27 | 500 | 4 | 24 |
120 | 1000 | 8 | 48 |
252 | 4000 | 16 | 128 |
501 | 4000 | 32 | 128 |
通常,建议每个集群有三个基础架构节点。
这些大小建议应用作指导行。Prometheus 是一个高内存密集型应用程序,资源使用量取决于各种因素,包括节点、对象、Prometheus 指标提取间隔、指标或时间序列以及集群的年龄。此外,路由器资源使用量也可以受到路由数量和入站请求的数量/类型的影响。
这些建议只适用于在集群创建过程中安装监控、Ingress 和 Registry 基础架构组件的基础架构节点。
在 OpenShift Container Platform 4.12 中,与 OpenShift Container Platform 3.11 及之前的版本相比,系统现在默认保留半个 CPU 内核(500 millicore)。这会影响缩放建议。
1.2.2. 扩展 Cluster Monitoring Operator
OpenShift Container Platform 会提供 Cluster Monitoring Operator 在基于 Prometheus 的监控堆栈中收集并存储的数据。作为管理员,您可以通过进入 Observe → Dashboards 来查看 OpenShift Container Platform Web 控制台中的系统资源、容器和组件指标的仪表板。
1.2.3. Prometheus 数据库存储要求
红帽对不同的扩展大小进行了各种测试。
- 以下 Prometheus 存储要求并不具有规定性,应该将它们视为参考信息。取决于具体的工作负载和资源的使用,集群中可能会出现高的资源消耗,包括 Prometheus 收集的指标,如 pod 、容器、路由或其他资源的数量。
- 您可以配置基于大小的数据保留策略,以满足您的存储要求。
节点数 | pod 数量(每个 pod 2 个容器) | 每天增加的 Prometheus 存储 | 每 15 天增加的 Prometheus 存储 | 网络(每个 tsdb 块) |
---|---|---|---|---|
50 | 1800 | 6.3 GB | 94 GB | 16 MB |
100 | 3600 | 13 GB | 195 GB | 26 MB |
150 | 5400 | 19 GB | 283 GB | 36 MB |
200 | 7200 | 25 GB | 375 GB | 46 MB |
大约 20%的预期大小被添加为开销,以保证存储要求不会超过计算的值。
上面的计算用于默认的 OpenShift Container Platform Cluster Monitoring Operator。
CPU 利用率会有轻微影响。这个比例为在每 50 个节点和 1800 个 pod 的 40 个内核中大约有 1 个。
针对 OpenShift Container Platform 的建议
- 至少使用两个基础架构 (infra) 节点。
- 至少使用三个带有非易失性存储器 (SSD 或 NVMe) 驱动器的 openshift-container-storage 节点。
1.2.4. 配置集群监控
您可以为集群监控堆栈中的 Prometheus 组件增加存储容量。
流程
为 Prometheus 增加存储容量:
创建 YAML 配置文件
cluster-monitoring-config.yaml
。例如:apiVersion: v1 kind: ConfigMap data: config.yaml: | prometheusK8s: retention: {{PROMETHEUS_RETENTION_PERIOD}} 1 nodeSelector: node-role.kubernetes.io/infra: "" volumeClaimTemplate: spec: storageClassName: {{STORAGE_CLASS}} 2 resources: requests: storage: {{PROMETHEUS_STORAGE_SIZE}} 3 alertmanagerMain: nodeSelector: node-role.kubernetes.io/infra: "" volumeClaimTemplate: spec: storageClassName: {{STORAGE_CLASS}} 4 resources: requests: storage: {{ALERTMANAGER_STORAGE_SIZE}} 5 metadata: name: cluster-monitoring-config namespace: openshift-monitoring
- 1
- Prometheus 保留的默认值为
PROMETHEUS_RETENTION_PERIOD=15d
。时间单位使用以下后缀之一 : s 、m 、h 、d。 - 2 4
- 集群的存储类。
- 3
- 一个典型的值是
PROMETHEUS_STORAGE_SIZE=2000Gi
。存储值可以是一个纯整数,也可以是带有以下后缀之一的整数: E 、P 、T 、G 、M 、K。您也可以使用以下效果相同的后缀:Ei 、Pi 、Ti 、Gi 、Mi 、Ki。 - 5
- 一个典型的值
是 alertmanager_STORAGE_SIZE=20Gi
。存储值可以是一个纯整数,也可以是带有以下后缀之一的整数: E 、P 、T 、G 、M 、K。您也可以使用以下效果相同的后缀:Ei 、Pi 、Ti 、Gi 、Mi 、Ki。
- 为保留周期、存储类和存储大小添加值。
- 保存该文件。
运行以下命令应用这些更改:
$ oc create -f cluster-monitoring-config.yaml
1.2.5. 其他资源
1.3. 推荐的 etcd 实践
本主题为 OpenShift Container Platform 中的 etcd 提供了推荐的性能和可扩展性实践。
1.3.1. 推荐的 etcd 实践
因为 etcd 将数据写入磁盘并在磁盘上持久化,所以其性能取决于磁盘性能。虽然 etcd 并不是有非常高的 I/O 负载,但它需要使用一个具有低延迟的块设备才能获得最佳性能和稳定性。因为 etcd 的共识协议依赖于将元数据永久存储到一个日志 (WAL),所以 etcd 对磁盘的写延迟非常敏感。减慢来自其他进程的磁盘活动和磁盘活动可能会导致长时间的 fsync 延迟。
这些延迟可能会导致 etcd 丢失心跳,不会及时向磁盘提交新的建议,并最终遇到请求超时和临时丢失问题。高写入延迟也会导致 OpenShift API 较慢,这会影响集群性能。由于这些原因,请避免在具有 I/O 敏感或密集型的 control-plane 节点上并置其他工作负载,并共享相同的底层 I/O 基础架构。
就延迟而言,应该在一个可最少以 50 IOPS 按顺序写入 8000 字节的块设备上运行。也就是说,当有一个 10ms 的延迟时,使用 fdatasync 来同步 WAL 中的写入操作。对于高负载的集群,建议使用 8000 字节的连续 500 IOPS (2 毫秒)。要测量这些数字,您可以使用基准测试工具,如 fio。
要实现这样的性能,在由低延迟和高吞吐量的 SSD 或 NVMe 磁盘支持的机器上运行 etcd。考虑使用单层单元(SLC)固态驱动器(SSD)(它为每个内存单元提供 1 位),这是可靠的,非常适合于写密集型工作负载。
影响 etcd 上的负载的因素包括静态因素,如节点和 pod 的数量,以及动态因素,包括因为 pod 自动扩展、pod 重启、作业执行和其他与工作负载相关的事件,以及其他与负载相关的事件。要准确调整 etcd 设置的大小,您必须分析工作负载的特定要求。考虑影响 etcd 负载的节点、pod 和其他相关因素的数量。
以下硬盘功能提供最佳的 etcd 性能:
- 支持快速读取操作的低延迟。
- 高带宽写入,实现更快速的压缩和碎片处理。
- 高带宽读取,加快从故障恢复。
- 固态硬盘是最小的选择,NVMe 驱动器是首选的。
- 来自不同制造商的服务器级硬件可以提高可靠性。
- RAID 0 技术以提高性能。
- 专用 etcd 驱动器。不要将日志文件或其他重重工作负载放在 etcd 驱动器中。
避免 NAS 或 SAN 设置,以及旋转驱动器。Ceph Rados 块设备 (RBD) 和其他类型的网络附加存储可能会导致网络延迟无法预计。要大规模向 etcd 节点提供快速存储,请使用 PCI 透传将 NVM 设备直接传递给节点。
始终使用相关工具(如 fio)进行基准测试。当集群性能增加时,您可以使用这些工具不断监控集群性能。
避免使用网络文件系统 (NFS) 协议或其他基于网络的文件系统。
需要在部署的 OpenShift Container Platform 集群上监控的一些关键指标包括,日志持续时间之前的 etcd 磁盘写入的 p99 值,以及 etcd leader 更改的数量。使用 Prometheus 跟踪这些指标。
在正常操作过程中,etcd 成员数据库大小可能会因集群而异。这种差异不会影响集群升级,即使领导大小与其他成员不同。
要在创建 OpenShift Container Platform 集群之前或之后验证 etcd 的硬件,您可以使用 fio。
先决条件
- 您正在测试的机器上安装了 Podman 或 Docker 等容器运行时。
-
数据被写入
/var/lib/etcd
路径。
流程
运行 fio 并分析结果:
如果使用 Podman,请运行以下命令:
$ sudo podman run --volume /var/lib/etcd:/var/lib/etcd:Z quay.io/cloud-bulldozer/etcd-perf
如果使用 Docker,请运行以下命令:
$ sudo docker run --volume /var/lib/etcd:/var/lib/etcd:Z quay.io/cloud-bulldozer/etcd-perf
输出会报告磁盘是否足够快以运行 etcd,它会检查测试运行中获得的 fsync 指标的 p99 值是否小于 10ms。一些最重要的 etcd 指标可能受到 I/O 性能的影响,如下所示:
-
etcd_disk_wal_fsync_duration_seconds_bucket
指标报告了 etcd 的 WAL fsync 持续时间。 -
etcd_disk_backend_commit_duration_seconds_bucket
指标报告 etcd 后端提交延迟持续时间 -
etcd_server_leader_changes_seen_total
指标报告领导更改
etcd 在所有成员间复制请求,因此其性能会严重依赖于网络输入/输出(I/O)的延迟。大量网络延迟会导致 etcd heartbeat 的时间比选举超时时间更长,这会导致一个可能会对集群造成破坏的领导选举。在部署的 OpenShift Container Platform 集群上监控的一个关键指标是每个 etcd 集群成员上的 etcd 网络对延迟的 p99 百分比。使用 Prometheus 跟踪指标数据。
histogram_quantile(0.99, rate(etcd_network_peer_round_trip_time_seconds_bucket[2m])
指标报告 etcd 在成员间复制客户端请求的时间。确保它小于 50 ms。
1.3.2. 将 etcd 移动到不同的磁盘
您可以将 etcd 从共享磁盘移到独立磁盘,以防止或解决性能问题。
Machine Config Operator (MCO) 负责为 OpenShift Container Platform 4.12 容器存储挂载辅助磁盘。
这个编码脚本只支持以下设备类型的设备名称:
- SCSI 或 SATA
-
/dev/sd*
- 虚拟设备
-
/dev/vd*
- NVMe
-
/dev/nvme*[0-9]*n*
限制
-
当新磁盘附加到集群时,etcd 数据库是 root 挂载的一部分。当主节点被重新创建时,它不是二级磁盘的一部分或预期的磁盘。因此,主节点不会创建单独的
/var/lib/etcd
挂载。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您可以使用
cluster-admin
权限访问集群。 - 在上传机器配置前添加额外的磁盘。
-
MachineConfigPool
必须与metadata.labels[machineconfiguration.openshift.io/role]
匹配。这适用于控制器、worker 或自定义池。
这个过程不会将 root 文件系统的部分内容(如 /var/
)移到已安装节点上的另一个磁盘或分区。
流程
将新磁盘附加到集群,并在 debug shell 中运行
lsblk
命令来验证节点中是否检测到磁盘:$ oc debug node/<node_name>
# lsblk
记录下
lsblk
命令报告的新磁盘的设备名称。根据您的环境解码和替换脚本中的设备名称。
#!/bin/bash set -uo pipefail for device in <device_type_glob>; do 1 /usr/sbin/blkid $device &> /dev/null if [ $? == 2 ]; then echo "secondary device found $device" echo "creating filesystem for etcd mount" mkfs.xfs -L var-lib-etcd -f $device &> /dev/null udevadm settle touch /etc/var-lib-etcd-mount exit fi done echo "Couldn't find secondary block device!" >&2 exit 77
- 1
- 将
<device_type_glob>
替换为您的块设备类型的 shell glob。对于 SCSI 或 SATA 驱动器,使用/dev/sd*
; 对于虚拟驱动器,使用/dev/vd*
; 对于 NVMe 驱动器,使用/dev/nvme*[0-9]*n*
。
创建名为
etcd-mc.yml
的MachineConfig
YAML 文件,其内容如下:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 98-var-lib-etcd spec: config: ignition: version: 3.1.0 storage: files: - path: /etc/find-secondary-device mode: 0755 contents: source: data:text/plain;charset=utf-8;base64,<encoded_etc_find_secondary_device_script> 1 systemd: units: - name: find-secondary-device.service enabled: true contents: | [Unit] Description=Find secondary device DefaultDependencies=false After=systemd-udev-settle.service Before=local-fs-pre.target ConditionPathExists=!/etc/var-lib-etcd-mount [Service] RemainAfterExit=yes ExecStart=/etc/find-secondary-device RestartForceExitStatus=77 [Install] WantedBy=multi-user.target - name: var-lib-etcd.mount enabled: true contents: | [Unit] Before=local-fs.target [Mount] What=/dev/disk/by-label/var-lib-etcd Where=/var/lib/etcd Type=xfs TimeoutSec=120s [Install] RequiredBy=local-fs.target - name: sync-var-lib-etcd-to-etcd.service enabled: true contents: | [Unit] Description=Sync etcd data if new mount is empty DefaultDependencies=no After=var-lib-etcd.mount var.mount Before=crio.service [Service] Type=oneshot RemainAfterExit=yes ExecCondition=/usr/bin/test ! -d /var/lib/etcd/member ExecStart=/usr/sbin/setsebool -P rsync_full_access 1 ExecStart=/bin/rsync -ar /sysroot/ostree/deploy/rhcos/var/lib/etcd/ /var/lib/etcd/ ExecStart=/usr/sbin/semanage fcontext -a -t container_var_lib_t '/var/lib/etcd(/.*)?' ExecStart=/usr/sbin/setsebool -P rsync_full_access 0 TimeoutSec=0 [Install] WantedBy=multi-user.target graphical.target - name: restorecon-var-lib-etcd.service enabled: true contents: | [Unit] Description=Restore recursive SELinux security contexts DefaultDependencies=no After=var-lib-etcd.mount Before=crio.service [Service] Type=oneshot RemainAfterExit=yes ExecStart=/sbin/restorecon -R /var/lib/etcd/ TimeoutSec=0 [Install] WantedBy=multi-user.target graphical.target
- 1
- 使用之前创建的编码字符串,并将其替换为您记下的编码脚本。
验证步骤
在节点的 debug shell 中运行
grep /var/lib/etcd /proc/mounts
命令,以确保挂载磁盘:$ oc debug node/<node_name>
# grep -w "/var/lib/etcd" /proc/mounts
输出示例
/dev/sdb /var/lib/etcd xfs rw,seclabel,relatime,attr2,inode64,logbufs=8,logbsize=32k,noquota 0 0
1.3.3. 分离 etcd 数据
对于大型、高密度的集群,如果键空间增长过大并超过空间配额,etcd 的性能将会受到影响。定期维护并处理碎片化的 etcd,以释放数据存储中的空间。监控 Prometheus 以了解 etcd 指标数据,并在需要时对其进行碎片处理;否则,etcd 可能会引发一个集群范围的警报,使集群进入维护模式,仅能接受对键的读和删除操作。
监控这些关键指标:
-
etcd_server_quota_backend_bytes
,这是当前配额限制 -
etcd_mvcc_db_total_size_in_use_in_bytes
,表示历史压缩后实际数据库使用量 -
etcd_mvcc_db_total_size_in_bytes
显示数据库大小,包括等待碎片整理的可用空间
在导致磁盘碎片的事件后(如 etcd 历史记录紧凑)对 etcd 数据进行清理以回收磁盘空间。
历史压缩将自动每五分钟执行一次,并在后端数据库中造成混乱。此碎片空间可供 etcd 使用,但主机文件系统不可用。您必须对碎片 etcd 进行碎片清除,才能使这个空间可供主机文件系统使用。
碎片清理会自动发生,但您也可以手动触发它。
自动清理碎片非常适合大多数情况,因为 etcd operator 使用集群信息来确定用户最有效的操作。
1.3.3.1. 自动清理
etcd Operator 自动清理碎片磁盘。不需要人工干预。
查看以下日志之一来验证碎片整理过程是否成功:
- etcd 日志
- cluster-etcd-operator pod
- Operator 状态错误日志
自动清除可能会导致各种 OpenShift 核心组件中的领导选举失败,如 Kubernetes 控制器管理器,这会触发重启失败的组件。重启会有危害,并会触发对下一个正在运行的实例的故障切换,或者组件在重启后再次恢复工作。
成功进行碎片处理的日志输出示例
etcd member has been defragmented: <member_name>, memberID: <member_id>
进行碎片处理失败的日志输出示例
failed defrag on member: <member_name>, memberID: <member_id>: <error_message>
1.3.3.2. 手动清理
Prometheus 警报指示您需要手动进行碎片处理。该警报在两个情况下显示:
- 当 etcd 使用超过 50% 的可用空间超过了 10 分钟
- 当 etcd 活跃使用小于其数据库总大小的 50% 超过了 10 分钟
您还可以通过检查 etcd 数据库大小(MB)来决定是否需要进行碎片整理。通过 PromQL 表达 (etcd_mvcc_db_total_size_in_bytes - etcd_mvcc_db_total_size_in_use_in_bytes)/1024/1024
来释放空间。
分离 etcd 是一个阻止性操作。在进行碎片处理完成前,etcd 成员将没有响应。因此,在每个下一个 pod 要进行碎片清理前,至少等待一分钟,以便集群可以恢复正常工作。
按照以下步骤对每个 etcd 成员上的 etcd 数据进行碎片处理。
先决条件
-
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
确定哪个 etcd 成员是领导成员,因为领导会进行最后的碎片处理。
获取 etcd pod 列表:
$ oc -n openshift-etcd get pods -l k8s-app=etcd -o wide
输出示例
etcd-ip-10-0-159-225.example.redhat.com 3/3 Running 0 175m 10.0.159.225 ip-10-0-159-225.example.redhat.com <none> <none> etcd-ip-10-0-191-37.example.redhat.com 3/3 Running 0 173m 10.0.191.37 ip-10-0-191-37.example.redhat.com <none> <none> etcd-ip-10-0-199-170.example.redhat.com 3/3 Running 0 176m 10.0.199.170 ip-10-0-199-170.example.redhat.com <none> <none>
选择 pod 并运行以下命令来确定哪个 etcd 成员是领导:
$ oc rsh -n openshift-etcd etcd-ip-10-0-159-225.example.redhat.com etcdctl endpoint status --cluster -w table
输出示例
Defaulting container name to etcdctl. Use 'oc describe pod/etcd-ip-10-0-159-225.example.redhat.com -n openshift-etcd' to see all of the containers in this pod. +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | https://10.0.191.37:2379 | 251cd44483d811c3 | 3.4.9 | 104 MB | false | false | 7 | 91624 | 91624 | | | https://10.0.159.225:2379 | 264c7c58ecbdabee | 3.4.9 | 104 MB | false | false | 7 | 91624 | 91624 | | | https://10.0.199.170:2379 | 9ac311f93915cc79 | 3.4.9 | 104 MB | true | false | 7 | 91624 | 91624 | | +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
基于此输出的
IS LEADER
列,https://10.0.199.170:2379
端点是领导。与上一步输出匹配此端点,领导的 pod 名称为etcd-ip-10-0-199-170.example.redhat.com
。
清理 etcd 成员。
连接到正在运行的 etcd 容器,传递 不是 领导的 pod 的名称:
$ oc rsh -n openshift-etcd etcd-ip-10-0-159-225.example.redhat.com
取消设置
ETCDCTL_ENDPOINTS
环境变量:sh-4.4# unset ETCDCTL_ENDPOINTS
清理 etcd 成员:
sh-4.4# etcdctl --command-timeout=30s --endpoints=https://localhost:2379 defrag
输出示例
Finished defragmenting etcd member[https://localhost:2379]
如果发生超时错误,增加
--command-timeout
的值,直到命令成功为止。验证数据库大小是否已缩小:
sh-4.4# etcdctl endpoint status -w table --cluster
输出示例
+---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS | +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+ | https://10.0.191.37:2379 | 251cd44483d811c3 | 3.4.9 | 104 MB | false | false | 7 | 91624 | 91624 | | | https://10.0.159.225:2379 | 264c7c58ecbdabee | 3.4.9 | 41 MB | false | false | 7 | 91624 | 91624 | | 1 | https://10.0.199.170:2379 | 9ac311f93915cc79 | 3.4.9 | 104 MB | true | false | 7 | 91624 | 91624 | | +---------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
本例显示这个 etcd 成员的数据库大小现在为 41 MB,而起始大小为 104 MB。
重复这些步骤以连接到其他 etcd 成员并进行碎片处理。最后才对领导进行碎片清除。
至少要在碎片处理操作之间等待一分钟,以便 etcd pod 可以恢复。在 etcd pod 恢复前,etcd 成员不会响应。
如果因为超过空间配额而触发任何
NOSPACE
警告,请清除它们。检查是否有
NOSPACE
警告:sh-4.4# etcdctl alarm list
输出示例
memberID:12345678912345678912 alarm:NOSPACE
清除警告:
sh-4.4# etcdctl alarm disarm
第 2 章 根据对象限制规划您的环境
在规划 OpenShift Container Platform 集群时,请考虑以下对象限制。
这些限制基于最大可能的集群。对于较小的集群,最大值限制会较低。很多因素会影响指定的阈值,包括 etcd 版本或者存储数据格式。
在大多数情况下,超过这些限制会降低整体性能。它不一定意味着集群会出现错误。
对于快速变化的集群(如集群中包括多个启动和停止的 pod)可能会有比记录中小的实际最大大小。
2.1. OpenShift Container Platform 为主发行版本测试了集群最大值
红帽不提供针对 OpenShift Container Platform 集群大小调整的直接指导。这是因为,判断集群是否在 OpenShift Container Platform 支持的边界内,需要仔细考虑限制集群扩展的所有多维因素。
OpenShift Container Platform 支持测试的集群最大值,而不是绝对集群最大值。并非所有 OpenShift Container Platform 版本、control plane 工作负载和网络插件的组合都会被测试,因此下表并不表示所有部署的扩展绝对预期。可能无法同时扩展到所有维度上的最大值。表包含特定工作负载和部署配置的测试的最大值,并充当扩展指南,如类似部署的预期内容。
最大类型 | 4.x 测试的最大值 |
---|---|
节点数 | 2,000 [1] |
pod 数量 [2] | 150,000 |
每个节点的 pod 数量 | 500 [3] |
每个内核的 pod 数量 | 没有默认值。 |
命名空间数量 [4] | 10,000 |
构建(build)数 | 10,000(默认 pod RAM 512 Mi)- Source-to-Image (S2I) 构建策略 |
每个命名空间的 pod 数量 [5] | 25,000 |
每个 Ingress Controller 的路由和后端数量 | 每个路由器 2,000 个 |
secret 的数量 | 80,000 |
配置映射数量 | 90,000 |
服务数 [6] | 10,000 |
每个命名空间的服务数 | 5,000 |
每个服务中的后端数 | 5,000 |
每个命名空间的部署数量 [5] | 2,000 |
构建配置数 | 12,000 |
自定义资源定义 (CRD) 的数量 | 512 [7] |
- 部署暂停 Pod 以在 2000 个节点规模下对 OpenShift Container Platform 的 control plane 组件进行压力测试。扩展至类似数量的功能会根据特定的部署和工作负载参数而有所不同。
- 这里的 pod 数量是 test pod 的数量。实际的 pod 数量取决于应用程序的内存、CPU 和存储要求。
-
这在一个有 100 个 work 节点,每个 worker 节点有 500 个 pod 的集群中测试。默认
maxPods
仍为 250。要获得 500maxPods
,则必须使用自定义 kubelet 配置将maxPods
设置为500
来创建集群。如果需要 500 个用户 Pod,则需要hostPrefix
为22
,因为节点上已经运行了 10-15 个系统 pod。带有 Persistent VolumeClaim (PVC) 的最大 pod 数量取决于分配 PVC 的后端存储。在我们的测试中,只有 OpenShift Data Foundation v4(OCS v4)能够满足本文档中提到的每个节点的 pod 数量。 - 当有大量活跃的项目时,如果键空间增长过大并超过空间配额,etcd 的性能将会受到影响。强烈建议您定期维护 etcd 存储(包括整理碎片)来释放 etcd 存储。
- 系统中有一些控制循环,它们必须对给定命名空间中的所有对象进行迭代,以作为对一些状态更改的响应。在单一命名空间中有大量给定类型的对象可使这些循环的运行成本变高,并降低对给定状态变化的处理速度。限制假设系统有足够的 CPU 、内存和磁盘来满足应用程序的要求。
- 每个服务端口和每个服务后端在 iptables 中都有对应条目。给定服务的后端数量会影响端点对象的大小,这会影响到整个系统发送的数据大小。
-
OpenShift Container Platform 的限制是 512 个总自定义资源定义(CRD),其中包括由 OpenShift Container Platform 安装的产品、与 OpenShift Container Platform 集成并创建了 CRD 的产品。如果创建超过 512 CRD,则
oc
命令请求可能会节流。
2.1.1. 示例情境
例如,500 个 worker 节点(m5.2xl)经过测试,并被支持,使用 OpenShift Container Platform 4.12、OVN-Kubernetes 网络插件和以下工作负载对象:
- 除默认值外,200 个命名空间
- 每个节点 60 个 pod;30 个服务器和 30 个客户端 pod (总计 30k)
- 57 镜像流/ns (11.4k 总计)
- 15 services/ns 被服务器 pod 支持 (共 3k)
- 15 routes/ns 被以前的服务支持 (共 3k)
- 20 secrets/ns (共 4k)
- 10 config maps/ns (共 2k)
- 6 个网络策略/ns,包括 deny-all、allow-from ingress 和 in-namespace 规则
- 57 builds/ns
以下因素已知会对集群工作负载扩展有影响(正面的影响或负面的影响),在规划部署时应进行考虑。如需其他信息和指导,请联络您的销售代表或 红帽支持。
- 每个节点的 pod 数量
- 每个 pod 的容器数量
- 使用的探测类型(如 liveness/readiness、exec/http)
- 网络策略数量
- 项目或命名空间数量
- 每个项目的镜像流数
- 项目的构建数
- 服务/日期和类型数
- 路由数
- 分片数量
- secret 的数量
- 配置映射数量
API 调用率或集群 "churn",这是集群配置中快速变化的估算。
-
Prometheus 查询每秒 5 分钟窗口的 pod 创建请求:
sum(irate(apiserver_request_count{resource="pods",verb="POST"}[5m]))
-
在 5 分钟的时间内 Prometheus 每秒查询所有 API 请求:
sum(irate(apiserver_request_count{}[5m]))
-
Prometheus 查询每秒 5 分钟窗口的 pod 创建请求:
- CPU 的集群节点资源消耗
- 集群节点资源消耗
2.2. 测试集群最大值的 OpenShift Container Platform 环境和配置
2.2.1. AWS 云平台
节点 | Flavor | vCPU | RAM(GiB) | 磁盘类型 | 磁盘大小(GiB)/IOS | 数量 | 区域 |
---|---|---|---|---|---|---|---|
control plane/etcd [1] | r5.4xlarge | 16 | 128 | gp3 | 220 | 3 | us-west-2 |
Infra [2] | m5.12xlarge | 48 | 192 | gp3 | 100 | 3 | us-west-2 |
Workload [3] | m5.4xlarge | 16 | 64 | gp3 | 500 [4] | 1 | us-west-2 |
Compute | m5.2xlarge | 8 | 32 | gp3 | 100 | 3/25/250/500 [5] | us-west-2 |
- 带有基准性能为 3000 IOPS 和 125 MiB 每秒的 gp3 磁盘用于 control plane/etcd 节点,因为 etcd 对延迟敏感。gp3 卷不使用突发性能。
- Infra 节点用于托管 Monitoring、Ingress 和 Registry 组件,以确保它们有足够资源可大规模运行。
- 工作负载节点专用于运行性能和可扩展工作负载生成器。
- 使用更大的磁盘,以便有足够的空间存储在运行性能和可扩展性测试期间收集的大量数据。
- 在迭代中扩展了集群,且性能和可扩展性测试是在指定节点数中执行的。
2.2.2. IBM Power 平台
节点 | vCPU | RAM(GiB) | 磁盘类型 | 磁盘大小(GiB)/IOS | 数量 |
---|---|---|---|---|---|
control plane/etcd [1] | 16 | 32 | io1 | 每个 GiB 120 / 10 IOPS | 3 |
Infra [2] | 16 | 64 | gp2 | 120 | 2 |
Workload [3] | 16 | 256 | gp2 | 120 [4] | 1 |
Compute | 16 | 64 | gp2 | 120 | 2 到 100 [5] |
- 带有 120 / 10 IOPS 的 io1 磁盘用于 control plane/etcd 节点,因为 etcd 非常大,且敏感延迟。
- Infra 节点用于托管 Monitoring、Ingress 和 Registry 组件,以确保它们有足够资源可大规模运行。
- 工作负载节点专用于运行性能和可扩展工作负载生成器。
- 使用更大的磁盘,以便有足够的空间存储在运行性能和可扩展性测试期间收集的大量数据。
- 在迭代中扩展了集群。
2.2.3. IBM Z 平台
节点 | vCPU [4] | RAM(GiB)[5] | 磁盘类型 | 磁盘大小(GiB)/IOS | 数量 |
---|---|---|---|---|---|
Control plane/etcd [1,2] | 8 | 32 | ds8k | 300 / LCU 1 | 3 |
Compute [1,3] | 8 | 32 | ds8k | 150 / LCU 2 | 4 节点(每个节点扩展到 100/250/500 pod) |
- 节点在两个逻辑控制单元 (LCU) 之间分发,以优化 control plane/etcd 节点的磁盘 I/O 负载,因为 etcd 非常大,且对延迟敏感。etcd I/O 需求不应干扰其他工作负载。
- 四个计算节点用于运行同时具有 100/250/500 pod 的多个迭代的测试。首先,使用闲置 pod 来评估 pod 是否可以实例。接下来,使用网络和 CPU 要求客户端/服务器工作负载来评估系统在压力下的稳定性。客户端和服务器 pod 是部署范围,每个对分布在两个计算节点上。
- 没有单独的工作负载节点。工作负载在两个计算节点之间模拟微服务工作负载。
- 使用的物理处理器数量是 6 个用于 Linux (IFL)的集成设施。
- 使用的总物理内存为 512 GiB。
2.3. 如何根据经过测试的集群限制规划您的环境
在节点中过度订阅物理资源会影响在 pod 放置过程中对 Kubernetes 调度程序的资源保证。了解可以采取什么措施避免内存交换。
某些限制只在单一维度中扩展。当很多对象在集群中运行时,它们会有所不同。
本文档中给出的数字基于红帽的测试方法、设置、配置和调整。这些数字会根据您自己的设置和环境而有所不同。
在规划您的环境时,请确定每个节点会运行多少 个 pod :
required pods per cluster / pods per node = total number of nodes needed
每个节点的默认最多 pod 数为 250。而在某个节点中运行的 pod 的具体数量取决于应用程序本身。请参阅“如何根据应用程序要求规划您的环境”中的内容来计划应用程序的内存、CPU 和存储要求。
示例情境
如果您计划把集群的规模限制在有 2200 个 pod,则需要至少有五个节点,假设每个节点最多有 500 个 pod:
2200 / 500 = 4.4
如果将节点数量增加到 20,那么 pod 的分布情况将变为每个节点有 110 个 pod:
2200 / 20 = 110
其中:
required pods per cluster / total number of nodes = expected pods per node
OpenShift Container Platform 附带几个系统 pod,如 SDN、DNS、Operator 等,这些 pod 默认在每个 worker 节点上运行。因此,以上公式的结果可能会有所不同。
2.4. 如何根据应用程序要求规划您的环境
考虑应用程序环境示例:
pod 类型 | pod 数量 | 最大内存 | CPU 内核 | 持久性存储 |
---|---|---|---|---|
Apache | 100 | 500 MB | 0.5 | 1 GB |
node.js | 200 | 1 GB | 1 | 1 GB |
postgresql | 100 | 1 GB | 2 | 10 GB |
JBoss EAP | 100 | 1 GB | 1 | 1 GB |
推断的要求: 550 个 CPU 内核、450GB RAM 和 1.4TB 存储。
根据您的具体情况,节点的实例大小可以被增大或降低。在节点上通常会使用资源过度分配。在这个部署场景中,您可以选择运行多个额外的较小节点,或数量更少的较大节点来提供同样数量的资源。在做出决定前应考虑一些因素,如操作的灵活性以及每个实例的成本。
节点类型 | 数量 | CPU | RAM (GB) |
---|---|---|---|
节点(选择 1) | 100 | 4 | 16 |
节点(选择 2) | 50 | 8 | 32 |
节点(选择 3) | 25 | 16 | 64 |
有些应用程序很适合于过度分配的环境,有些则不适合。大多数 Java 应用程序以及使用巨页的应用程序都不允许使用过度分配功能。它们的内存不能用于其他应用程序。在上面的例子中,环境大约会出现 30% 过度分配的情况,这是一个常见的比例。
应用程序 pod 可以使用环境变量或 DNS 访问服务。如果使用环境变量,当 pod 在节点上运行时,对于每个活跃服务,则 kubelet 的变量都会注入。集群感知 DNS 服务器监视 Kubernetes API 提供了新服务,并为每个服务创建一组 DNS 记录。如果整个集群中启用了 DNS,则所有 pod 都应自动根据其 DNS 名称解析服务。如果您必须超过 5000 服务,可以使用 DNS 进行服务发现。当使用环境变量进行服务发现时,参数列表超过了命名空间中 5000 服务后允许的长度,则 pod 和部署将失败。要解决这个问题,请禁用部署的服务规格文件中的服务链接:
--- apiVersion: template.openshift.io/v1 kind: Template metadata: name: deployment-config-template creationTimestamp: annotations: description: This template will create a deploymentConfig with 1 replica, 4 env vars and a service. tags: '' objects: - apiVersion: apps.openshift.io/v1 kind: DeploymentConfig metadata: name: deploymentconfig${IDENTIFIER} spec: template: metadata: labels: name: replicationcontroller${IDENTIFIER} spec: enableServiceLinks: false containers: - name: pause${IDENTIFIER} image: "${IMAGE}" ports: - containerPort: 8080 protocol: TCP env: - name: ENVVAR1_${IDENTIFIER} value: "${ENV_VALUE}" - name: ENVVAR2_${IDENTIFIER} value: "${ENV_VALUE}" - name: ENVVAR3_${IDENTIFIER} value: "${ENV_VALUE}" - name: ENVVAR4_${IDENTIFIER} value: "${ENV_VALUE}" resources: {} imagePullPolicy: IfNotPresent capabilities: {} securityContext: capabilities: {} privileged: false restartPolicy: Always serviceAccount: '' replicas: 1 selector: name: replicationcontroller${IDENTIFIER} triggers: - type: ConfigChange strategy: type: Rolling - apiVersion: v1 kind: Service metadata: name: service${IDENTIFIER} spec: selector: name: replicationcontroller${IDENTIFIER} ports: - name: serviceport${IDENTIFIER} protocol: TCP port: 80 targetPort: 8080 clusterIP: '' type: ClusterIP sessionAffinity: None status: loadBalancer: {} parameters: - name: IDENTIFIER description: Number to append to the name of resources value: '1' required: true - name: IMAGE description: Image to use for deploymentConfig value: gcr.io/google-containers/pause-amd64:3.0 required: false - name: ENV_VALUE description: Value to use for environment variables generate: expression from: "[A-Za-z0-9]{255}" required: false labels: template: deployment-config-template
可在命名空间中运行的应用程序 pod 数量取决于服务数量以及环境变量用于服务发现时的服务名称长度。系统上的 ARG_MAX
定义新进程的最大参数长度,默认设置为 2097152 字节 (2 MiB)。Kubelet 将环境变量注入到要在命名空间中运行的每个 pod 中,包括:
-
<SERVICE_NAME>_SERVICE_HOST=<IP>
-
<SERVICE_NAME>_SERVICE_PORT=<PORT>
-
<SERVICE_NAME>_PORT=tcp://<IP>:<PORT>
-
<SERVICE_NAME>_PORT_<PORT>_TCP=tcp://<IP>:<PORT>
-
<SERVICE_NAME>_PORT_<PORT>_TCP_PROTO=tcp
-
<SERVICE_NAME>_PORT_<PORT>_TCP_PORT=<PORT>
-
<SERVICE_NAME>_PORT_<PORT>_TCP_ADDR=<ADDR>
如果参数长度超过允许的值,服务名称中的字符数会受到影响,命名空间中的 pod 将开始失败。例如,在一个带有 5000 服务的命名空间中,服务名称的限制为 33 个字符,它可让您在命名空间中运行 5000 个 Pod。
第 3 章 IBM Z 和 IBM (R) LinuxONE 环境的推荐主机实践
本主题为 IBM Z 和 IBM® LinuxONE 上的 OpenShift Container Platform 提供推荐的主机实践。
s390x 架构在很多方面都是唯一的。因此,此处提出的一些建议可能不适用于其他平台。
除非另有说明,否则这些实践适用于 IBM Z 和 IBM® LinuxONE 上的 z/VM 和 Red Hat Enterprise Linux (RHEL) KVM 安装。
3.1. 管理 CPU 过量使用
在高度虚拟化的 IBM Z 环境中,您必须仔细规划基础架构的设置和大小。虚拟化最重要的功能之一是能够进行资源过量使用,从而将更多资源分配给虚拟机,而不是在管理程序级别实际可用。这主要依赖于具体的工作负载,并没有适用于所有环境的“黄金法则”。
根据您的设置,在设计 CPU 过量使用 时请考虑这些最佳实践:
- 在 LPAR 级别 (PR/SM hypervisor),避免将所有可用物理内核 (IFL) 分配给每个 LPAR。例如,当有四个物理 IFL 可用时,您不应该定义三个 LPAR,每个都带有四个逻辑 IFL。
- 检查并了解 LPAR 共享和权重.
- 过多的虚拟 CPU 会对性能造成负面影响。不要将比逻辑处理器定义为 LPAR 更多的虚拟处理器。
- 为峰值工作负载配置每个客户机的虚拟处理器数量,而不是配置更多.
- 从一个小的数量开始,并监控工作负载。如有必要,逐步增加 vCPU 数量。
- 并非所有工作负载都适合适用高过量使用比率。如果工作负载是 CPU 密集型的,那么您可能无法在不对性能造成影响的情况下使用高的比率。对于高 I/O 密集型工作负载,即便具有较高的过量使用比率,也能保持一致的性能。
3.2. 禁用透明巨页
Transparent Huge Pages (THP) 会试图自动执行创建、管理和使用巨页的大部分方面。由于 THP 自动管理巨页,因此并不始终对所有类型的工作负载进行最佳处理。THP 可能会导致性能下降,因为许多应用程序都自行处理巨页。因此,请考虑禁用 THP。
3.3. 使用 Receive Flow Steering(RFS)提高网络性能
通过进一步减少网络延迟,Receive Flow Steering (RFS) 进一步扩展了 Receive Packet Steering (RPS)。RFS 在技术上基于 RPS,通过增加 CPU 缓存命中率来提高数据包处理的效率。RFS 通过确定计算最方便的 CPU,以便缓存命中更有可能在 CPU 中发生,增加了对队列长度的考虑。因此,会减少 CPU 缓存无效的频率,从而只需要较少的循环来重建缓存。这有助于缩短数据包处理运行时间。
3.3.1. 使用 Machine Config Operator (MCO) 激活 RFS
流程
将以下 MCO 示例配置集复制到 YAML 文件中。例如,
enable-rfs.yaml
:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 50-enable-rfs spec: config: ignition: version: 2.2.0 storage: files: - contents: source: data:text/plain;charset=US-ASCII,%23%20turn%20on%20Receive%20Flow%20Steering%20%28RFS%29%20for%20all%20network%20interfaces%0ASUBSYSTEM%3D%3D%22net%22%2C%20ACTION%3D%3D%22add%22%2C%20RUN%7Bprogram%7D%2B%3D%22/bin/bash%20-c%20%27for%20x%20in%20/sys/%24DEVPATH/queues/rx-%2A%3B%20do%20echo%208192%20%3E%20%24x/rps_flow_cnt%3B%20%20done%27%22%0A filesystem: root mode: 0644 path: /etc/udev/rules.d/70-persistent-net.rules - contents: source: data:text/plain;charset=US-ASCII,%23%20define%20sock%20flow%20enbtried%20for%20%20Receive%20Flow%20Steering%20%28RFS%29%0Anet.core.rps_sock_flow_entries%3D8192%0A filesystem: root mode: 0644 path: /etc/sysctl.d/95-enable-rps.conf
创建 MCO 配置集:
$ oc create -f enable-rfs.yaml
验证是否列出了名为
50-enable-rfs
的条目:$ oc get mc
要取消激活,请输入:
$ oc delete mc 50-enable-rfs
3.4. 选择您的网络设置
网络堆栈是 OpenShift Container Platform 等基于 Kubernetes 的产品最重要的组件之一。对于 IBM Z 设置,网络设置取决于您选择的虚拟机监控程序。取决于具体的工作负载和应用,最佳实践通常需要根据用例和流量模式进行更改。
根据您的设置,考虑以下最佳实践:
- 考虑有关网络设备的所有选项,以优化您的流量模式。探索 OSA-Express、RoCE Express、HiperSockets、z/VM VSwitch、Linux 网桥 (KVM) 的优势,以确定哪个选项为您的设置带来最大好处。
- 始终使用最新可用的 NIC 版本。例如,OSA Express 7S 10 GbE 与带有事务工作负载类型的 OSA Express 6S 10 GbE 相比有显著改进,尽管两者都是 10 GbE 适配器。
- 每个虚拟交换机都添加了额外的延迟层。
- 负载平衡器在集群外的网络通信中扮演重要角色。如果这对应用程序至关重要,请考虑使用生产环境级的硬件负载平衡器。
- OpenShift Container Platform SDN 引入了影响网络性能的流程和规则。确保对 pod 关联性和放置进行考虑,以便至关重要的服务会受益于本地通信的优势。
- 平衡性能和功能之间的权衡.
3.5. 确保 z/VM 上使用 HyperPAV 的高磁盘性能
DASD 和 ECKD 设备在 IBM Z 环境中通常使用磁盘类型。在 z/VM 环境中的典型 OpenShift Container Platform 设置中,DASD 磁盘通常用于支持节点的本地存储。您可以设置 HyperPAV 别名设备,以便为支持 z/VM 客户机的 DASD 磁盘提供更多吞吐量和总体更好的 I/O 性能。
将 HyperPAV 用于本地存储设备可带来显著的性能优势。但是,您必须考虑吞吐量和 CPU 成本之间有一个权衡。
3.5.1. 使用 Machine Config Operator (MCO) 在使用 z/VM full-pack minidisks 的节点中激活 HyperPAV 别名
对于使用 full-pack minidisk 的基于 z/VM 的 OpenShift Container Platform 设置,您可以通过在所有节点中激活 HyperPAV 别名来利用 MCO 配置集的优势。您必须为 control plane 和计算节点添加 YAML 配置。
流程
将以下 MCO 示例配置集复制到 control plane 节点的 YAML 文件中。例如,
05-master-kernelarg-hpav.yaml
:$ cat 05-master-kernelarg-hpav.yaml apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 05-master-kernelarg-hpav spec: config: ignition: version: 3.1.0 kernelArguments: - rd.dasd=800-805
将以下 MCO 示例配置集复制到计算节点的 YAML 文件中。例如,
05-worker-kernelarg-hpav.yaml
:$ cat 05-worker-kernelarg-hpav.yaml apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 05-worker-kernelarg-hpav spec: config: ignition: version: 3.1.0 kernelArguments: - rd.dasd=800-805
注意您必须修改
rd.dasd
参数以适合设备 ID。创建 MCO 配置集:
$ oc create -f 05-master-kernelarg-hpav.yaml
$ oc create -f 05-worker-kernelarg-hpav.yaml
要取消激活,请输入:
$ oc delete -f 05-master-kernelarg-hpav.yaml
$ oc delete -f 05-worker-kernelarg-hpav.yaml
3.6. IBM Z 主机上的 RHEL KVM 建议
优化 KVM 虚拟服务器环境很大程度上取决于虚拟服务器的工作负载和可用资源。增强一个环境中性能的相同操作可能会对另一种环境产生负面影响。为特定设置找到最佳平衡可能是一项挑战,通常需要进行各种试验。
下面的部分介绍了在 IBM Z 和 IBM® LinuxONE 环境中将 OpenShift Container Platform 与 RHEL KVM 搭配使用时的一些最佳实践。
3.6.1. 对虚拟块设备使用 I/O 线程
要使虚拟块设备使用 I/O 线程,您必须为虚拟服务器和每个虚拟块设备配置一个或多个 I/O 线程,以使用其中一个 I/O 线程。
以下示例指定了 <iothreads>3</iothreads>
来配置三个 I/O 线程,带有连续十进制线程 ID 1、2 和 3。iothread="2"
参数指定要使用 ID 为 2 的 I/O 线程的磁盘设备的驱动程序元素。
I/O 线程规格示例
... <domain> <iothreads>3</iothreads>1 ... <devices> ... <disk type="block" device="disk">2 <driver ... iothread="2"/> </disk> ... </devices> ... </domain>
线程可以提高磁盘设备的 I/O 操作性能,但也可使用内存和 CPU 资源。您可以将多个设备配置为使用同一线程。线程到设备的最佳映射取决于可用资源和工作负载。
从少量 I/O 线程开始。通常,为所有磁盘设备使用单个 I/O 线程就足够了。不要配置超过虚拟 CPU 数量的线程,也不要配置空闲线程。
您可以使用 virsh iothreadadd
命令将具有特定线程 ID 的 I/O 线程添加到正在运行的虚拟服务器。
3.6.2. 避免虚拟 SCSI 设备
仅在需要通过 SCSI 特定的接口解决设备时配置虚拟 SCSI 设备。将磁盘空间配置为虚拟块设备,而非虚拟 SCSI 设备,无论主机上的支持是什么。
但是,您可能需要以下特定于 SCSI 的接口:
- 主机上 SCSI 附加磁带驱动器的 LUN。
- 在主机文件系统中挂载在虚拟 DVD 驱动器中的 DVD ISO 文件。
3.6.3. 为磁盘配置客户机缓存
将磁盘设备配置为由客户机而不是主机执行缓存。
确保磁盘设备的 driver 元素包含 cache="none"
和 io="native"
参数。
<disk type="block" device="disk"> <driver name="qemu" type="raw" cache="none" io="native" iothread="1"/> ... </disk>
3.6.4. 排除内存气球(Balloon)设备
除非您需要动态内存大小,否则请不要定义内存气球设备,并确保 libvirt 不会为您创建。将 memballoon
参数作为设备元素的子项包含在您的域配置 XML 文件中。
检查活跃配置集列表:
<memballoon model="none"/>
3.6.5. 调整主机调度程序的 CPU 迁移算法
除非您非常了解相关的影响,请不要更改调度程序设置。在进行完整的测试并确定相关的影响前,不要对生产系统应用更改。
kernel.sched_migration_cost_ns
参数指定以纳秒为单位的时间间隔。任务最后一次执行后,CPU 缓存被视为具有有用内容,直到此间隔过期为止。增加这个间隔会导致任务迁移减少。默认值为 500000 ns。
如果存在可运行的进程时 CPU 空闲时间高于预期的间隔,请尝试缩短这个间隔。如果任务非常频繁地在 CPU 或节点之间进行转换,请尝试增加它。
要动态将间隔设置为 60000 ns,请输入以下命令:
# sysctl kernel.sched_migration_cost_ns=60000
要将值永久更改为 60000 ns,在 /etc/sysctl.conf
中添加以下条目:
kernel.sched_migration_cost_ns=60000
3.6.6. 禁用 cpuset cgroup 控制器
此设置仅适用于使用 cgroups 版本 1 的 KVM 主机。要在主机上启用 CPU 热插拔,请禁用 cgroup 控制器。
流程
-
使用您选择的编辑器打开
/etc/libvirt/qemu.conf
。 -
转至
cgroup_controllers
行。 - 复制整行并从副本中删除前导编号符号(#)。
删除
cpuset
条目,如下所示:cgroup_controllers = [ "cpu", "devices", "memory", "blkio", "cpuacct" ]
要使新设置生效,您必须重启 libvirtd 守护进程:
- 停止所有虚拟机。
运行以下命令:
# systemctl restart libvirtd
- 重新启动虚拟机。
此设置在主机重新引导后保留。
3.6.7. 为空闲的虚拟 CPU 调整轮询周期
当虚拟 CPU 空闲时,KVM 会轮询虚拟 CPU 的唤醒条件,然后再分配主机资源。您可以指定时间间隔,在间隔期间在 /sys/module/kvm/parameters/halt_poll_ns
的 sysfs 中进行轮询。在指定时间内,轮询可减少虚拟 CPU 的唤醒延迟,但会牺牲资源使用量。根据工作负载,更长或更短的轮询时间可能很有用。时间间隔以纳秒为单位指定。默认值为 50000 ns。
要针对低 CPU 消耗进行优化,请输入一个小的值或写入 0 来禁用轮询:
# echo 0 > /sys/module/kvm/parameters/halt_poll_ns
要针对低延迟进行优化(例如,用于事务的工作负载),请输入一个大的值:
# echo 80000 > /sys/module/kvm/parameters/halt_poll_ns
第 4 章 使用 Node Tuning Operator
了解 Node Tuning Operator,以及如何使用它通过编排 tuned 守护进程以管理节点级别的性能优化。
4.1. 关于 Node Tuning Operator
Node Tuning Operator 可以帮助您通过编排 TuneD 守护进程来管理节点级别的性能优化,并使用 Performance Profile 控制器获得低延迟性能。大多数高性能应用程序都需要一定程度的内核级性能优化。Node Tuning Operator 为用户提供了一个统一的、节点一级的 sysctl 管理接口,并可以根据具体用户的需要灵活地添加自定义性能优化设置。
Operator 将为 OpenShift Container Platform 容器化 TuneD 守护进程作为一个 Kubernetes 守护进程集进行管理。它保证了自定义性能优化设置以可被守护进程支持的格式传递到在集群中运行的所有容器化的 TuneD 守护进程中。相应的守护进程会在集群的所有节点上运行,每个节点上运行一个。
在发生触发配置集更改的事件时,或通过接收和处理终止信号安全终止容器化 TuneD 守护进程时,容器化 TuneD 守护进程所应用的节点级设置将被回滚。
Node Tuning Operator 使用 Performance Profile 控制器来实现自动性能优化,从而实现 OpenShift Container Platform 应用程序的低延迟性能。集群管理员配置了性能配置集以定义节点级别的设置,例如:
- 将内核更新至 kernel-rt。
- 为内务选择 CPU。
- 为运行工作负载选择 CPU。
目前,cgroup v2 不支持禁用 CPU 负载均衡。因此,如果您启用了 cgroup v2,则可能无法从性能配置集中获取所需的行为。如果您使用 executeace 配置集,则不建议启用 cgroup v2。
在版本 4.1 及更高版本中,OpenShift Container Platform 标准安装中包含了 Node Tuning Operator。
在早期版本的 OpenShift Container Platform 中,Performance Addon Operator 用来实现自动性能优化,以便为 OpenShift 应用程序实现低延迟性能。在 OpenShift Container Platform 4.11 及更新的版本中,这个功能是 Node Tuning Operator 的一部分。
4.2. 访问 Node Tuning Operator 示例规格
使用此流程来访问 Node Tuning Operator 的示例规格。
流程
运行以下命令以访问 Node Tuning Operator 示例规格:
oc get tuned.tuned.openshift.io/default -o yaml -n openshift-cluster-node-tuning-operator
默认 CR 旨在为 OpenShift Container Platform 平台提供标准的节点级性能优化,它只能被修改来设置 Operator Management 状态。Operator 将覆盖对默认 CR 的任何其他自定义更改。若进行自定义性能优化,请创建自己的 Tuned CR。新创建的 CR 将与默认的 CR 合并,并基于节点或 pod 标识和配置文件优先级对节点应用自定义调整。
虽然在某些情况下,对 pod 标识的支持可以作为自动交付所需调整的一个便捷方式,但我们不鼓励使用这种方法,特别是在大型集群中。默认 Tuned CR 并不带有 pod 标识匹配。如果创建了带有 pod 标识匹配的自定义配置集,则该功能将在此时启用。在以后的 Node Tuning Operator 版本中将弃用 pod 标识功能。
4.3. 在集群中设置默认配置集
以下是在集群中设置的默认配置集。
apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: default namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=Optimize systems running OpenShift (provider specific parent profile) include=-provider-${f:exec:cat:/var/lib/tuned/provider},openshift name: openshift recommend: - profile: openshift-control-plane priority: 30 match: - label: node-role.kubernetes.io/master - label: node-role.kubernetes.io/infra - profile: openshift-node priority: 40
从 OpenShift Container Platform 4.9 开始,所有 OpenShift TuneD 配置集都随 TuneD 软件包一起提供。您可以使用 oc exec
命令查看这些配置集的内容:
$ oc exec $tuned_pod -n openshift-cluster-node-tuning-operator -- find /usr/lib/tuned/openshift{,-control-plane,-node} -name tuned.conf -exec grep -H ^ {} \;
4.4. 验证是否应用了 TuneD 配置集
验证应用到集群节点的 TuneD 配置集。
$ oc get profile.tuned.openshift.io -n openshift-cluster-node-tuning-operator
输出示例
NAME TUNED APPLIED DEGRADED AGE master-0 openshift-control-plane True False 6h33m master-1 openshift-control-plane True False 6h33m master-2 openshift-control-plane True False 6h33m worker-a openshift-node True False 6h28m worker-b openshift-node True False 6h28m
-
NAME
:配置集(Profile)对象的名称。每个节点有一个 Profile 对象,其名称相互匹配。 -
TUNED
:要应用的 TuneD 配置集的名称。 -
APPLIED
:如果 TuneD 守护进程应用了所需的配置集,则为True
。(True/False/Unknown
)。 -
DEGRADED
:如果在应用 TuneD 配置集时报告了任何错误则为True
(True/False/Unknown
)。 -
AGE
:创建 Profile 对象后经过的时间。
4.5. 自定义调整规格
Operator 的自定义资源 (CR) 包含两个主要部分。第一部分是 profile:
,这是 TuneD 配置集及其名称的列表。第二部分是 recommend:
,用来定义配置集选择逻辑。
多个自定义调优规格可以共存,作为 Operator 命名空间中的多个 CR。Operator 会检测到是否存在新 CR 或删除了旧 CR。所有现有的自定义性能优化设置都会合并,同时更新容器化 TuneD 守护进程的适当对象。
管理状态
通过调整默认的 Tuned CR 来设置 Operator Management 状态。默认情况下,Operator 处于 Managed 状态,默认的 Tuned CR 中没有 spec.managementState
字段。Operator Management 状态的有效值如下:
- Managed: Operator 会在配置资源更新时更新其操作对象
- Unmanaged: Operator 将忽略配置资源的更改
- Removed: Operator 将移除 Operator 置备的操作对象和资源
配置集数据
profile:
部分列出了 TuneD 配置集及其名称。
profile: - name: tuned_profile_1 data: | # TuneD profile specification [main] summary=Description of tuned_profile_1 profile [sysctl] net.ipv4.ip_forward=1 # ... other sysctl's or other TuneD daemon plugins supported by the containerized TuneD # ... - name: tuned_profile_n data: | # TuneD profile specification [main] summary=Description of tuned_profile_n profile # tuned_profile_n profile settings
建议的配置集
profile:
选择逻辑通过 CR 的 recommend:
部分来定义。recommend:
部分是根据选择标准推荐配置集的项目列表。
recommend: <recommend-item-1> # ... <recommend-item-n>
列表中的独立项:
- machineConfigLabels: 1 <mcLabels> 2 match: 3 <match> 4 priority: <priority> 5 profile: <tuned_profile_name> 6 operand: 7 debug: <bool> 8 tunedConfig: reapply_sysctl: <bool> 9
- 1
- 可选。
- 2
MachineConfig
标签的键/值字典。键必须是唯一的。- 3
- 如果省略,则会假设配置集匹配,除非设置了优先级更高的配置集,或设置了
machineConfigLabels
。 - 4
- 可选列表。
- 5
- 配置集排序优先级。较低数字表示优先级更高(
0
是最高优先级)。 - 6
- 在匹配项中应用的 TuneD 配置集。例如
tuned_profile_1
。 - 7
- 可选操作对象配置。
- 8
- 为 TuneD 守护进程打开或关闭调试。
true
为打开,false
为关闭。默认值为false
。 - 9
- 为 TuneD 守护进程打开或关闭
reapply_sysctl
功能。选择true
代表开启,false
代表关闭。
<match>
是一个递归定义的可选数组,如下所示:
- label: <label_name> 1 value: <label_value> 2 type: <label_type> 3 <match> 4
如果不省略 <match>
,则所有嵌套的 <match>
部分也必须评估为 true
。否则会假定 false
,并且不会应用或建议具有对应 <match>
部分的配置集。因此,嵌套(子级 <match>
部分)会以逻辑 AND 运算来运作。反之,如果匹配 <match>
列表中任何一项,整个 <match>
列表评估为 true
。因此,该列表以逻辑 OR 运算来运作。
如果定义 了 machineConfigLabels
,基于机器配置池的匹配会对给定的 recommend:
列表项打开。<mcLabels>
指定机器配置标签。机器配置会自动创建,以在配置集 <tuned_profile_name>
中应用主机设置,如内核引导参数。这包括使用与 <mcLabels>
匹配的机器配置选择器查找所有机器配置池,并在分配了找到的机器配置池的所有节点上设置配置集 <tuned_profile_name>
。要针对同时具有 master 和 worker 角色的节点,您必须使用 master 角色。
列表项 match
和 machineConfigLabels
由逻辑 OR 操作符连接。match
项首先以短电路方式评估。因此,如果它被评估为 true
,则不考虑 MachineConfigLabels
项。
当使用基于机器配置池的匹配时,建议将具有相同硬件配置的节点分组到同一机器配置池中。不遵循这个原则可能会导致在共享同一机器配置池的两个或者多个节点中 TuneD 操作对象导致内核参数冲突。
示例:基于节点或 pod 标签的匹配
- match: - label: tuned.openshift.io/elasticsearch match: - label: node-role.kubernetes.io/master - label: node-role.kubernetes.io/infra type: pod priority: 10 profile: openshift-control-plane-es - match: - label: node-role.kubernetes.io/master - label: node-role.kubernetes.io/infra priority: 20 profile: openshift-control-plane - priority: 30 profile: openshift-node
根据配置集优先级,以上 CR 针对容器化 TuneD 守护进程转换为 recommend.conf
文件。优先级最高 (10
) 的配置集是 openshift-control-plane-es
,因此会首先考虑它。在给定节点上运行的容器化 TuneD 守护进程会查看同一节点上是否在运行设有 tuned.openshift.io/elasticsearch
标签的 pod。如果没有,则整个 <match>
部分评估为 false
。如果存在具有该标签的 pod,为了让 <match>
部分评估为 true
,节点标签也需要是 node-role.kubernetes.io/master
或 node-role.kubernetes.io/infra
。
如果这些标签对优先级为 10
的配置集而言匹配,则应用 openshift-control-plane-es
配置集,并且不考虑其他配置集。如果节点/pod 标签组合不匹配,则考虑优先级第二高的配置集 (openshift-control-plane
)。如果容器化 TuneD Pod 在具有标签 node-role.kubernetes.io/master
或 node-role.kubernetes.io/infra
的节点上运行,则应用此配置集。
最后,配置集 openshift-node
的优先级最低 (30
)。它没有 <match>
部分,因此始终匹配。如果给定节点上不匹配任何优先级更高的配置集,它会作为一个适用于所有节点的配置集来设置 openshift-node
配置集。
示例:基于机器配置池的匹配
apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: openshift-node-custom namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=Custom OpenShift node profile with an additional kernel parameter include=openshift-node [bootloader] cmdline_openshift_node_custom=+skew_tick=1 name: openshift-node-custom recommend: - machineConfigLabels: machineconfiguration.openshift.io/role: "worker-custom" priority: 20 profile: openshift-node-custom
为尽量减少节点的重新引导情况,为目标节点添加机器配置池将匹配的节点选择器标签,然后创建上述 Tuned CR,最后创建自定义机器配置池。
特定于云供应商的 TuneD 配置集
使用此功能,所有针对于 OpenShift Container Platform 集群上的云供应商都可以方便地分配 TuneD 配置集。这可实现,而无需添加额外的节点标签或将节点分组到机器配置池中。
这个功能会利用 spec.providerID
节点对象值(格式为 <cloud-provider>://<cloud-provider-specific-id>
),并在 NTO operand 容器中写带有 <cloud-provider>
值的文件 /var/lib/tuned/provider
。然后,TuneD 会使用这个文件的内容来加载 provider-<cloud-provider>
配置集(如果这个配置集存在)。
openshift
配置集(openshift-control-plane
和 openshift-node
配置集都从其中继承设置)现在被更新来使用这个功能(通过使用条件配置集加载)。NTO 或 TuneD 目前不提供任何特定云供应商的配置集。但是,您可以创建一个自定义配置集 provider-<cloud-provider>
,它将适用于所有针对于所有云供应商的集群节点。
GCE 云供应商配置集示例
apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: provider-gce namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=GCE Cloud provider-specific profile # Your tuning for GCE Cloud provider goes here. name: provider-gce
由于配置集的继承,provider-<cloud-provider>
配置集中指定的任何设置都会被 openshift
配置集及其子配置集覆盖。
4.6. 自定义调整示例
从默认 CR 中使用 TuneD 配置集
以下 CR 对带有标签 tuned.openshift.io/ingress-node-label
的 OpenShift Container Platform 节点应用节点一级的自定义调整。
示例:使用 openshift-control-plane TuneD 配置集进行自定义性能优化
apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: ingress namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=A custom OpenShift ingress profile include=openshift-control-plane [sysctl] net.ipv4.ip_local_port_range="1024 65535" net.ipv4.tcp_tw_reuse=1 name: openshift-ingress recommend: - match: - label: tuned.openshift.io/ingress-node-label priority: 10 profile: openshift-ingress
对于开发自定义配置集的人员。我们强烈建议包括在默认 Tuned CR 中提供的默认 TuneD 守护进程配置集。上面的示例使用默认 openshift-control-plane
配置集。
使用内置 TuneD 配置集
由于 NTO 管理的守护进程集已被成功推出,TuneD 操作对象会管理 TuneD 守护进程的同一版本。要列出守护进程支持的内置 TuneD 配置集,请以以下方式查询任何 TuneD pod:
$ oc exec $tuned_pod -n openshift-cluster-node-tuning-operator -- find /usr/lib/tuned/ -name tuned.conf -printf '%h\n' | sed 's|^.*/||'
您可以使用自定义调优规格中检索的配置集名称。
示例:使用内置 hpc-compute TuneD 配置集
apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: openshift-node-hpc-compute namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=Custom OpenShift node profile for HPC compute workloads include=openshift-node,hpc-compute name: openshift-node-hpc-compute recommend: - match: - label: tuned.openshift.io/openshift-node-hpc-compute priority: 20 profile: openshift-node-hpc-compute
除了内置的 hpc-compute
配置集外,上面的示例还包括默认 Tuned CR 中提供的 openshift-node
TuneD 守护进程配置集,以对计算节点使用特定于 OpenShift 的调优。
4.7. 支持的 TuneD 守护进程插件
在使用 Tuned CR 的 profile:
部分中定义的自定义配置集时,以下 TuneD 插件都受到支持,但 [main]
部分除外:
- audio
- cpu
- disk
- eeepc_she
- modules
- mounts
- net
- scheduler
- scsi_host
- selinux
- sysctl
- sysfs
- usb
- video
- vm
- bootloader
其中一些插件提供了不受支持的动态性能优化功能。目前不支持以下 TuneD 插件:
- script
- systemd
TuneD bootloader 插件只支持 Red Hat Enterprise Linux CoreOS (RHCOS) worker 节点。
其他资源
4.8. 在托管集群中配置节点性能优化
托管的 control plane 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
要在托管集群中的节点上设置节点级别性能优化,您可以使用 Node Tuning Operator。在托管的 control plane 中,您可以通过创建包含 Tuned
对象并在节点池中引用这些配置映射的配置映射来配置节点调整。
流程
创建包含有效 tuned 清单的配置映射,并引用节点池中的清单。在以下示例中,
Tuned
清单定义了一个配置文件,在包含tuned-1-node-label
节点标签的节点上将vm.dirty_ratio
设为 55。将以下ConfigMap
清单保存到名为tuned-1.yaml
的文件中:apiVersion: v1 kind: ConfigMap metadata: name: tuned-1 namespace: clusters data: tuning: | apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: tuned-1 namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=Custom OpenShift profile include=openshift-node [sysctl] vm.dirty_ratio="55" name: tuned-1-profile recommend: - priority: 20 profile: tuned-1-profile
注意如果您没有将任何标签添加到 Tuned spec 的
spec.recommend
部分中的条目中,则假定基于 node-pool 的匹配,因此spec.recommend
部分中的最高优先级配置集应用于池中的节点。虽然您可以通过在 Tuned.spec.recommend.match
部分中设置标签值来实现更精细的节点标记匹配,除非您将节点池的.spec.management.upgradeType
值设置为InPlace
。在管理集群中创建
ConfigMap
对象:$ oc --kubeconfig="$MGMT_KUBECONFIG" create -f tuned-1.yaml
通过编辑节点池或创建节点池的
spec.tuningConfig
字段中引用ConfigMap
对象。在本例中,假设您只有一个NodePool
,名为nodepool-1
,它含有 2 个节点。apiVersion: hypershift.openshift.io/v1alpha1 kind: NodePool metadata: ... name: nodepool-1 namespace: clusters ... spec: ... tuningConfig: - name: tuned-1 status: ...
注意您可以在多个节点池中引用同一配置映射。在托管的 control plane 中,Node Tuning Operator 会将节点池名称和命名空间的哈希值附加到 Tuned CR 的名称中,以区分它们。在这种情况下,请不要为同一托管集群在不同的 Tuned CR 中创建多个名称相同的 TuneD 配置集。
验证
现在,您已创建包含 Tuned
清单的 ConfigMap
对象并在 NodePool
中引用它,Node Tuning Operator 会将 Tuned
对象同步到托管集群中。您可以验证定义了 Tuned
对象,以及将 TuneD 配置集应用到每个节点。
列出托管的集群中的
Tuned
对象:$ oc --kubeconfig="$HC_KUBECONFIG" get tuned.tuned.openshift.io -n openshift-cluster-node-tuning-operator
输出示例
NAME AGE default 7m36s rendered 7m36s tuned-1 65s
列出托管的集群中的
Profile
对象:$ oc --kubeconfig="$HC_KUBECONFIG" get profile.tuned.openshift.io -n openshift-cluster-node-tuning-operator
输出示例
NAME TUNED APPLIED DEGRADED AGE nodepool-1-worker-1 tuned-1-profile True False 7m43s nodepool-1-worker-2 tuned-1-profile True False 7m14s
注意如果没有创建自定义配置集,则默认应用
openshift-node
配置集。要确认正确应用了调整,请在节点上启动一个 debug shell,并检查 sysctl 值:
$ oc --kubeconfig="$HC_KUBECONFIG" debug node/nodepool-1-worker-1 -- chroot /host sysctl vm.dirty_ratio
输出示例
vm.dirty_ratio = 55
4.9. 通过设置内核引导参数来对托管集群进行高级节点调整
托管的 control plane 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
对于托管 control plane 中的高级性能优化(需要设置内核引导参数),您还可以使用 Node Tuning Operator。以下示例演示了如何创建保留巨页的节点池。
流程
创建一个
ConfigMap
对象,其中包含一个Tuned
对象清单,用于创建大小为 2 MB 的 10 个巨页。将此ConfigMap
清单保存到名为tuned-hugepages.yaml
的文件中:apiVersion: v1 kind: ConfigMap metadata: name: tuned-hugepages namespace: clusters data: tuning: | apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: hugepages namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=Boot time configuration for hugepages include=openshift-node [bootloader] cmdline_openshift_node_hugepages=hugepagesz=2M hugepages=50 name: openshift-node-hugepages recommend: - priority: 20 profile: openshift-node-hugepages
注意.spec.recommend.match
字段被有意留空。在本例中,这个Tuned
对象应用到引用此ConfigMap
对象的节点池中的所有节点。将具有相同硬件配置的节点分组到同一节点池中。否则,TuneD 操作对象可以为共享同一节点池的两个或多个节点计算冲突的内核参数。在管理集群中创建
ConfigMap
对象:$ oc --kubeconfig="$MGMT_KUBECONFIG" create -f tuned-hugepages.yaml
创建
NodePool
清单 YAML 文件,自定义NodePool
的升级类型,并引用您在spec.tuningConfig
部分中创建的ConfigMap
对象。创建NodePool
清单,并使用hypershift
CLI 将它保存到名为hugepages-nodepool.yaml
的文件中:NODEPOOL_NAME=hugepages-example INSTANCE_TYPE=m5.2xlarge NODEPOOL_REPLICAS=2 hypershift create nodepool aws \ --cluster-name $CLUSTER_NAME \ --name $NODEPOOL_NAME \ --node-count $NODEPOOL_REPLICAS \ --instance-type $INSTANCE_TYPE \ --render > hugepages-nodepool.yaml
在
hugepages-nodepool.yaml
文件中,将.spec.management.upgradeType
设置为InPlace
,并将.spec.tuningConfig
设置为引用您创建的tuned-hugepages
ConfigMap
对象。apiVersion: hypershift.openshift.io/v1alpha1 kind: NodePool metadata: name: hugepages-nodepool namespace: clusters ... spec: management: ... upgradeType: InPlace ... tuningConfig: - name: tuned-hugepages
注意要避免应用新的
MachineConfig
对象时不必要的重新创建节点,请将.spec.management.upgradeType
设置为InPlace
。如果使用Replace
升级类型,则节点会被完全删除,当应用 TuneD 操作对象计算的新内核引导参数时,新节点可以替换它们。在管理集群中创建
NodePool
:$ oc --kubeconfig="$MGMT_KUBECONFIG" create -f hugepages-nodepool.yaml
验证
节点可用后,容器化 TuneD 守护进程会根据应用的 TuneD 配置集计算所需的内核引导参数。在节点就绪并重新引导以应用生成的 MachineConfig
对象后,您可以验证是否已应用 TuneD 配置集,并且设置了内核引导参数。
列出托管的集群中的
Tuned
对象:$ oc --kubeconfig="$HC_KUBECONFIG" get tuned.tuned.openshift.io -n openshift-cluster-node-tuning-operator
输出示例
NAME AGE default 123m hugepages-8dfb1fed 1m23s rendered 123m
列出托管的集群中的
Profile
对象:$ oc --kubeconfig="$HC_KUBECONFIG" get profile.tuned.openshift.io -n openshift-cluster-node-tuning-operator
输出示例
NAME TUNED APPLIED DEGRADED AGE nodepool-1-worker-1 openshift-node True False 132m nodepool-1-worker-2 openshift-node True False 131m hugepages-nodepool-worker-1 openshift-node-hugepages True False 4m8s hugepages-nodepool-worker-2 openshift-node-hugepages True False 3m57s
新
NodePool
中的两个 worker 节点都应用了openshift-node-hugepages
配置集。要确认正确应用了调整,请在节点上启动一个 debug shell 并检查
/proc/cmdline
。$ oc --kubeconfig="$HC_KUBECONFIG" debug node/nodepool-1-worker-1 -- chroot /host cat /proc/cmdline
输出示例
BOOT_IMAGE=(hd0,gpt3)/ostree/rhcos-... hugepagesz=2M hugepages=50
其他资源
有关托管 control plane 的更多信息,请参阅为 Red Hat OpenShift Container Platform 托管 control plane (技术预览)。
第 5 章 使用 CPU Manager 和拓扑管理器
CPU Manager 管理 CPU 组并限制特定 CPU 的负载。
CPU Manager 对于有以下属性的负载有用:
- 需要尽可能多的 CPU 时间。
- 对处理器缓存丢失非常敏感。
- 低延迟网络应用程序。
- 需要与其他进程协调,并从共享一个处理器缓存中受益。
拓扑管理器(Topology Manager)从 CPU Manager、设备管理器和其他 Hint 提供者收集提示信息,以匹配相同非统一 内存访问(NUMA)节点上的所有 QoS 类的 pod 资源(如 CPU、SR-IOV VF 和其他设备资源)。
拓扑管理器使用收集来的提示信息中获得的拓扑信息,根据配置的 Topology Manager 策略以及请求的 Pod 资源,决定节点是否被节点接受或拒绝。
拓扑管理器对希望使用硬件加速器来支持对工作延迟有极高要求的操作及高吞吐并发计算的负载很有用。
要使用拓扑管理器,您必须使用 静态
策略配置 CPU Manager。
5.1. 设置 CPU Manager
流程
可选:标记节点:
# oc label node perf-node.example.com cpumanager=true
编辑启用 CPU Manager 的节点的
MachineConfigPool
。在这个示例中,所有 worker 都启用了 CPU Manager:# oc edit machineconfigpool worker
为 worker 机器配置池添加标签:
metadata: creationTimestamp: 2020-xx-xxx generation: 3 labels: custom-kubelet: cpumanager-enabled
创建
KubeletConfig
,cpumanager-kubeletconfig.yaml
,自定义资源 (CR) 。请参阅上一步中创建的标签,以便使用新的 kubelet 配置更新正确的节点。请参见MachineConfigPoolSelector
部分:apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: cpumanager-enabled spec: machineConfigPoolSelector: matchLabels: custom-kubelet: cpumanager-enabled kubeletConfig: cpuManagerPolicy: static 1 cpuManagerReconcilePeriod: 5s 2
创建动态 kubelet 配置:
# oc create -f cpumanager-kubeletconfig.yaml
这会在 kubelet 配置中添加 CPU Manager 功能,如果需要,Machine Config Operator(MCO)将重启节点。要启用 CPU Manager,则不需要重启。
检查合并的 kubelet 配置:
# oc get machineconfig 99-worker-XXXXXX-XXXXX-XXXX-XXXXX-kubelet -o json | grep ownerReference -A7
输出示例
"ownerReferences": [ { "apiVersion": "machineconfiguration.openshift.io/v1", "kind": "KubeletConfig", "name": "cpumanager-enabled", "uid": "7ed5616d-6b72-11e9-aae1-021e1ce18878" } ]
检查 worker 是否有更新的
kubelet.conf
:# oc debug node/perf-node.example.com sh-4.2# cat /host/etc/kubernetes/kubelet.conf | grep cpuManager
输出示例
cpuManagerPolicy: static 1 cpuManagerReconcilePeriod: 5s 2
创建请求一个或多个内核的 pod。限制和请求都必须将其 CPU 值设置为一个整数。这是专用于此 pod 的内核数:
# cat cpumanager-pod.yaml
输出示例
apiVersion: v1 kind: Pod metadata: generateName: cpumanager- spec: containers: - name: cpumanager image: gcr.io/google_containers/pause-amd64:3.0 resources: requests: cpu: 1 memory: "1G" limits: cpu: 1 memory: "1G" nodeSelector: cpumanager: "true"
创建 pod:
# oc create -f cpumanager-pod.yaml
确定为您标记的节点调度了 pod:
# oc describe pod cpumanager
输出示例
Name: cpumanager-6cqz7 Namespace: default Priority: 0 PriorityClassName: <none> Node: perf-node.example.com/xxx.xx.xx.xxx ... Limits: cpu: 1 memory: 1G Requests: cpu: 1 memory: 1G ... QoS Class: Guaranteed Node-Selectors: cpumanager=true
确认正确配置了
cgroups
。获取pause
进程的进程 ID(PID):# ├─init.scope │ └─1 /usr/lib/systemd/systemd --switched-root --system --deserialize 17 └─kubepods.slice ├─kubepods-pod69c01f8e_6b74_11e9_ac0f_0a2b62178a22.slice │ ├─crio-b5437308f1a574c542bdf08563b865c0345c8f8c0b0a655612c.scope │ └─32706 /pause
服务质量(QoS)等级为
Guaranteed
的 pod 被放置到kubepods.slice
中。其它 QoS 等级的 pod 会位于kubepods
的子cgroups
中:# cd /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-pod69c01f8e_6b74_11e9_ac0f_0a2b62178a22.slice/crio-b5437308f1ad1a7db0574c542bdf08563b865c0345c86e9585f8c0b0a655612c.scope # for i in `ls cpuset.cpus tasks` ; do echo -n "$i "; cat $i ; done
输出示例
cpuset.cpus 1 tasks 32706
检查任务允许的 CPU 列表:
# grep ^Cpus_allowed_list /proc/32706/status
输出示例
Cpus_allowed_list: 1
确认系统中的另一个 pod(在这个示例中,QoS 等级为
burstable
的 pod)不能在为等级为Guaranteed
的 pod 分配的内核中运行:# cat /sys/fs/cgroup/cpuset/kubepods.slice/kubepods-besteffort.slice/kubepods-besteffort-podc494a073_6b77_11e9_98c0_06bba5c387ea.slice/crio-c56982f57b75a2420947f0afc6cafe7534c5734efc34157525fa9abbf99e3849.scope/cpuset.cpus 0 # oc describe node perf-node.example.com
输出示例
... Capacity: attachable-volumes-aws-ebs: 39 cpu: 2 ephemeral-storage: 124768236Ki hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 8162900Ki pods: 250 Allocatable: attachable-volumes-aws-ebs: 39 cpu: 1500m ephemeral-storage: 124768236Ki hugepages-1Gi: 0 hugepages-2Mi: 0 memory: 7548500Ki pods: 250 ------- ---- ------------ ---------- --------------- ------------- --- default cpumanager-6cqz7 1 (66%) 1 (66%) 1G (12%) 1G (12%) 29m Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) Resource Requests Limits -------- -------- ------ cpu 1440m (96%) 1 (66%)
这个 VM 有两个 CPU 内核。
system-reserved
设置保留 500 millicores,这代表一个内核中的一半被从节点的总容量中减小,以达到Node Allocatable
的数量。您可以看到Allocatable CPU
是 1500 毫秒。这意味着您可以运行一个 CPU Manager pod,因为每个 pod 需要一个完整的内核。一个完整的内核等于 1000 毫秒。如果您尝试调度第二个 pod,系统将接受该 pod,但不会调度它:NAME READY STATUS RESTARTS AGE cpumanager-6cqz7 1/1 Running 0 33m cpumanager-7qc2t 0/1 Pending 0 11s
5.2. 拓扑管理器策略
拓扑管理器通过从 Hint 提供者(如 CPU Manager 和设备管理器)收集拓扑提示来调整所有级别服务质量(QoS)的 Pod
资源,并使用收集的提示来匹配 Pod
资源。
拓扑管理器支持四个分配策略,这些策略在名为 cpumanager-enabled
的 KubeletConfig
自定义资源 (CR) 中分配:
none
策略- 这是默认策略,不执行任何拓扑对齐调整。
best-effort
策略-
对于带有
best-effort
拓扑管理策略的 pod 中的每个容器,kubelet 会调用每个 Hint 提供者来发现其资源的可用性。使用这些信息,拓扑管理器会保存那个容器的首选 NUMA 节点关联性设置。如果关联性没有被首选设置,则拓扑管理器会保存这个设置,并把 pod 分配给节点。 restricted
策略-
对于带有
restricted
拓扑管理策略的 pod 中的每个容器,kubelet 会调用每个 Hint 提供者来发现其资源的可用性。使用这些信息,拓扑管理器会保存那个容器的首选 NUMA 节点关联性设置。如果关联性没有被首选,则拓扑管理器会从节点拒绝这个 pod,从而导致 pod 处于Terminated
状态,且 pod 准入失败。 single-numa-node
策略-
对于带有
single-numa-node
拓扑管理策略的 pod 中的每个容器,kubelet 会调用每个 Hint 提供者来发现其资源的可用性。使用这个信息,拓扑管理器会决定单个 NUMA 节点关联性是否可能。如果是,pod 将会分配给该节点。如果无法使用单一 NUMA 节点关联性,则拓扑管理器会拒绝来自节点的 pod。这会导致 pod 处于 Terminated 状态,且 pod 准入失败。
5.3. 设置拓扑管理器
要使用拓扑管理器,您必须在名为 cpumanager-enabled
的 KubeletConfig
自定义资源 (CR) 中配置分配策略。如果您设置了 CPU Manager,则该文件可能会存在。如果这个文件不存在,您可以创建该文件。
先决条件
-
将 CPU Manager 策略配置为
static
。
流程
激活拓扑管理器:
在自定义资源中配置拓扑管理器分配策略。
$ oc edit KubeletConfig cpumanager-enabled
apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: cpumanager-enabled spec: machineConfigPoolSelector: matchLabels: custom-kubelet: cpumanager-enabled kubeletConfig: cpuManagerPolicy: static 1 cpuManagerReconcilePeriod: 5s topologyManagerPolicy: single-numa-node 2
5.4. Pod 与拓扑管理器策略的交互
以下的 Pod
specs 示例演示了 Pod 与 Topology Manager 的交互。
因为没有指定资源请求或限制,以下 pod 以 BestEffort
QoS 类运行。
spec: containers: - name: nginx image: nginx
因为请求小于限制,下一个 pod 以 Burstable
QoS 类运行。
spec: containers: - name: nginx image: nginx resources: limits: memory: "200Mi" requests: memory: "100Mi"
如果所选策略不是 none
,则拓扑管理器将不考虑其中任何一个 Pod
规格。
因为请求等于限制,最后一个 pod 以 Guaranteed QoS 类运行。
spec: containers: - name: nginx image: nginx resources: limits: memory: "200Mi" cpu: "2" example.com/device: "1" requests: memory: "200Mi" cpu: "2" example.com/device: "1"
拓扑管理器将考虑这个 pod。拓扑管理器会参考 CPU Manager 和设备管理器的 hint 供应商,以获取 pod 的拓扑提示。
拓扑管理器将使用此信息存储该容器的最佳拓扑。在本 pod 中,CPU Manager 和设备管理器将在资源分配阶段使用此存储的信息。
第 6 章 调度 NUMA 感知工作负载
了解 NUMA 感知调度以及如何使用它来在 OpenShift Container Platform 集群中部署高性能工作负载。
NUMA 感知调度是 OpenShift Container Platform 版本 4.12.0 到 4.12.23 中的技术预览功能。它在 OpenShift Container Platform 版本 4.12.24 及更高版本中是正式发布版本(GA)。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
NUMA Resources Operator 允许您在相同的 NUMA 区域中调度高性能工作负载。它部署一个节点资源导出代理,该代理在可用的集群节点 NUMA 资源以及管理工作负载的辅助调度程序上报告。
6.1. 关于 NUMA 感知调度
非统一内存访问 (NUMA) 是一个计算平台架构,允许不同的 CPU 以不同速度访问不同区域。NUMA 资源拓扑引用与计算节点上相互相对的 CPU、内存和 PCI 设备的位置。在一起的资源表示在同一 NUMA 区域中。对于高性能应用程序,集群需要处理单个 NUMA 区域中的 pod 工作负载。
NUMA 架构允许有多个内存控制器的 CPU 在 CPU 复杂间使用任何可用内存,无论内存所处的位置。这可以以牺牲性能为代价来增加灵活性。使用位于 NUMA 区域以外的内存的 CPU 处理工作负载的速度比单个 NUMA 区域处理的工作负载要慢。另外,对于对 I/O 有限制的工作负载,在远程的 NUMA 区域中的网络接口会减慢访问应用程序的速度。高性能工作负载(如电信工作负载)无法在这些条件下达到操作要求。NUMA 感知调度会调整同一 NUMA 区域中请求的集群计算资源(CPU、内存、设备),以有效地处理对延迟敏感的工作负责或高性能工作负载。NUMA 感知调度还提高了每个计算节点的 pod 密度,以提高资源效率。
默认的 OpenShift Container Platform pod 调度程序调度逻辑考虑整个计算节点的可用资源,而不是单个 NUMA 区域。如果在 kubelet 拓扑管理器中请求最严格的资源协调,则会在将 pod 传递给节点时出现错误条件。相反,如果没有请求限制性最严格的资源协调,则 pod 可以在没有正确的资源协调的情况下被节点接受,从而导致性能更差或无法达到预期。例如,当 pod 调度程序通过不知道 pod 请求的资源可用而导致做出非最佳的调度决定时,pod 创建可能会出现 Topology Affinity Error
状态。调度不匹配决策可能会导致 pod 启动延迟。另外,根据集群状态和资源分配,pod 调度决策可能会因为启动失败而对集群造成额外的负载。
NUMA Resources Operator 部署了一个自定义 NUMA 资源辅助调度程序和其他资源,以缓解默认 OpenShift Container Platform pod 调度程序的缩写。下图显示了 NUMA 感知 pod 调度的高级概述。
图 6.1. NUMA 感知调度概述
- NodeResourceTopology API
-
NodeResourceTopology
API 描述了每个计算节点上可用的 NUMA 区资源。 - NUMA 感知调度程序
-
NUMA 感知辅助调度程序从
NodeResourceTopology
API 接收有关可用 NUMA 区域的信息,并在可以最佳处理的节点上调度高性能工作负载。 - 节点拓扑 exporter
-
节点拓扑 exporter 会公开每个计算节点的可用 NUMA 区资源到
NodeResourceTopology
API。节点拓扑 exporter 守护进程使用PodResources
API 跟踪来自 kubelet 的资源分配。 - PodResources API
-
对于每个节点,
PodResources
API 是本地的,并向 kubelet 公开资源拓扑和可用资源。
其他资源
- 有关在集群中运行二级 pod 调度程序以及如何使用二级 pod 调度程序部署 pod 的更多信息,请参阅使用二级调度程序调度 pod。
6.2. 安装 NUMA Resources Operator
NUMA Resources Operator 部署资源,供您调度 NUMA 感知工作负载和部署。您可以使用 OpenShift Container Platform CLI 或 Web 控制台安装 NUMA Resources Operator。
6.2.1. 使用 CLI 安装 NUMA Resources Operator
作为集群管理员,您可以使用 CLI 安装 Operator。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
为 NUMA Resources Operator 创建命名空间:
将以下 YAML 保存到
nro-namespace.yaml
文件中:apiVersion: v1 kind: Namespace metadata: name: openshift-numaresources
运行以下命令来创建
Namespace
CR:$ oc create -f nro-namespace.yaml
为 NUMA Resources Operator 创建 operator 组:
在
nro-operatorgroup.yaml
文件中保存以下 YAML:apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: numaresources-operator namespace: openshift-numaresources spec: targetNamespaces: - openshift-numaresources
运行以下命令来创建
OperatorGroup
CR:$ oc create -f nro-operatorgroup.yaml
为 NUMA Resources Operator 创建订阅:
将以下 YAML 保存到
nro-sub.yaml
文件中:apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: numaresources-operator namespace: openshift-numaresources spec: channel: "4.12" name: numaresources-operator source: redhat-operators sourceNamespace: openshift-marketplace
运行以下命令来创建
Subscription
CR:$ oc create -f nro-sub.yaml
验证
通过检查
openshift-numaresources
命名空间中的 CSV 资源来验证安装是否成功。运行以下命令:$ oc get csv -n openshift-numaresources
输出示例
NAME DISPLAY VERSION REPLACES PHASE numaresources-operator.v4.12.2 numaresources-operator 4.12.2 Succeeded
6.2.2. 使用 Web 控制台安装 NUMA Resources Operator
作为集群管理员,您可以使用 Web 控制台安装 NUMA Resources Operator。
流程
为 NUMA Resources Operator 创建命名空间:
- 在 OpenShift Container Platform web 控制台中,点 Administration → Namespaces。
-
点 Create Namespace,在 Name 字段中输入
openshift-numaresources
,然后点 Create。
安装 NUMA Resources Operator:
- 在 OpenShift Container Platform Web 控制台中,点击 Operators → OperatorHub。
- 从可用的 Operator 列表中选择 NUMA Resources Operator,然后点 Install。
-
在 Installed Namespaces 字段中,选择
openshift-numaresources
命名空间,然后点 Install。
可选:验证 NUMA Resources Operator 是否已成功安装:
- 切换到 Operators → Installed Operators 页面。
确保
openshift-numaresources
命名空间中列出 NUMA Resources Operator,Status 为 InstallSucceeded。注意在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。
如果 Operator 没有被成功安装,请按照以下步骤进行故障排除:
- 进入 Operators → Installed Operators 页面,检查 Operator Subscriptions 和 Install Plans 选项卡中的 Status 项中是否有任何错误。
-
进入 Workloads → Pods 页面,检查
default
项目中的 pod 的日志。
6.3. 调度 NUMA 感知工作负载
运行对延迟敏感工作负载的集群通常具有性能配置集,以帮助最小化工作负载延迟并优化性能。NUMA 感知调度程序根据可用的节点 NUMA 资源部署工作负载,并遵循应用到节点的任何性能配置集设置。NUMA 感知部署和工作负载的性能配置集相结合,确保以最大化性能的方式调度工作负载。
6.3.1. 创建 NUMAResourcesOperator 自定义资源
安装 NUMA Resources Operator 后,创建 NUMAResourcesOperator
自定义资源 (CR) 来指示 NUMA Resources Operator 安装支持 NUMA 感知调度程序所需的所有集群基础架构,包括守护进程集和 API。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 NUMA Resources Operator。
流程
创建
MachineConfigPool
自定义资源,为 worker 节点启用自定义 kubelet 配置:将以下 YAML 保存到
nro-machineconfig.yaml
文件中:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: labels: cnf-worker-tuning: enabled machineconfiguration.openshift.io/mco-built-in: "" pools.operator.machineconfiguration.openshift.io/worker: "" name: worker spec: machineConfigSelector: matchLabels: machineconfiguration.openshift.io/role: worker nodeSelector: matchLabels: node-role.kubernetes.io/worker: ""
运行以下命令来创建
MachineConfigPool
CR:$ oc create -f nro-machineconfig.yaml
创建
NUMAResourcesOperator
自定义资源:将以下 YAML 保存到
nrop.yaml
文件中:apiVersion: nodetopology.openshift.io/v1alpha1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: nodeGroups: - machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: "" 1
- 1
- 应该与相关
MachineConfigPool
CR 中的 worker 节点匹配。
运行以下命令来创建
NUMAResourcesOperator
CR:$ oc create -f nrop.yaml
验证
运行以下命令,验证 NUMA Resources Operator 是否已成功部署:
$ oc get numaresourcesoperators.nodetopology.openshift.io
输出示例
NAME AGE numaresourcesoperator 10m
6.3.2. 部署 NUMA 感知辅助 pod 调度程序
安装 NUMA Resources Operator 后,执行以下操作来部署 NUMA 感知辅助 pod 调度程序:
- 为所需机器配置集配置 pod admittance 策略
- 创建所需的机器配置池
- 部署 NUMA 感知二级调度程序
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 NUMA Resources Operator。
流程
创建
KubeletConfig
自定义资源,为机器配置集配置 pod admittance 策略:将以下 YAML 保存到
nro-kubeletconfig.yaml
文件中:apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: cnf-worker-tuning spec: machineConfigPoolSelector: matchLabels: cnf-worker-tuning: enabled kubeletConfig: cpuManagerPolicy: "static" 1 cpuManagerReconcilePeriod: "5s" reservedSystemCPUs: "0,1" memoryManagerPolicy: "Static" 2 evictionHard: memory.available: "100Mi" kubeReserved: memory: "512Mi" reservedMemory: - numaNode: 0 limits: memory: "1124Mi" systemReserved: memory: "512Mi" topologyManagerPolicy: "single-numa-node" 3 topologyManagerScope: "pod"
运行以下命令来创建
KubeletConfig
自定义资源 (CR):$ oc create -f nro-kubeletconfig.yaml
创建
NUMAResourcesScheduler
自定义资源来部署 NUMA 感知自定义 pod 调度程序:将以下 YAML 保存到
nro-scheduler.yaml
文件中:apiVersion: nodetopology.openshift.io/v1alpha1 kind: NUMAResourcesScheduler metadata: name: numaresourcesscheduler spec: imageSpec: "registry.redhat.io/openshift4/noderesourcetopology-scheduler-container-rhel8:v4.12"
运行以下命令来创建
NUMAResourcesScheduler
CR:$ oc create -f nro-scheduler.yaml
验证
运行以下命令验证所需资源是否已成功部署:
$ oc get all -n openshift-numaresources
输出示例
NAME READY STATUS RESTARTS AGE pod/numaresources-controller-manager-7575848485-bns4s 1/1 Running 0 13m pod/numaresourcesoperator-worker-dvj4n 2/2 Running 0 16m pod/numaresourcesoperator-worker-lcg4t 2/2 Running 0 16m pod/secondary-scheduler-56994cf6cf-7qf4q 1/1 Running 0 16m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/numaresourcesoperator-worker 2 2 2 2 2 node-role.kubernetes.io/worker= 16m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/numaresources-controller-manager 1/1 1 1 13m deployment.apps/secondary-scheduler 1/1 1 1 16m NAME DESIRED CURRENT READY AGE replicaset.apps/numaresources-controller-manager-7575848485 1 1 1 13m replicaset.apps/secondary-scheduler-56994cf6cf 1 1 1 16m
其他资源
6.3.3. 使用 NUMA 感知调度程序调度工作负载
您可以使用 Deployment
CR 将工作负载调度到 NUMA 感知调度程序,该 CR 指定处理工作负载的最低所需资源。
以下示例部署使用 NUMA 感知调度示例工作负载。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 NUMA Resources Operator 并部署 NUMA 感知辅助调度程序。
流程
运行以下命令,获取集群中部署的 NUMA 感知调度程序名称:
$ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'
输出示例
topo-aware-scheduler
创建一个
Deployment
CR,它使用名为topo-aware-scheduler
的调度程序,例如:将以下 YAML 保存到
nro-deployment.yaml
文件中:apiVersion: apps/v1 kind: Deployment metadata: name: numa-deployment-1 namespace: openshift-numaresources spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: schedulerName: topo-aware-scheduler 1 containers: - name: ctnr image: quay.io/openshifttest/hello-openshift:openshift imagePullPolicy: IfNotPresent resources: limits: memory: "100Mi" cpu: "10" requests: memory: "100Mi" cpu: "10" - name: ctnr2 image: registry.access.redhat.com/rhel:latest imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c"] args: [ "while true; do sleep 1h; done;" ] resources: limits: memory: "100Mi" cpu: "8" requests: memory: "100Mi" cpu: "8"
- 1
schedulerName
必须与集群中部署的 NUMA 感知调度程序的名称匹配,如topo-aware-scheduler
。
运行以下命令来创建
Deployment
CR:$ oc create -f nro-deployment.yaml
验证
验证部署是否成功:
$ oc get pods -n openshift-numaresources
输出示例
NAME READY STATUS RESTARTS AGE numa-deployment-1-56954b7b46-pfgw8 2/2 Running 0 129m numaresources-controller-manager-7575848485-bns4s 1/1 Running 0 15h numaresourcesoperator-worker-dvj4n 2/2 Running 0 18h numaresourcesoperator-worker-lcg4t 2/2 Running 0 16h secondary-scheduler-56994cf6cf-7qf4q 1/1 Running 0 18h
运行以下命令,验证
topo-aware-scheduler
是否在调度部署的 pod:$ oc describe pod numa-deployment-1-56954b7b46-pfgw8 -n openshift-numaresources
输出示例
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 130m topo-aware-scheduler Successfully assigned openshift-numaresources/numa-deployment-1-56954b7b46-pfgw8 to compute-0.example.com
注意请求的资源超过可用于调度的部署将失败,并显示
MinimumReplicasUnavailable
错误。当所需资源可用时,部署会成功。Pod 会一直处于Pending
状态,直到所需资源可用。验证是否为节点列出了预期的分配资源。运行以下命令:
$ oc describe noderesourcetopologies.topology.node.k8s.io
输出示例
... Zones: Costs: Name: node-0 Value: 10 Name: node-1 Value: 21 Name: node-0 Resources: Allocatable: 39 Available: 21 1 Capacity: 40 Name: cpu Allocatable: 6442450944 Available: 6442450944 Capacity: 6442450944 Name: hugepages-1Gi Allocatable: 134217728 Available: 134217728 Capacity: 134217728 Name: hugepages-2Mi Allocatable: 262415904768 Available: 262206189568 Capacity: 270146007040 Name: memory Type: Node
- 1
- 由于已分配给有保证 pod 的资源,
可用的
容量会减少。
通过保证 pod 使用的资源从
noderesourcetopologies.topology.node.k8s.io
中列出的可用节点资源中减去。对具有
Best-effort
或Burstable
服务质量 (qosClass
) 的pod 的资源分配不会反映在noderesourcetopologies.topology.node.k8s.io
下的 NUMA 节点资源中。如果 pod 消耗的资源没有反映在节点资源计算中,请运行以下命令验证 pod 的Guaranteed
具有qosClass
:$ oc get pod <pod_name> -n <pod_namespace> -o jsonpath="{ .status.qosClass }"
输出示例
Guaranteed
6.4. 使用手动性能设置调度 NUMA 感知工作负载
运行对延迟敏感工作负载的集群通常具有性能配置集,以帮助最小化工作负载延迟并优化性能。但是,您可以在不功能性能配置集的 pristine 集群中调度 NUMA 感知工作负载。以下工作流带有一个 pristine 集群,您可以使用 KubeletConfig
资源手动配置性能。这不是调度 NUMA 感知工作负载的典型环境。
6.4.1. 使用手动性能设置创建 NUMAResourcesOperator 自定义资源
安装 NUMA Resources Operator 后,创建 NUMAResourcesOperator
自定义资源 (CR) 来指示 NUMA Resources Operator 安装支持 NUMA 感知调度程序所需的所有集群基础架构,包括守护进程集和 API。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 NUMA Resources Operator。
流程
可选:创建
MachineConfigPool
自定义资源,为 worker 节点启用自定义 kubelet 配置:注意默认情况下,OpenShift Container Platform 为集群中的 worker 节点创建一个
MachineConfigPool
资源。如果需要,您可以创建自定义MachineConfigPool
资源。将以下 YAML 保存到
nro-machineconfig.yaml
文件中:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: labels: cnf-worker-tuning: enabled machineconfiguration.openshift.io/mco-built-in: "" pools.operator.machineconfiguration.openshift.io/worker: "" name: worker spec: machineConfigSelector: matchLabels: machineconfiguration.openshift.io/role: worker nodeSelector: matchLabels: node-role.kubernetes.io/worker: ""
运行以下命令来创建
MachineConfigPool
CR:$ oc create -f nro-machineconfig.yaml
创建
NUMAResourcesOperator
自定义资源:将以下 YAML 保存到
nrop.yaml
文件中:apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: nodeGroups: - machineConfigPoolSelector: matchLabels: pools.operator.machineconfiguration.openshift.io/worker: "" 1
- 1
- 应该与相关
MachineConfigPool
CR 中的 worker 节点匹配。
运行以下命令来创建
NUMAResourcesOperator
CR:$ oc create -f nrop.yaml
验证
运行以下命令,验证 NUMA Resources Operator 是否已成功部署:
$ oc get numaresourcesoperators.nodetopology.openshift.io
输出示例
NAME AGE numaresourcesoperator 10m
6.4.2. 使用手动性能设置部署 NUMA 感知辅助 pod 调度程序
安装 NUMA Resources Operator 后,执行以下操作来部署 NUMA 感知辅助 pod 调度程序:
- 为所需机器配置集配置 pod admittance 策略。
- 创建所需的机器配置池。
- 部署 NUMA 感知辅助调度程序。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 NUMA Resources Operator。
流程
创建
KubeletConfig
自定义资源,为机器配置集配置 pod admittance 策略:将以下 YAML 保存到
nro-kubeletconfig.yaml
文件中:apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: cnf-worker-tuning spec: machineConfigPoolSelector: matchLabels: cnf-worker-tuning: enabled kubeletConfig: cpuManagerPolicy: "static" 1 cpuManagerReconcilePeriod: "5s" reservedSystemCPUs: "0,1" memoryManagerPolicy: "Static" 2 evictionHard: memory.available: "100Mi" reservedMemory: - numaNode: 0 limits: memory: "1124Mi" systemReserved: memory: "512Mi" topologyManagerPolicy: "single-numa-node" 3 topologyManagerScope: "pod"
运行以下命令来创建
KubeletConfig
自定义资源 (CR):$ oc create -f nro-kubeletconfig.yaml
创建
NUMAResourcesScheduler
自定义资源来部署 NUMA 感知自定义 pod 调度程序:将以下 YAML 保存到
nro-scheduler.yaml
文件中:apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesScheduler metadata: name: numaresourcesscheduler spec: imageSpec: "registry.redhat.io/openshift4/noderesourcetopology-scheduler-container-rhel8:v4.12" cacheResyncPeriod: "5s" 1
- 1
- 为调度程序缓存同步输入间隔值(以秒为单位)。值
5s
通常用于大多数实现。
注意-
启用
cacheResyncPeriod
规格,以帮助 NUMA Resource Operator 通过监控节点上的待处理资源,并在调度程序缓存中同步此信息,以帮助 NUMA Resource Operator 报告更准确的资源可用性。这也有助于减少Topology Affinity Error
错误,因为未优化调度决策。网络负载越低的时间间隔。cacheResyncPeriod
规格默认禁用。 -
为
NUMAResourcesOperator
CR 中的podsFingerprinting
规格设置Enabled
值是cacheResyncPeriod
规格的实施要求。
运行以下命令来创建
NUMAResourcesScheduler
CR:$ oc create -f nro-scheduler.yaml
验证
运行以下命令验证所需资源是否已成功部署:
$ oc get all -n openshift-numaresources
输出示例
NAME READY STATUS RESTARTS AGE pod/numaresources-controller-manager-7575848485-bns4s 1/1 Running 0 13m pod/numaresourcesoperator-worker-dvj4n 2/2 Running 0 16m pod/numaresourcesoperator-worker-lcg4t 2/2 Running 0 16m pod/secondary-scheduler-56994cf6cf-7qf4q 1/1 Running 0 16m NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE daemonset.apps/numaresourcesoperator-worker 2 2 2 2 2 node-role.kubernetes.io/worker= 16m NAME READY UP-TO-DATE AVAILABLE AGE deployment.apps/numaresources-controller-manager 1/1 1 1 13m deployment.apps/secondary-scheduler 1/1 1 1 16m NAME DESIRED CURRENT READY AGE replicaset.apps/numaresources-controller-manager-7575848485 1 1 1 13m replicaset.apps/secondary-scheduler-56994cf6cf 1 1 1 16m
6.4.3. 使用手动性能设置使用 NUMA 感知调度程序调度工作负载
您可以使用 Deployment
CR 将工作负载调度到 NUMA 感知调度程序,该 CR 指定处理工作负载的最低所需资源。
以下示例部署使用 NUMA 感知调度示例工作负载。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 NUMA Resources Operator 并部署 NUMA 感知辅助调度程序。
流程
运行以下命令,获取集群中部署的 NUMA 感知调度程序名称:
$ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'
输出示例
topo-aware-scheduler
创建一个
Deployment
CR,它使用名为topo-aware-scheduler
的调度程序,例如:将以下 YAML 保存到
nro-deployment.yaml
文件中:apiVersion: apps/v1 kind: Deployment metadata: name: numa-deployment-1 namespace: openshift-numaresources spec: replicas: 1 selector: matchLabels: app: test template: metadata: labels: app: test spec: schedulerName: topo-aware-scheduler 1 containers: - name: ctnr image: quay.io/openshifttest/hello-openshift:openshift imagePullPolicy: IfNotPresent resources: limits: memory: "100Mi" cpu: "10" requests: memory: "100Mi" cpu: "10" - name: ctnr2 image: registry.access.redhat.com/rhel:latest imagePullPolicy: IfNotPresent command: ["/bin/sh", "-c"] args: [ "while true; do sleep 1h; done;" ] resources: limits: memory: "100Mi" cpu: "8" requests: memory: "100Mi" cpu: "8"
- 1
schedulerName
必须与集群中部署的 NUMA 感知调度程序的名称匹配,如topo-aware-scheduler
。
运行以下命令来创建
Deployment
CR:$ oc create -f nro-deployment.yaml
验证
验证部署是否成功:
$ oc get pods -n openshift-numaresources
输出示例
NAME READY STATUS RESTARTS AGE numa-deployment-1-56954b7b46-pfgw8 2/2 Running 0 129m numaresources-controller-manager-7575848485-bns4s 1/1 Running 0 15h numaresourcesoperator-worker-dvj4n 2/2 Running 0 18h numaresourcesoperator-worker-lcg4t 2/2 Running 0 16h secondary-scheduler-56994cf6cf-7qf4q 1/1 Running 0 18h
运行以下命令,验证
topo-aware-scheduler
是否在调度部署的 pod:$ oc describe pod numa-deployment-1-56954b7b46-pfgw8 -n openshift-numaresources
输出示例
Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 130m topo-aware-scheduler Successfully assigned openshift-numaresources/numa-deployment-1-56954b7b46-pfgw8 to compute-0.example.com
注意请求的资源超过可用于调度的部署将失败,并显示
MinimumReplicasUnavailable
错误。当所需资源可用时,部署会成功。Pod 会一直处于Pending
状态,直到所需资源可用。验证是否为节点列出了预期的分配资源。
运行以下命令识别运行部署 pod 的节点,将 <namespace> 替换为您在
Deployment
CR 中指定的命名空间:$ oc get pods -n <namespace> -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES numa-deployment-1-65684f8fcc-bw4bw 0/2 Running 0 82m 10.128.2.50 worker-0 <none> <none>
运行以下命令,将 <node_name> 替换为运行部署 pod 的该节点的名称:
$ oc describe noderesourcetopologies.topology.node.k8s.io <node_name>
输出示例
... Zones: Costs: Name: node-0 Value: 10 Name: node-1 Value: 21 Name: node-0 Resources: Allocatable: 39 Available: 21 1 Capacity: 40 Name: cpu Allocatable: 6442450944 Available: 6442450944 Capacity: 6442450944 Name: hugepages-1Gi Allocatable: 134217728 Available: 134217728 Capacity: 134217728 Name: hugepages-2Mi Allocatable: 262415904768 Available: 262206189568 Capacity: 270146007040 Name: memory Type: Node
- 1
- 由于已分配给有保证 pod 的资源,
可用的
容量会减少。
通过保证 pod 使用的资源从
noderesourcetopologies.topology.node.k8s.io
中列出的可用节点资源中减去。
对具有
Best-effort
或Burstable
服务质量 (qosClass
) 的pod 的资源分配不会反映在noderesourcetopologies.topology.node.k8s.io
下的 NUMA 节点资源中。如果 pod 消耗的资源没有反映在节点资源计算中,请验证 pod 的Guaranteed
具有qosClass
,且 CPU 请求是一个整数值,而不是十进制值。您可以运行以下命令来验证 pod 是否具有Guaranteed
的qosClass
:$ oc get pod <pod_name> -n <pod_namespace> -o jsonpath="{ .status.qosClass }"
输出示例
Guaranteed
6.5. 可选:为 NUMA 资源更新配置轮询操作
由 NUMA Resources Operator 控制的守护进程在其 nodeGroup
轮询资源以检索有关可用 NUMA 资源的更新。您可以通过在 NUMAResourcesOperator
自定义资源 (CR) 中配置 spec.nodeGroups
规格来微调这些守护进程的轮询操作。这提供了对轮询操作的高级控制。配置这些规格,以改进调度行为,并对子优化调度决策进行故障排除。
配置选项如下:
-
infoRefreshMode
:确定轮询 kubelet 的触发器条件。NUMA Resources Operator 向 API 服务器报告生成的信息。 -
infoRefreshPeriod
:确定轮询更新之间的持续时间。 podsFingerprinting
: 确定节点上当前运行的当前 pod 集合的时间点信息是否公开,以轮询更新。注意podsFingerprinting
默认启用。podsFingerprinting
是NUMAResourcesScheduler
CR 中的cacheResyncPeriod
规格的要求。cacheResyncPeriod
规格有助于通过监控节点上的待处理资源来报告更准确的资源可用性。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 安装 NUMA Resources Operator。
流程
在
NUMAResourcesOperator
CR 中配置spec.nodeGroups
规格:apiVersion: nodetopology.openshift.io/v1 kind: NUMAResourcesOperator metadata: name: numaresourcesoperator spec: nodeGroups: - config: infoRefreshMode: Periodic 1 infoRefreshPeriod: 10s 2 podsFingerprinting: Enabled 3 name: worker
- 1
- 有效值为
Periodic
、Event
、PeriodicAndEvents
。使用Periodic
根据您在infoRefreshPeriod
中定义的间隔轮询 kubelet。使用Events
在每个 pod 生命周期事件时轮询 kubelet。使用PeriodicAndEvents
启用这两种方法。 - 2
- 为
Periodic
或PeriodicAndEvents
刷新模式定义轮询间隔。如果刷新模式是Events
,则忽略该字段。 - 3
- 有效值为
Enabled
或Disabled
。设置为Enabled
是NUMAResourcesScheduler
中cacheResyncPeriod
规格的要求。
验证
部署 NUMA Resources Operator 后,运行以下命令来验证节点组配置是否已应用:
$ oc get numaresop numaresourcesoperator -o json | jq '.status'
输出示例
... "config": { "infoRefreshMode": "Periodic", "infoRefreshPeriod": "10s", "podsFingerprinting": "Enabled" }, "name": "worker" ...
6.6. 对 NUMA 感知调度进行故障排除
要排除 NUMA 感知 pod 调度的常见问题,请执行以下步骤。
先决条件
-
安装 OpenShift Container Platform CLI(
oc
)。 - 以具有 cluster-admin 权限的用户身份登录。
- 安装 NUMA Resources Operator 并部署 NUMA 感知辅助调度程序。
流程
运行以下命令,验证
noderesourcetopologies
CRD 是否已在集群中部署:$ oc get crd | grep noderesourcetopologies
输出示例
NAME CREATED AT noderesourcetopologies.topology.node.k8s.io 2022-01-18T08:28:06Z
运行以下命令,检查 NUMA-aware 调度程序名称是否与 NUMA 感知工作负载中指定的名称匹配:
$ oc get numaresourcesschedulers.nodetopology.openshift.io numaresourcesscheduler -o json | jq '.status.schedulerName'
输出示例
topo-aware-scheduler
验证 NUMA-aware scheduable 节点是否应用了
noderesourcetopologies
CR。运行以下命令:$ oc get noderesourcetopologies.topology.node.k8s.io
输出示例
NAME AGE compute-0.example.com 17h compute-1.example.com 17h
注意节点数应该等于机器配置池 (
mcp
) worker 定义中配置的 worker 节点数量。运行以下命令,验证所有 scheduable 节点的 NUMA 区粒度:
$ oc get noderesourcetopologies.topology.node.k8s.io -o yaml
输出示例
apiVersion: v1 items: - apiVersion: topology.node.k8s.io/v1alpha1 kind: NodeResourceTopology metadata: annotations: k8stopoawareschedwg/rte-update: periodic creationTimestamp: "2022-06-16T08:55:38Z" generation: 63760 name: worker-0 resourceVersion: "8450223" uid: 8b77be46-08c0-4074-927b-d49361471590 topologyPolicies: - SingleNUMANodeContainerLevel zones: - costs: - name: node-0 value: 10 - name: node-1 value: 21 name: node-0 resources: - allocatable: "38" available: "38" capacity: "40" name: cpu - allocatable: "134217728" available: "134217728" capacity: "134217728" name: hugepages-2Mi - allocatable: "262352048128" available: "262352048128" capacity: "270107316224" name: memory - allocatable: "6442450944" available: "6442450944" capacity: "6442450944" name: hugepages-1Gi type: Node - costs: - name: node-0 value: 21 - name: node-1 value: 10 name: node-1 resources: - allocatable: "268435456" available: "268435456" capacity: "268435456" name: hugepages-2Mi - allocatable: "269231067136" available: "269231067136" capacity: "270573244416" name: memory - allocatable: "40" available: "40" capacity: "40" name: cpu - allocatable: "1073741824" available: "1073741824" capacity: "1073741824" name: hugepages-1Gi type: Node - apiVersion: topology.node.k8s.io/v1alpha1 kind: NodeResourceTopology metadata: annotations: k8stopoawareschedwg/rte-update: periodic creationTimestamp: "2022-06-16T08:55:37Z" generation: 62061 name: worker-1 resourceVersion: "8450129" uid: e8659390-6f8d-4e67-9a51-1ea34bba1cc3 topologyPolicies: - SingleNUMANodeContainerLevel zones: 1 - costs: - name: node-0 value: 10 - name: node-1 value: 21 name: node-0 resources: 2 - allocatable: "38" available: "38" capacity: "40" name: cpu - allocatable: "6442450944" available: "6442450944" capacity: "6442450944" name: hugepages-1Gi - allocatable: "134217728" available: "134217728" capacity: "134217728" name: hugepages-2Mi - allocatable: "262391033856" available: "262391033856" capacity: "270146301952" name: memory type: Node - costs: - name: node-0 value: 21 - name: node-1 value: 10 name: node-1 resources: - allocatable: "40" available: "40" capacity: "40" name: cpu - allocatable: "1073741824" available: "1073741824" capacity: "1073741824" name: hugepages-1Gi - allocatable: "268435456" available: "268435456" capacity: "268435456" name: hugepages-2Mi - allocatable: "269192085504" available: "269192085504" capacity: "270534262784" name: memory type: Node kind: List metadata: resourceVersion: "" selfLink: ""
6.6.1. 检查 NUMA 感知调度程序日志
通过查看日志来排除 NUMA 感知调度程序的问题。如果需要,可以通过修改 NUMAResourcesScheduler
资源的 spec.logLevel
字段来增加调度程序日志级别。可接受值为 Normal
、Debug
和 Trace
,其中 Trace
是最详细的选项。
要更改辅助调度程序的日志级别,请删除正在运行的调度程序资源,并使用更改后的日志级别重新部署它。在此停机期间,调度程序无法调度新的工作负载。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
删除当前运行的
NUMAResourcesScheduler
资源:运行以下命令来获取活跃的
NUMAResourcesScheduler
:$ oc get NUMAResourcesScheduler
输出示例
NAME AGE numaresourcesscheduler 90m
运行以下命令来删除二级调度程序资源:
$ oc delete NUMAResourcesScheduler numaresourcesscheduler
输出示例
numaresourcesscheduler.nodetopology.openshift.io "numaresourcesscheduler" deleted
将以下 YAML 保存到文件
nro-scheduler-debug.yaml
中。本例将日志级别更改为Debug
:apiVersion: nodetopology.openshift.io/v1alpha1 kind: NUMAResourcesScheduler metadata: name: numaresourcesscheduler spec: imageSpec: "registry.redhat.io/openshift4/noderesourcetopology-scheduler-container-rhel8:v4.12" logLevel: Debug
运行以下命令,创建更新的
Debug
loggingNUMAResourcesScheduler
资源:$ oc create -f nro-scheduler-debug.yaml
输出示例
numaresourcesscheduler.nodetopology.openshift.io/numaresourcesscheduler created
验证步骤
检查 NUMA-aware 调度程序是否已成功部署:
运行以下命令检查 CRD 是否已创建成功:
$ oc get crd | grep numaresourcesschedulers
输出示例
NAME CREATED AT numaresourcesschedulers.nodetopology.openshift.io 2022-02-25T11:57:03Z
运行以下命令,检查新的自定义调度程序是否可用:
$ oc get numaresourcesschedulers.nodetopology.openshift.io
输出示例
NAME AGE numaresourcesscheduler 3h26m
检查调度程序的日志是否显示增加的日志级别:
运行以下命令,获取在
openshift-numaresources
命名空间中运行的 pod 列表:$ oc get pods -n openshift-numaresources
输出示例
NAME READY STATUS RESTARTS AGE numaresources-controller-manager-d87d79587-76mrm 1/1 Running 0 46h numaresourcesoperator-worker-5wm2k 2/2 Running 0 45h numaresourcesoperator-worker-pb75c 2/2 Running 0 45h secondary-scheduler-7976c4d466-qm4sc 1/1 Running 0 21m
运行以下命令,获取二级调度程序 pod 的日志:
$ oc logs secondary-scheduler-7976c4d466-qm4sc -n openshift-numaresources
输出示例
... I0223 11:04:55.614788 1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.Namespace total 11 items received I0223 11:04:56.609114 1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.ReplicationController total 10 items received I0223 11:05:22.626818 1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.StorageClass total 7 items received I0223 11:05:31.610356 1 reflector.go:535] k8s.io/client-go/informers/factory.go:134: Watch close - *v1.PodDisruptionBudget total 7 items received I0223 11:05:31.713032 1 eventhandlers.go:186] "Add event for scheduled pod" pod="openshift-marketplace/certified-operators-thtvq" I0223 11:05:53.461016 1 eventhandlers.go:244] "Delete event for scheduled pod" pod="openshift-marketplace/certified-operators-thtvq"
6.6.2. 对资源拓扑 exporter 进行故障排除
通过检查对应的 resource-topology-exporter
日志,对发生意外结果的 noderesourcetopologlogies
对象进行故障排除。
建议为它们引用的节点命名 NUMA 资源拓扑导出器实例。例如,名为 worker 的 worker
节点应具有对应的 noderesourcetopologies
对象,称为 worker
。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
获取由 NUMA Resources Operator 管理的守护进程集(daemonset)。每个守护进程在
NUMAResourcesOperator
CR 中有一个对应的nodeGroup
。运行以下命令:$ oc get numaresourcesoperators.nodetopology.openshift.io numaresourcesoperator -o jsonpath="{.status.daemonsets[0]}"
输出示例
{"name":"numaresourcesoperator-worker","namespace":"openshift-numaresources"}
使用上一步中的
name
值获取所需的守护进程集的标签:$ oc get ds -n openshift-numaresources numaresourcesoperator-worker -o jsonpath="{.spec.selector.matchLabels}"
输出示例
{"name":"resource-topology"}
运行以下命令,使用
resource-topology
标签获取 pod:$ oc get pods -n openshift-numaresources -l name=resource-topology -o wide
输出示例
NAME READY STATUS RESTARTS AGE IP NODE numaresourcesoperator-worker-5wm2k 2/2 Running 0 2d1h 10.135.0.64 compute-0.example.com numaresourcesoperator-worker-pb75c 2/2 Running 0 2d1h 10.132.2.33 compute-1.example.com
检查与您要故障排除的节点对应的 worker pod 上运行的
resource-topology-exporter
容器的日志。运行以下命令:$ oc logs -n openshift-numaresources -c resource-topology-exporter numaresourcesoperator-worker-pb75c
输出示例
I0221 13:38:18.334140 1 main.go:206] using sysinfo: reservedCpus: 0,1 reservedMemory: "0": 1178599424 I0221 13:38:18.334370 1 main.go:67] === System information === I0221 13:38:18.334381 1 sysinfo.go:231] cpus: reserved "0-1" I0221 13:38:18.334493 1 sysinfo.go:237] cpus: online "0-103" I0221 13:38:18.546750 1 main.go:72] cpus: allocatable "2-103" hugepages-1Gi: numa cell 0 -> 6 numa cell 1 -> 1 hugepages-2Mi: numa cell 0 -> 64 numa cell 1 -> 128 memory: numa cell 0 -> 45758Mi numa cell 1 -> 48372Mi
6.6.3. 更正缺少的资源拓扑 exporter 配置映射
如果您在配置了集群设置的集群中安装 NUMA Resources Operator,在有些情况下,Operator 会显示为 active,但资源拓扑 exporter (RTE) 守护进程集 pod 的日志显示 RTE 的配置缺失,例如:
Info: couldn't find configuration in "/etc/resource-topology-exporter/config.yaml"
此日志消息显示集群中未正确应用带有所需配置的 kubeletconfig
,从而导致缺少 RTE configmap
。例如,以下集群缺少 numaresourcesoperator-worker
configmap
自定义资源 (CR):
$ oc get configmap
输出示例
NAME DATA AGE 0e2a6bd3.openshift-kni.io 0 6d21h kube-root-ca.crt 1 6d21h openshift-service-ca.crt 1 6d21h topo-aware-scheduler-config 1 6d18h
在正确配置的集群中,oc get configmap
也会返回一个 numaresourcesoperator-worker
configmap
CR。
先决条件
-
安装 OpenShift Container Platform CLI(
oc
)。 - 以具有 cluster-admin 权限的用户身份登录。
- 安装 NUMA Resources Operator 并部署 NUMA 感知辅助调度程序。
流程
使用以下命令,比较
kubeletconfig
中的spec.machineConfigPoolSelector.matchLabels
值和MachineConfigPool
(mcp
) worker CR 中的metadata.labels
的值:运行以下命令来检查
kubeletconfig
标签:$ oc get kubeletconfig -o yaml
输出示例
machineConfigPoolSelector: matchLabels: cnf-worker-tuning: enabled
运行以下命令来检查
mcp
标签:$ oc get mcp worker -o yaml
输出示例
labels: machineconfiguration.openshift.io/mco-built-in: "" pools.operator.machineconfiguration.openshift.io/worker: ""
cnf-worker-tuning: enabled
标签没有存在于MachineConfigPool
对象中。
编辑
MachineConfigPool
CR 使其包含缺少的标签,例如:$ oc edit mcp worker -o yaml
输出示例
labels: machineconfiguration.openshift.io/mco-built-in: "" pools.operator.machineconfiguration.openshift.io/worker: "" cnf-worker-tuning: enabled
- 应用标签更改并等待集群应用更新的配置。运行以下命令:
验证
检查是否应用了缺少的
numaresourcesoperator-worker
configmap
CR:$ oc get configmap
输出示例
NAME DATA AGE 0e2a6bd3.openshift-kni.io 0 6d21h kube-root-ca.crt 1 6d21h numaresourcesoperator-worker 1 5m openshift-service-ca.crt 1 6d21h topo-aware-scheduler-config 1 6d18h
第 7 章 可扩展性和性能优化
7.1. 优化存储
优化存储有助于最小化所有资源中的存储使用。通过优化存储,管理员可帮助确保现有存储资源以高效的方式工作。
7.1.1. 可用的持久性存储选项
了解持久性存储选项,以便可以优化 OpenShift Container Platform 环境。
存储类型 | 描述 | 例子 |
---|---|---|
Block |
| AWS EBS 和 VMware vSphere 支持在 OpenShift Container Platform 中的原生动态持久性卷 (PV)置备 。 |
File |
| RHEL NFS、NetApp NFS [1] 和供应商 NFS |
对象 |
| AWS S3 |
- NetApp NFS 在使用 Trident 插件时支持动态 PV 置备。
7.1.2. 推荐的可配置存储技术
下表总结了为给定的 OpenShift Container Platform 集群应用程序推荐的可配置存储技术。
存储类型 | Block | File | 对象 |
---|---|---|---|
1
2 3 Prometheus 是用于指标数据的底层技术。 4 这不适用于物理磁盘、虚拟机物理磁盘、VMDK 、NFS 回送、AWS EBS 和 Azure 磁盘。
5 对于指标数据,使用 6 用于日志记录,请参阅为日志存储配置持久性存储中的推荐存储解决方案。使用 NFS 存储作为持久性卷或通过 NAS (如 Gluster)可能会破坏数据。因此,OpenShift Container Platform Logging 中的 Elasticsearch 存储和 LokiStack 日志存储不支持 NFS。您必须为每个日志存储使用一个持久性卷类型。 7 对象存储不会通过 OpenShift Container Platform 的 PV 或 PVC 使用。应用程序必须与对象存储 REST API 集成。 | |||
ROX1 | Yes4 | Yes4 | 是 |
RWX2 | 否 | 是 | 是 |
Registry | 可配置 | 可配置 | 推荐的 |
扩展的 registry | 无法配置 | 可配置 | 推荐的 |
Metrics3 | 推荐的 | Configurable5 | 无法配置 |
Elasticsearch Logging | 推荐的 | Configurable6 | 不支持6 |
Loki Logging | 无法配置 | 无法配置 | 推荐的 |
Apps | 推荐的 | 推荐的 | Not configurable7 |
扩展的容器镜像仓库(registry)是一个 OpenShift 镜像 registry,它有两个或更多个 pod 运行副本。
7.1.2.1. 特定应用程序存储建议
测试显示在 Red Hat Enterprise Linux(RHEL)中使用 NFS 服务器作为核心服务的存储后端的问题。这包括 OpenShift Container Registry 和 Quay,Prometheus 用于监控存储,以及 Elasticsearch 用于日志存储。因此,不建议使用 RHEL NFS 作为 PV 后端用于核心服务。
市场上的其他 NFS 实现可能没有这些问题。如需了解更多与此问题相关的信息,请联络相关的 NFS 厂商。
7.1.2.1.1. Registry
在非扩展的/高可用性 (HA) OpenShift 镜像 registry 集群部署中:
- 存储技术不需要支持 RWX 访问模式。
- 存储技术必须保证读写一致性。
- 首选存储技术是对象存储,然后是块存储。
- 对于应用于生产环境工作负载的 OpenShift 镜像 Registry 集群部署,我们不推荐使用文件存储。
7.1.2.1.2. 扩展的 registry
在扩展的/HA OpenShift 镜像 registry 集群部署中:
- 存储技术必须支持 RWX 访问模式。
- 存储技术必须保证读写一致性。
- 首选存储技术是对象存储。
- 支持 Red Hat OpenShift Data Foundation (ODF), Amazon Simple Storage Service (Amazon S3), Google Cloud Storage (GCS), Microsoft Azure Blob Storage, 和 OpenStack Swift。
- 对象存储应该兼容 S3 或 Swift。
- 对于非云平台,如 vSphere 和裸机安装,唯一可配置的技术是文件存储。
- 块存储是不可配置的。
7.1.2.1.3. 指标
在 OpenShift Container Platform 托管的 metrics 集群部署中:
- 首选存储技术是块存储。
- 对象存储是不可配置的。
在带有生产环境负载的托管 metrics 集群部署中不推荐使用文件存储。
7.1.2.1.4. 日志记录
在 OpenShift Container Platform 托管的日志集群部署中:
Loki Operator:
- 首选存储技术是 S3 兼容对象存储。
- 块存储是不可配置的。
OpenShift Elasticsearch Operator:
- 首选存储技术是块存储。
- 不支持对象存储。
自日志记录版本 5.4.3 起,OpenShift Elasticsearch Operator 已被弃用,计划在以后的发行版本中删除。红帽将在当前发行生命周期中提供对这个功能的程序漏洞修复和支持,但这个功能将不再获得改进,并将被删除。您可以使用 Loki Operator 作为 OpenShift Elasticsearch Operator 的替代方案来管理默认日志存储。
7.1.2.1.5. 应用程序
应用程序的用例会根据不同应用程序而不同,如下例所示:
- 支持动态 PV 部署的存储技术的挂载时间延迟较低,且不与节点绑定来支持一个健康的集群。
- 应用程序开发人员需要了解应用程序对存储的要求,以及如何与所需的存储一起工作以确保应用程序扩展或者与存储层交互时不会出现问题。
7.1.2.2. 其他特定的应用程序存储建议
不建议在 Write
密集型工作负载(如 etcd
)中使用 RAID 配置。如果您使用 RAID 配置运行 etcd
,您可能会遇到工作负载性能问题的风险。
- Red Hat OpenStack Platform(RHOSP)Cinder: RHOSP Cinder 倾向于在 ROX 访问模式用例中使用。
- 数据库:数据库(RDBMS 、nosql DBs 等等)倾向于使用专用块存储来获得最好的性能。
- etcd 数据库必须具有足够的存储和适当的性能容量才能启用大型集群。有关监控和基准测试工具的信息,以建立基本存储和高性能环境,请参阅 推荐 etcd 实践。
7.1.3. 数据存储管理
下表总结了 OpenShift Container Platform 组件写入数据的主要目录。
目录 | 备注 | 大小 | 预期增长 |
---|---|---|---|
/var/log | 所有组件的日志文件。 | 10 到 30 GB。 | 日志文件可能会快速增长 ; 大小可以通过增加磁盘或使用日志轮转来管理。 |
/var/lib/etcd | 用于存储数据库的 etcd 存储。 | 小于 20 GB。 数据库可增大到 8 GB。 | 随着环境增长会缓慢增长。只存储元数据。 每多加 8 GB 内存需要额外 20-25 GB。 |
/var/lib/containers | 这是 CRI-O 运行时的挂载点。用于活跃容器运行时的存储,包括 Pod 和本地镜像存储。不适用于 registry 存储。 | 有 16 GB 内存的节点需要 50 GB。请注意,这个大小不应该用于决定最小集群要求。 每多加 8 GB 内存需要额外 20-25 GB。 | 增长受运行容器容量的限制。 |
/var/lib/kubelet | pod 的临时卷(Ephemeral volume)存储。这包括在运行时挂载到容器的任何外部存储。包括环境变量、kube secret 和不受持久性卷支持的数据卷。 | 可变 | 如果需要存储的 pod 使用持久性卷,则最小。如果使用临时存储,可能会快速增长。 |
7.1.4. 为 Microsoft Azure 优化存储性能
OpenShift Container Platform 和 Kubernetes 对磁盘性能敏感,建议使用更快的存储,特别是 control plane 节点上的 etcd。
对于生产环境 Azure 集群和带有密集型工作负载的集群,control plane 机器的虚拟机操作系统磁盘应该可以保持经过测试和推荐的最小吞吐量 5000 IOPS / 200MBps。此吞吐量可以通过至少 1 TiB Premium SSD (P30) 提供。在 Azure 和 Azure Stack Hub 中,磁盘性能直接依赖于 SSD 磁盘大小。要达到 Standard_D8s_v3
虚拟机或者其它类似机器类型,目标为 5000 IOPS,至少需要 P30 磁盘。
在读取数据时,主机缓存必须设置为 ReadOnly
,以实现低延迟和高 IOPS 和吞吐量。从缓存中读取数据(在虚拟机内存或本地 SSD 磁盘上)比从磁盘读取速度要快得多,而这在 blob 存储中。
7.1.5. 其他资源
7.2. 优化路由
OpenShift Container Platform HAProxy 路由器可以扩展或配置以优化性能。
7.2.1. Ingress Controller(router)性能的基线
OpenShift Container Platform Ingress Controller 或路由器是使用路由和入口配置的应用程序和服务的入口流量的入站点。
当根据每秒处理的 HTTP 请求来评估单个 HAProxy 路由器性能时,其性能取决于多个因素。特别是:
- HTTP keep-alive/close 模式
- 路由类型
- 对 TLS 会话恢复客户端的支持
- 每个目标路由的并行连接数
- 目标路由数
- 后端服务器页面大小
- 底层基础结构(网络/SDN 解决方案、CPU 等)
具体环境中的性能会有所不同,红帽实验室在一个有 4 个 vCPU/16GB RAM 的公有云实例中进行测试。一个 HAProxy 路由器处理由后端终止的 100 个路由服务提供 1kB 静态页面,每秒处理以下传输数。
在 HTTP 的 keep-alive 模式下:
Encryption | LoadBalancerService | HostNetwork |
---|---|---|
none | 21515 | 29622 |
edge | 16743 | 22913 |
passthrough | 36786 | 53295 |
re-encrypt | 21583 | 25198 |
在 HTTP 关闭(无 keep-alive)情境中:
Encryption | LoadBalancerService | HostNetwork |
---|---|---|
none | 5719 | 8273 |
edge | 2729 | 4069 |
passthrough | 4121 | 5344 |
re-encrypt | 2320 | 2941 |
默认 Ingress Controller 配置用于将 spec.tuningOptions.threadCount
字段设置为 4
。测试了两个不同的端点发布策略: Load Balancer Service 和 Host Network。TLS 会话恢复用于加密路由。使用 HTTP keep-alive 设置,单个 HAProxy 路由器可在页面大小小到 8 kB 时充满 1 Gbit NIC。
当在使用现代处理器的裸机中运行时,性能可以期望达到以上公有云实例测试性能的大约两倍。这个开销是由公有云的虚拟化层造成的,基于私有云虚拟化的环境也会有类似的开销。下表是有关在路由器后面的应用程序数量的指导信息:
应用程序数量 | 应用程序类型 |
---|---|
5-10 | 静态文件/web 服务器或者缓存代理 |
100-1000 | 生成动态内容的应用程序 |
取决于所使用的技术,HAProxy 通常可支持最多 1000 个程序的路由。Ingress Controller 性能可能会受其后面的应用程序的能力和性能的限制,如使用的语言,静态内容或动态内容。
如果有多个服务于应用程序的 Ingress 或路由器,则应该使用路由器分片(router sharding)以帮助横向扩展路由层。
如需有关 Ingress 分片的更多信息,请参阅使用路由标签和使用命名空间标签配置 Ingress Controller 分片。
您可以修改 Ingress Controller 部署,根据 Setting Ingress Controller thread count(对于线程)和 Ingress Controller configuration parameters(对于超时)的内容,以及其他 Ingress Controller 规格中的其他调优配置。
7.2.2. 配置 Ingress Controller 存活度、就绪度和启动探测
集群管理员可为由 OpenShift Container Platform Ingress Controller(路由器)管理的路由器部署配置 kubelet 存活度、就绪度和启动探测的超时值。路由器的存活度和就绪度探测使用默认值 1 秒,这在网络或运行时性能严重降级时太短。探测超时可能会导致中断应用程序连接的路由器重启。设置较大的超时值可以降低不必要的和不需要的重启的风险。
您可以更新路由器容器的 livenessProbe
、readinessProbe
和 startProbe
参数上的 timeoutSeconds
值。
参数 | 描述 |
---|---|
|
|
|
|
|
|
timeout 配置选项是一个高级调优技术,可用于解决问题。但是,最终应该诊断这些问题,并可能为导致探测超时的所有问题打开支持问题单或 JIRA 问题。
以下示例演示了如何直接修补默认路由器部署来为存活度和就绪度探测设置 5 秒超时:
$ oc -n openshift-ingress patch deploy/router-default --type=strategic --patch='{"spec":{"template":{"spec":{"containers":[{"name":"router","livenessProbe":{"timeoutSeconds":5},"readinessProbe":{"timeoutSeconds":5}}]}}}}'
验证
$ oc -n openshift-ingress describe deploy/router-default | grep -e Liveness: -e Readiness: Liveness: http-get http://:1936/healthz delay=0s timeout=5s period=10s #success=1 #failure=3 Readiness: http-get http://:1936/healthz/ready delay=0s timeout=5s period=10s #success=1 #failure=3
7.2.3. 配置 HAProxy 重新加载间隔
当您更新路由或与路由关联的端点时,OpenShift Container Platform 路由器会更新 HAProxy 的配置。然后,HAProxy 重新加载更新后的配置以使这些更改生效。当 HAProxy 重新加载时,它会生成一个使用更新的配置来处理新连接的新进程。
HAProxy 保持旧进程正在运行,以处理现有连接,直到这些连接都关闭。当旧进程有长期连接时,这些进程可能会累积并消耗资源。
默认最小 HAProxy 重新加载间隔为 5 秒。您可以使用 spec.tuningOptions.reloadInterval
字段配置 Ingress Controller,以设置较长的重新载入间隔。
为最低 HAProxy 重新加载间隔设置较大的值可能会导致观察路由及其端点更新产生延迟。要降低风险,请避免设置值超过更新可容忍的延迟。
流程
运行以下命令,将默认 Ingress Controller 的最小 HAProxy 重新加载间隔改为 15 秒:
$ oc -n openshift-ingress-operator patch ingresscontrollers/default --type=merge --patch='{"spec":{"tuningOptions":{"reloadInterval":"15s"}}}'
7.3. 优化网络
OpenShift SDN 使用 OpenvSwitch、虚拟可扩展 LAN(VXLAN)隧道、OpenFlow 规则和 iptables。可以使用巨型帧、多队列和 ethtool 设置调优此网络。
OVN-Kubernetes 使用通用网络虚拟化封装(Geneve)而不是 VXLAN 作为隧道协议。可以使用网络接口控制器 (NIC) 卸载来调优此网络。
VXLAN 提供通过 VLAN 的好处,比如网络从 4096 增加到一千六百万,以及跨物理网络的第 2 层连接。这允许服务后的所有 pod 相互通信,即使它们在不同系统中运行也是如此。
VXLAN 在用户数据报协议(UDP)数据包中封装所有隧道流量。但是,这会导致 CPU 使用率增加。这些外部数据包和内部数据包集都遵循常规的校验规则,以保证在传输过程中不会损坏数据。根据 CPU 性能,这种额外的处理开销可能会降低吞吐量,与传统的非覆盖网络相比会增加延迟。
云、虚拟机和裸机 CPU 性能可以处理很多 Gbps 网络吞吐量。当使用高带宽链接(如 10 或 40 Gbps)时,性能可能会降低。基于 VXLAN 的环境里存在一个已知问题,它并不适用于容器或 OpenShift Container Platform。由于 VXLAN 的实现,任何依赖于 VXLAN 隧道的网络都会有相似的性能。
如果您希望超过 Gbps,可以:
- 试用采用不同路由技术的网络插件,比如边框网关协议(BGP)。
- 使用 VXLAN-offload 功能的网络适配器。VXLAN-offload 将数据包校验和相关的 CPU 开销从系统 CPU 移动到网络适配器的专用硬件中。这会释放 Pod 和应用程序使用的 CPU 周期,并允许用户利用其网络基础架构的全部带宽。
VXLAN-offload 不会降低延迟。但是,即使延迟测试也会降低 CPU 使用率。
7.3.1. 为您的网络优化 MTU
有两个重要的最大传输单元 (MTU):网络接口控制器 (NIC) MTU 和集群网络 MTU。
NIC MTU 仅在 OpenShift Container Platform 安装时进行配置。MTU 必须小于或等于您网络 NIC 的最大支持值。如果您要优化吞吐量,请选择最大可能的值。如果您要优化最小延迟,请选择一个较低值。
OpenShift SDN 网络插件覆盖 MTU 必须至少小于 NIC MTU 50 字节。此帐户用于 SDN overlay 标头。因此,在普通以太网网络中,应该将其设置为 1450
。在巨型帧以太网网络中,这应设置为 8950
。这些值应该由 Cluster Network Operator 根据 NIC 配置的 MTU 自动设置。因此,集群管理员通常不会更新这些值。Amazon Web Services (AWS) 和裸机环境支持巨型帧以太网网络。此设置可以帮助吞吐量,特别是传输控制协议 (TCP)。
对于 OVN 和 Geneve,MTU 必须至少小于 NIC MTU 100 字节。
这个 50 字节覆盖标头与 OpenShift SDN 网络插件相关。其他 SDN 解决方案可能需要该值更大或更少。
7.3.2. 安装大型集群的实践建议
在安装大型集群或将现有的集群扩展到较大规模时,请在安装集群在 install-config.yaml
文件中相应地设置集群网络 cidr
:
networking: clusterNetwork: - cidr: 10.128.0.0/14 hostPrefix: 23 machineNetwork: - cidr: 10.0.0.0/16 networkType: OVNKubernetes serviceNetwork: - 172.30.0.0/16
如果集群的节点数超过 500 个,则无法使用默认的集群网络 cidr
10.128.0.0/14
。在这种情况下,必须将其设置为 10.128.0.0/12
或 10.128.0.0/10
,以支持超过 500 个节点的环境。
7.3.3. IPsec 的影响
因为加密和解密节点主机使用 CPU 电源,所以启用加密时,无论使用的 IP 安全系统是什么,性能都会影响节点上的吞吐量和 CPU 使用量。
IPsec 在到达 NIC 前,会在 IP 有效负载级别加密流量,以保护用于 NIC 卸载的字段。这意味着,在启用 IPSec 时,一些 NIC 加速功能可能无法使用,并可能导致吞吐量降低并增加 CPU 用量。
7.3.4. 其他资源
7.4. 使用挂载命名空间封装优化 CPU 使用量
您可以使用 mount 命名空间封装来优化 OpenShift Container Platform 集群中的 CPU 使用量,以便为 kubelet 和 CRI-O 进程提供私有命名空间。这可减少 systemd 使用的集群 CPU 资源,且功能没有差别。
挂载命名空间封装只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
7.4.1. 封装挂载命名空间
挂载命名空间用于隔离挂载点,以便不同命名空间中的进程无法查看彼此的文件。封装是将 Kubernetes 挂载命名空间移到备选位置的过程,这些位置不会由主机操作系统不断扫描。
主机操作系统使用 systemd 持续扫描所有挂载命名空间:标准 Linux 挂载和 Kubernetes 用来操作的大量挂载。kubelet 和 CRI-O 的当前实现都使用所有容器运行时和 kubelet 挂载点的顶级命名空间。但是,在私有命名空间中封装这些特定于容器的挂载点可减少 systemd 开销,且功能没有差别。为 CRI-O 和 kubelet 使用单独的挂载命名空间可以封装来自任何 systemd 或其他主机操作系统交互的容器特定挂载。
现在,所有 OpenShift Container Platform 管理员都可以获得潜在的 CPU 优化功能。封装也可以通过将 Kubernetes 特定的挂载点存储在非特权用户安全检查的位置来提高安全性。
下图显示了封装之前和之后的 Kubernetes 安装。这两种场景演示了具有双向、主机到容器和 none 挂载传播设置的示例容器。
在这里,我们看到 systemd、主机操作系统进程、kubelet 和容器运行时共享单个挂载命名空间。
- systemd、主机操作系统进程、kubelet 和容器运行时都可以访问所有挂载点和可见性。
-
容器 1 (使用双向挂载传播配置)可以访问 systemd 和主机挂载、kubelet 和 CRI-O 挂载。源自容器 1 的挂载(如
/run/a
)对于 systemd、主机操作系统进程、kubelet、容器运行时和其他配置了主机的容器或双向挂载传播(如在容器 2 中)可见。 -
容器 2 (使用 host-to-container 挂载传播配置)可以访问 systemd 和主机挂载、kubelet 和 CRI-O 挂载。源自容器 2 的挂载(如
/run/b
)对任何其他上下文都不可见。 -
容器 3 没有配置挂载传播,对外部挂载点没有可见性。源自容器 3 的挂载(如
/run/c
)对任何其他上下文都不可见。
下图演示了封装后的系统状态。
- 主 systemd 进程不再被禁止对特定于 Kubernetes 的挂载点进行不必要的扫描。它仅监控特定于 systemd 和主机挂载点。
- 主机操作系统进程只能访问 systemd 和主机挂载点。
- 为 CRI-O 和 kubelet 使用单独的挂载命名空间,可将所有特定于容器的挂载完全独立于任何 systemd 或其他主机操作系统交互。
-
容器 1 的行为保持不变,但它创建的挂载(如
/run/a
)不再对 systemd 或主机操作系统进程可见。仍然对 kubelet、CRI-O 和其他配置了主机到容器或双向挂载传播的容器(如 Container 2)可见。 - 容器 2 和容器 3 的行为不会改变。
7.4.2. 配置挂载命名空间封装
您可以配置挂载命名空间封装,以便集群以较少的资源开销运行。
挂载命名空间封装是一个技术预览功能,它默认是禁用的。要使用它,您必须手动启用该功能。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。
流程
使用以下 YAML 创建名为
mount_namespace_config.yaml
的文件:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 99-kubens-master spec: config: ignition: version: 3.2.0 systemd: units: - enabled: true name: kubens.service --- apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 99-kubens-worker spec: config: ignition: version: 3.2.0 systemd: units: - enabled: true name: kubens.service
运行以下命令来应用挂载命名空间
MachineConfig
CR:$ oc apply -f mount_namespace_config.yaml
输出示例
machineconfig.machineconfiguration.openshift.io/99-kubens-master created machineconfig.machineconfiguration.openshift.io/99-kubens-worker created
MachineConfig
CR 最多可能需要 30 分钟才能完成在集群中应用。您可以运行以下命令来检查MachineConfig
CR 的状态:$ oc get mcp
输出示例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-03d4bc4befb0f4ed3566a2c8f7636751 False True False 3 0 0 0 45m worker rendered-worker-10577f6ab0117ed1825f8af2ac687ddf False True False 3 1 1
运行以下命令,等待所有 control plane 和 worker 节点成功应用
MachineConfig
CR:$ oc wait --for=condition=Updated mcp --all --timeout=30m
输出示例
machineconfigpool.machineconfiguration.openshift.io/master condition met machineconfigpool.machineconfiguration.openshift.io/worker condition met
验证
要验证集群主机的封装,请运行以下命令:
打开集群主机的默认 shell:
$ oc debug node/<node_name>
打开
chroot
会话:sh-4.4# chroot /host
检查 systemd 挂载命名空间:
sh-4.4# readlink /proc/1/ns/mnt
输出示例
mnt:[4026531953]
检查 kubelet 挂载命名空间:
sh-4.4# readlink /proc/$(pgrep kubelet)/ns/mnt
输出示例
mnt:[4026531840]
检查 CRI-O 挂载命名空间:
sh-4.4# readlink /proc/$(pgrep crio)/ns/mnt
输出示例
mnt:[4026531840]
这些命令返回与 systemd、kubelet 和容器运行时关联的挂载命名空间。在 OpenShift Container Platform 中,容器运行时是 CRI-O。
如果 systemd 位于 kubelet 和 CRI-O 的挂载命名空间中,则封装生效,如上例中所示。如果所有三个进程都位于同一挂载命名空间中,则封装无效。
7.4.3. 检查封装的命名空间
您可以使用 Red Hat Enterprise Linux CoreOS (RHCOS) 中的 kubensenter
脚本检查集群主机操作系统中特定于 Kubernetes 的挂载点以进行调试或审核目的。
到集群主机的 SSH shell 会话位于 default 命名空间中。要在 SSH shell 提示符中检查特定于 Kubernetes 的挂载点,您需要以 root 用户身份运行 kubensenter
脚本。kubensenter
脚本了解挂载封装的状态,即使未启用封装,也可以安全地运行。
默认情况下,oc debug
远程 shell 会话在 Kubernetes 命名空间内启动。使用 oc debug
时,您不需要运行 kubensenter
来检查挂载点。
如果没有启用封装功能,kubensenter findmnt
和 findmnt
命令会返回相同的输出,无论它们是否在 oc debug
会话或 SSH shell 提示符中运行。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 您已配置了到集群主机的 SSH 访问。
流程
打开到集群主机的远程 SSH shell。例如:
$ ssh core@<node_name>
以 root 用户身份使用提供的
kubensenter
脚本运行命令。要在 Kubernetes 命名空间中运行单个命令,请为kubensenter
脚本提供命令和任何参数。例如,要在 Kubernetes 命名空间中运行findmnt
命令,请运行以下命令:[core@control-plane-1 ~]$ sudo kubensenter findmnt
输出示例
kubensenter: Autodetect: kubens.service namespace found at /run/kubens/mnt TARGET SOURCE FSTYPE OPTIONS / /dev/sda4[/ostree/deploy/rhcos/deploy/32074f0e8e5ec453e56f5a8a7bc9347eaa4172349ceab9c22b709d9d71a3f4b0.0] | xfs rw,relatime,seclabel,attr2,inode64,logbufs=8,logbsize=32k,prjquota shm tmpfs ...
要在 Kubernetes 命名空间中启动新的交互式 shell,请运行没有任何参数的
kubensenter
脚本:[core@control-plane-1 ~]$ sudo kubensenter
输出示例
kubensenter: Autodetect: kubens.service namespace found at /run/kubens/mnt
7.4.4. 在封装的命名空间中运行额外的服务
任何依赖于可以在主机操作系统中运行的能力,以及由 kubelet、CRI-O 或容器本身创建的挂载点的监控工具,都必须输入容器挂载命名空间来查看这些挂载点。OpenShift Container Platform 提供的 kubensenter
脚本在 Kubernetes 挂载点中执行另一个命令,并可用于适配任何现有工具。
kubensenter
脚本了解挂载封装功能状态,即使未启用封装功能,也可以安全地运行。在这种情况下,脚本会在默认挂载命名空间中执行提供的命令。
例如,如果 systemd 服务需要在新的 Kubernetes 挂载命名空间中运行,请编辑服务文件,并使用带有 kubensenter
的 ExecStart=
命令行。
[Unit] Description=Example service [Service] ExecStart=/usr/bin/kubensenter /path/to/original/command arg1 arg2
7.4.5. 其他资源
第 8 章 管理裸机主机
在裸机集群中安装 OpenShift Container Platform 时,您可以使用机器(machine)
和机器集(machineset)
自定义资源(CR)为集群中存在的裸机主机置备和管理裸机节点。
8.1. 关于裸机主机和节点
要将 Red Hat Enterprise Linux CoreOS(RHCOS)裸机主机置备为集群中的节点,首先创建一个与裸机主机硬件对应的 MachineSet
自定义资源(CR)对象。裸机主机计算机器集描述了特定于您的配置的基础架构组件。将特定的 Kubernetes 标签应用于这些计算机器集,然后将基础架构组件更新为仅在那些机器上运行。
当您扩展包含 metal3.io/autoscale-to-hosts
注解的相关 MachineSet
时,Machine
CR 会被自动创建。OpenShift Container Platform 使用 Machine
CR 来置备与 MachineSet
CR 中指定的主机对应的裸机节点。
8.2. 维护裸机主机
您可从 OpenShift Container Platform Web 控制台维护集群中的裸机主机详情。导航到 Compute → Bare Metal Hosts,然后从 Actions 下拉菜单中选择一个任务。您可以在此处管理诸如 BMC 详情、主机的引导 MAC 地址、启用电源管理等项目。您还可以查看主机的网络接口和驱动器详情。
您可以将裸机主机移入维护模式。当您将主机移入维护模式时,调度程序会将所有受管工作负载从对应的裸机节点中移出。在处于维护模式时不会调度新的工作负载。
您可以在 web 控制台中取消置备裸机主机。取消置备主机执行以下操作:
-
使用
cluster.k8s.io/delete-machine: true
注解裸机主机 CR - 缩减相关的计算机器集
在不先将守护进程集和未管理的静态 pod 移动到另一节点的情况下,关闭主机电源可能会导致服务中断和数据丢失。
其他资源
8.2.1. 使用 web 控制台在集群中添加裸机主机
您可以在 web 控制台中在集群中添加裸机主机。
先决条件
- 在裸机上安装 RHCOS 集群。
-
以具有
cluster-admin
特权的用户身份登录。
流程
- 在 web 控制台中,导航到 Compute → Bare Metal Hosts。
- 选择 Add Host → New with Dialog。
- 为新的裸机主机指定唯一名称。
- 设置 引导 MAC 地址。
- 设置 基板管理控制台(BMC)地址.
- 输入主机的基板管理控制器(BMC)的用户凭据。
- 选择在创建后打开主机电源,然后选择 Create。
- 向上扩展副本数,以匹配可用的裸机主机数量。导航到 Compute → MachineSets,然后从 Actions 下拉菜单中选择 Edit Machine count 来增加集群中的机器副本数量。
您还可以使用 oc scale
命令和适当的裸机计算机器集来管理裸机节点的数量。
8.2.2. 在 web 控制台中使用 YAML 在集群中添加裸机主机
您可以使用描述裸机主机的 YAML 文件在 web 控制台中在集群中添加裸机主机。
先决条件
- 在裸机基础架构上安装 RHCOS 计算机器,以便在集群中使用。
-
以具有
cluster-admin
特权的用户身份登录。 -
为裸机主机创建
Secret
CR。
流程
- 在 web 控制台中,导航到 Compute → Bare Metal Hosts。
- 选择 Add Host → New from YAML。
复制并粘贴以下 YAML,使用您的主机详情修改相关字段:
apiVersion: metal3.io/v1alpha1 kind: BareMetalHost metadata: name: <bare_metal_host_name> spec: online: true bmc: address: <bmc_address> credentialsName: <secret_credentials_name> 1 disableCertificateVerification: True 2 bootMACAddress: <host_boot_mac_address>
- 选择 Create 以保存 YAML 并创建新的裸机主机。
向上扩展副本数,以匹配可用的裸机主机数量。导航到 Compute → MachineSets,然后从 Actions 下拉菜单中选择 Edit Machine count 来增加集群中的机器数量。
注意您还可以使用
oc scale
命令和适当的裸机计算机器集来管理裸机节点的数量。
8.2.3. 自动将机器扩展到可用的裸机主机数量
要自动创建与可用 BareMetalHost
对象数量匹配的 Machine
对象数量,请在 MachineSet
对象中添加 metal3.io/autoscale-to-hosts
注解。
先决条件
-
安装 RHCOS 裸机计算机器以在集群中使用,并创建对应的
BareMetalHost
对象。 -
安装 OpenShift Container Platform CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
通过添加
metal3.io/autoscale-to-hosts
注解来注解您要配置的用于自动扩展的计算机器集。将<machineset>
替换为计算机器设置的名称。$ oc annotate machineset <machineset> -n openshift-machine-api 'metal3.io/autoscale-to-hosts=<any_value>'
等待新的缩放计算机启动。
当您使用 BareMetalHost
对象在集群中创建机器时,BareMetalHost
上更改了标签或选择器,BareMetalHost
对象仍然会根据创建 Machine
对象的 MachineSet
进行计数。
8.2.4. 从 provisioner 节点中删除裸机主机
在某些情况下,您可能想要从 provisioner 节点临时删除裸机主机。例如,在使用 OpenShift Container Platform 管理控制台或机器配置池更新触发裸机主机重启时,OpenShift Container Platform 日志会登录到集成的 Dell Remote Access Controller (iDrac),并发出删除作业队列。
要防止管理与可用 BareMetalHost
对象数量匹配的 Machine
对象数量,请在 MachineSet
对象中添加 baremetalhost.metal3.io/detached
注解。
这个注解只适用于处于 Provisioned
, ExternallyProvisioned
或 Ready/Available
状态的 BareMetalHost
对象。
先决条件
-
安装 RHCOS 裸机计算机器以在集群中使用,并创建对应的
BareMetalHost
对象。 -
安装 OpenShift Container Platform CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
通过添加
baremetalhost.metal3.io/detached
注解来注解您要从 provisioner 节点中删除的计算机器集。$ oc annotate machineset <machineset> -n openshift-machine-api 'baremetalhost.metal3.io/detached'
等待新机器启动。
注意当您使用
BareMetalHost
对象在集群中创建机器时,BareMetalHost
上更改了标签或选择器,BareMetalHost
对象仍然会根据创建Machine
对象的MachineSet
进行计数。在置备用例中,使用以下命令在重启完成后删除注解:
$ oc annotate machineset <machineset> -n openshift-machine-api 'baremetalhost.metal3.io/detached-'
第 9 章 使用 Bare Metal Event Relay 监控裸机事件
裸机事件中继只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
9.1. 关于裸机事件
使用 Bare Metal Event Relay 将 OpenShift Container Platform 集群中运行的应用程序订阅到底层裸机主机上生成的事件。Redfish 服务在节点上发布事件,并将其传送到高级消息队列中。
裸机事件基于在分布式管理任务组(DMTF)的指导下开发的开源 Redfish 标准。Redfish 提供了一个带有 REST API 的安全行业标准协议。该协议用于管理分布式、融合或软件定义的资源和基础架构。
通过 Redfish 发布的硬件相关事件包括:
- 违反临时处理限制
- 服务器状态
- 风扇状态
通过部署 Bare Metal Event Relay Operator 并将您的应用程序订阅到服务来开始使用裸机事件。Bare Metal Event Relay Operator 安装和管理 Redfish 裸机事件服务的生命周期。
Bare Metal 事件 Relay 只适用于在裸机基础架构上置备的单节点集群中支持 Redfish 的设备。
9.2. 裸机事件的工作方式
Bare Metal Event Relay 启用在裸机集群中运行的应用程序可以快速响应 Redfish 硬件更改和故障,如违反温度阈值、故障故障、磁盘丢失、电源中断和内存故障。这些硬件事件使用 HTTP 传输或 AMQP 机制交付。消息传递服务的延迟时间为 10 到 20 毫秒。
裸机事件中继为硬件事件提供了一个发布订阅服务。应用程序可以使用 REST API 订阅事件。Bare Metal 事件 Relay 支持与 Redfish OpenAPI v1.8 或更高版本的硬件。
9.2.1. 裸机事件中继数据流
下图演示了裸机事件数据流示例:
图 9.1. 裸机事件中继数据流
9.2.1.1. Operator 管理的 pod
Operator 使用自定义资源来管理包含 Bare Metal Event Relay 及其组件( hardware Event
CR) 的 pod。
9.2.1.2. 裸机事件中继
启动时,Bare Metal 事件 Relay 查询 Redfish API 并下载所有消息 registry,包括自定义 registry。然后,Bare Metal 事件 Relay 开始从 Redfish 硬件接收订阅的事件。
Bare Metal Event Relay 启用在裸机集群中运行的应用程序可以快速响应 Redfish 硬件更改和故障,如违反温度阈值、故障故障、磁盘丢失、电源中断和内存故障。使用 HardwareEvent
CR 报告事件。
9.2.1.3. 云原生事件
云原生事件(CNE)是用于定义事件数据格式的 REST API 规格。
9.2.1.4. CNCF CloudEvents
CloudEvents 是云原生计算基础(CNCF)开发的供应商中立规格,用于定义事件数据的格式。
9.2.1.5. HTTP 传输或 AMQP 分配路由器
HTTP 传输或 AMQP 分配路由器负责发布者和订阅者之间的消息交付服务。
HTTP 传输是 PTP 和裸机事件的默认传输。在可能的情况下,使用 HTTP 传输而不是 AMQP 用于 PTP 和裸机事件。AMQ Interconnect 于 2024 年 6 月 30 日结束生命周期(EOL)。AMQ Interconnect 的延长生命周期支持 (ELS) 于 2029 年 11 月 29 日结束。如需更多信息,请参阅 Red Hat AMQ Interconnect 支持状态。
9.2.1.6. 云事件代理 sidecar
云事件代理 sidecar 容器镜像基于 O-RAN API 规格,为硬件事件提供发布订阅事件框架。
9.2.2. Redfish 消息解析服务
除了处理 Redfish 事件外,Bare Metal Event Relay 为事件提供消息解析功能,而无需 Message
属性。代理会下载所有 Redfish 消息 registry,包括在启动时从硬件中的特定 registry。如果事件不包含 Message
属性,代理使用 Redfish 消息 registry 来构造 Message
和 Resolution
属性,并在将事件传递给云事件框架前将其添加到事件中。此服务允许 Redfish 事件具有较小的消息大小,并会降低传输延迟。
9.2.3. 使用 CLI 安装裸机事件中继
作为集群管理员,您可以使用 CLI 安装 Bare Metal Event Relay Operator。
先决条件
- 在裸机硬件上安装的集群,节点带有启用了 RedFish 的 Baseboard Management Controller(BMC)。
-
安装 OpenShift CLI (
oc
) 。 -
以具有
cluster-admin
特权的用户身份登录。
流程
为 Bare Metal Event Relay 创建命名空间。
将以下 YAML 保存到
bare-metal-events-namespace.yaml
文件中:apiVersion: v1 kind: Namespace metadata: name: openshift-bare-metal-events labels: name: openshift-bare-metal-events openshift.io/cluster-monitoring: "true"
创建
Namespace
CR:$ oc create -f bare-metal-events-namespace.yaml
为 Bare Metal Event Relay Operator 创建 Operator 组。
将以下 YAML 保存到
bare-metal-events-operatorgroup.yaml
文件中:apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: bare-metal-event-relay-group namespace: openshift-bare-metal-events spec: targetNamespaces: - openshift-bare-metal-events
创建
OperatorGroup
CR:$ oc create -f bare-metal-events-operatorgroup.yaml
订阅裸机恢复事件中继。
将以下 YAML 保存到
bare-metal-events-sub.yaml
文件中:apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: bare-metal-event-relay-subscription namespace: openshift-bare-metal-events spec: channel: "stable" name: bare-metal-event-relay source: redhat-operators sourceNamespace: openshift-marketplace
创建
Subscription
CR:$ oc create -f bare-metal-events-sub.yaml
验证
要验证是否已安装 Bare Metal Event Relay Operator,请运行以下命令:
$ oc get csv -n openshift-bare-metal-events -o custom-columns=Name:.metadata.name,Phase:.status.phase
9.2.4. 使用 Web 控制台安装 Bare Metal Event Relay
作为集群管理员,您可以使用 Web 控制台安装 Bare Metal Event Relay Operator。
先决条件
- 在裸机硬件上安装的集群,节点带有启用了 RedFish 的 Baseboard Management Controller(BMC)。
-
以具有
cluster-admin
特权的用户身份登录。
流程
使用 OpenShift Container Platform Web 控制台安装 Bare Metal Event Relay:
- 在 OpenShift Container Platform Web 控制台中,点击 Operators → OperatorHub。
- 从可用的 Operator 列表中选择 Bare Metal Event Relay,然后点 Install。
- 在 Install Operator 页面中,选择或创建一个命名空间,选择 openshift-bare-metal-events,然后点 Install。
验证
可选: 您可以通过执行以下检查来验证 Operator 是否已成功安装:
- 切换到 Operators → Installed Operators 页面。
确保项目中列出了 Bare Metal Event Relay,Status 为 InstallSucceeded。
注意在安装过程中,Operator 可能会显示 Failed 状态。如果安装过程结束后有 InstallSucceeded 信息,您可以忽略这个 Failed 信息。
如果 Operator 没有被成功安装,请按照以下步骤进行故障排除:
- 进入 Operators → Installed Operators 页面,检查 Operator Subscriptions 和 Install Plans 选项卡中的 Status 项中是否有任何错误。
- 进入 Workloads → Pods 页面,检查项目命名空间中的 pod 日志。
9.3. 安装 AMQ 消息传递总线
要在节点上的 publisher 和 subscriber 间传递 Redfish 裸机事件通知,您必须安装并配置 AMQ 消息总线以便在节点上运行。您可以通过安装 AMQ Interconnect Operator 来在集群中使用。
HTTP 传输是 PTP 和裸机事件的默认传输。在可能的情况下,使用 HTTP 传输而不是 AMQP 用于 PTP 和裸机事件。AMQ Interconnect 于 2024 年 6 月 30 日结束生命周期(EOL)。AMQ Interconnect 的延长生命周期支持 (ELS) 于 2029 年 11 月 29 日结束。如需更多信息,请参阅 Red Hat AMQ Interconnect 支持状态。
先决条件
-
安装 OpenShift Container Platform CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。
流程
-
将 AMQ Interconnect Operator 安装到其自己的
amq-interconnect
命名空间。请参阅安装 AMQ Interconnect Operator。
验证
验证 AMQ Interconnect Operator 是否可用,并且所需的 pod 是否正在运行:
$ oc get pods -n amq-interconnect
输出示例
NAME READY STATUS RESTARTS AGE amq-interconnect-645db76c76-k8ghs 1/1 Running 0 23h interconnect-operator-5cb5fc7cc-4v7qm 1/1 Running 0 23h
验证所需的
bare-metal-event-relay
bare-metal event producer pod 是否已在openshift-bare-metal-events
命令空间中运行:$ oc get pods -n openshift-bare-metal-events
输出示例
NAME READY STATUS RESTARTS AGE hw-event-proxy-operator-controller-manager-74d5649b7c-dzgtl 2/2 Running 0 25s
9.4. 订阅集群节点的 Redfish BMC 裸机事件
您可以通过为节点创建一个 BMCEventSubscription
自定义资源(CR)、为事件创建一个 HardwareEvent
CR 并为 BMC 创建一个 Secret
CR,订阅在集群的节点上生成的 Redfish BMC 事件。
9.4.1. 订阅裸机事件
您可以配置基板管理控制器(BMC)将裸机事件发送到 OpenShift Container Platform 集群中运行的订阅应用程序。Redfish 裸机事件示例包括增加设备温度或删除设备。您可以使用 REST API 将应用程序订阅到裸机事件。
您只能为支持 Redfish 的物理硬件创建一个 BMCEventSubscription
自定义资源(CR),并将厂商接口设置为 redfish
或 idrac-redfish
。
使用 BMCEventSubscription
CR 订阅预定义的 Redfish 事件。Redfish 标准不提供创建特定警报和阈值的选项。例如,当机箱的温度超过 40Gb 摄氏度时收到警报事件,您必须根据供应商的建议手动配置事件。
执行以下步骤使用 BMCEventSubscription
CR 为节点订阅裸机事件。
先决条件
-
安装 OpenShift CLI(
oc
)。 -
以具有
cluster-admin
特权的用户身份登录。 - 获取 BMC 的用户名和密码。
使用集群中启用了 Redfish 的 Baseboard Management Controller(BMC)部署裸机节点,并在 BMC 上启用 Redfish 事件。
注意在特定硬件上启用 Redfish 事件超出了此信息的范围。有关为特定硬件启用 Redfish 事件的更多信息,请参阅 BMC 厂商文档。
流程
通过运行以下
curl
命令确认节点硬件启用了 RedfishEventService
:$ curl https://<bmc_ip_address>/redfish/v1/EventService --insecure -H 'Content-Type: application/json' -u "<bmc_username>:<password>"
其中:
- bmc_ip_address
- 是生成 Redfish 事件的 BMC 的 IP 地址。
输出示例
{ "@odata.context": "/redfish/v1/$metadata#EventService.EventService", "@odata.id": "/redfish/v1/EventService", "@odata.type": "#EventService.v1_0_2.EventService", "Actions": { "#EventService.SubmitTestEvent": { "EventType@Redfish.AllowableValues": ["StatusChange", "ResourceUpdated", "ResourceAdded", "ResourceRemoved", "Alert"], "target": "/redfish/v1/EventService/Actions/EventService.SubmitTestEvent" } }, "DeliveryRetryAttempts": 3, "DeliveryRetryIntervalSeconds": 30, "Description": "Event Service represents the properties for the service", "EventTypesForSubscription": ["StatusChange", "ResourceUpdated", "ResourceAdded", "ResourceRemoved", "Alert"], "EventTypesForSubscription@odata.count": 5, "Id": "EventService", "Name": "Event Service", "ServiceEnabled": true, "Status": { "Health": "OK", "HealthRollup": "OK", "State": "Enabled" }, "Subscriptions": { "@odata.id": "/redfish/v1/EventService/Subscriptions" } }
运行以下命令,获取集群的 Bare Metal 事件中继服务路由:
$ oc get route -n openshift-bare-metal-events
输出示例
NAME HOST/PORT PATH SERVICES PORT TERMINATION WILDCARD hw-event-proxy hw-event-proxy-openshift-bare-metal-events.apps.compute-1.example.com hw-event-proxy-service 9087 edge None
创建一个
BMCEventSubscription
资源来订阅 Redfish 事件:将以下 YAML 保存到
bmc_sub.yaml
文件中:apiVersion: metal3.io/v1alpha1 kind: BMCEventSubscription metadata: name: sub-01 namespace: openshift-machine-api spec: hostName: <hostname> 1 destination: <proxy_service_url> 2 context: ''
创建
BMCEventSubscription
CR:$ oc create -f bmc_sub.yaml
可选: 要删除 BMC 事件订阅,请运行以下命令:
$ oc delete -f bmc_sub.yaml
可选: 要在不创建
BMCEventSubscription
CR 的情况下手动创建 Redfish 事件订阅,请运行以下curl
命令并指定 BMC 用户名和密码。$ curl -i -k -X POST -H "Content-Type: application/json" -d '{"Destination": "https://<proxy_service_url>", "Protocol" : "Redfish", "EventTypes": ["Alert"], "Context": "root"}' -u <bmc_username>:<password> 'https://<bmc_ip_address>/redfish/v1/EventService/Subscriptions' –v
其中:
- proxy_service_url
-
裸机事件代理服务,例如
https://hw-event-proxy-openshift-bare-metal-events.apps.compute-1.example.com/webhook
。
- bmc_ip_address
- 是生成 Redfish 事件的 BMC 的 IP 地址。
输出示例
HTTP/1.1 201 Created Server: AMI MegaRAC Redfish Service Location: /redfish/v1/EventService/Subscriptions/1 Allow: GET, POST Access-Control-Allow-Origin: * Access-Control-Expose-Headers: X-Auth-Token Access-Control-Allow-Headers: X-Auth-Token Access-Control-Allow-Credentials: true Cache-Control: no-cache, must-revalidate Link: <http://redfish.dmtf.org/schemas/v1/EventDestination.v1_6_0.json>; rel=describedby Link: <http://redfish.dmtf.org/schemas/v1/EventDestination.v1_6_0.json> Link: </redfish/v1/EventService/Subscriptions>; path= ETag: "1651135676" Content-Type: application/json; charset=UTF-8 OData-Version: 4.0 Content-Length: 614 Date: Thu, 28 Apr 2022 08:47:57 GMT
9.4.2. 使用 curl 查询 Redfish 裸机事件订阅
有些硬件供应商限制 Redfish 硬件事件订阅的数量。您可以使用 curl
查询 Redfish 事件订阅的数量。
先决条件
- 获取 BMC 的用户名和密码。
- 使用集群中启用了 Redfish 的 Baseboard Management Controller(BMC)部署裸机节点,并在 BMC 上启用 Redfish 硬件事件。
流程
运行以下
curl
命令,检查 BMC 的当前订阅:$ curl --globoff -H "Content-Type: application/json" -k -X GET --user <bmc_username>:<password> https://<bmc_ip_address>/redfish/v1/EventService/Subscriptions
其中:
- bmc_ip_address
- 是生成 Redfish 事件的 BMC 的 IP 地址。
输出示例
% Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 435 100 435 0 0 399 0 0:00:01 0:00:01 --:--:-- 399 { "@odata.context": "/redfish/v1/$metadata#EventDestinationCollection.EventDestinationCollection", "@odata.etag": "" 1651137375 "", "@odata.id": "/redfish/v1/EventService/Subscriptions", "@odata.type": "#EventDestinationCollection.EventDestinationCollection", "Description": "Collection for Event Subscriptions", "Members": [ { "@odata.id": "/redfish/v1/EventService/Subscriptions/1" }], "Members@odata.count": 1, "Name": "Event Subscriptions Collection" }
本例中配置了单个订阅:
/redfish/v1/EventService/Subscriptions/1
。可选: 要使用
curl
删除/redfish/v1/EventService/Subscriptions/1
订阅,请运行以下命令并指定 BMC 用户名和密码:$ curl --globoff -L -w "%{http_code} %{url_effective}\n" -k -u <bmc_username>:<password >-H "Content-Type: application/json" -d '{}' -X DELETE https://<bmc_ip_address>/redfish/v1/EventService/Subscriptions/1
其中:
- bmc_ip_address
- 是生成 Redfish 事件的 BMC 的 IP 地址。
9.4.3. 创建裸机事件和 Secret CR
要使用裸机事件,请为存在 Redfish 硬件的主机创建 HardwareEvent
自定义资源(CR)。在 hw-event-proxy
日志中报告硬件事件和错误。
先决条件
-
已安装 OpenShift Container Platform CLI (
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 已安装 Bare Metal Event Relay。
-
您已为 BMC Redfish 硬件创建了
BMCEventSubscription
CR。
流程
创建
HardwareEvent
自定义资源(CR):注意不允许多个
HardwareEvent
资源。将以下 YAML 保存到
hw-event.yaml
文件中:apiVersion: "event.redhat-cne.org/v1alpha1" kind: "HardwareEvent" metadata: name: "hardware-event" spec: nodeSelector: node-role.kubernetes.io/hw-event: "" 1 logLevel: "debug" 2 msgParserTimeout: "10" 3
- 1
- 必需。使用
nodeSelector
字段来带有指定标签的目标节点,如node-role.kubernetes.io/hw-event: ""
。注意在 OpenShift Container Platform 4.12 或更高版本中,当对裸机事件使用 HTTP 传输时,您不需要在
HardwareEvent
资源中设置spec.transportHost
字段。仅在裸机事件使用 AMQP 传输时设置transportHost
。 - 2
- 可选。默认值为
debug
。在hw-event-proxy
日志中设置日志级别。可用的日志级别如下:fatal
、error
、warning
、info
、debug
、trace
。 - 3
- 可选。为 Message Parser 设置超时值(毫秒)。如果在超时时间内没有响应消息解析请求,原始硬件事件信息会被传递给云原生事件框架。默认值为 10。
在集群中应用
HardwareEvent
CR:$ oc create -f hardware-event.yaml
创建一个 BMC 用户名和密码
Secret
CR,使硬件事件代理能够访问裸机主机的 Redfish 消息 registry。将以下 YAML 保存到
hw-event-bmc-secret.yaml
文件中:apiVersion: v1 kind: Secret metadata: name: redfish-basic-auth type: Opaque stringData: 1 username: <bmc_username> password: <bmc_password> # BMC host DNS or IP address hostaddr: <bmc_host_ip_address>
- 1
- 为
stringData
下的各种项目输入纯文本值。
创建
Secret
CR:$ oc create -f hw-event-bmc-secret.yaml
其他资源
9.5. 将应用程序订阅到裸机事件 REST API 参考
使用裸机事件 REST API 订阅应用程序到父节点上生成的裸机事件。
使用资源地址 /cluster/node/<node_name>/redfish/event
将应用程序订阅到 Redfish 事件,其中 <node_name>
是运行应用程序的集群节点。
在单独的应用程序 pod 中部署 cloud-event-consumer
应用程序容器和 cloud-event-proxy
sidecar 容器。cloud-event-consumer
应用订阅应用容器集中的 cloud-event-proxy
容器。
使用以下 API 端点,将 cloud-event-consumer
应用程序订阅到 Redfish 事件,这些事件由 cloud-event-proxy
容器发布,位于应用程序 pod 中的 http://localhost:8089/api/ocloudNotifications/v1/
:
/api/ocloudNotifications/v1/subscriptions
-
POST
:创建新订阅 -
GET
:删除订阅列表
-
/api/ocloudNotifications/v1/subscriptions/<subscription_id>
-
PUT
:为指定订阅 ID 创建新状态 ping 请求
-
/api/ocloudNotifications/v1/health
-
GET
:返回ocloudNotifications
API 的健康状况
-
9089
是在应用程序 Pod 中部署的 cloud-event-consumer
容器的默认端口。您可以根据需要为应用程序配置不同的端口。
api/ocloudNotifications/v1/subscriptions
HTTP 方法
GET api/ocloudNotifications/v1/subscriptions
描述
返回订阅列表。如果订阅存在,则返回 200 OK
状态代码以及订阅列表。
API 响应示例
[ { "id": "ca11ab76-86f9-428c-8d3a-666c24e34d32", "endpointUri": "http://localhost:9089/api/ocloudNotifications/v1/dummy", "uriLocation": "http://localhost:8089/api/ocloudNotifications/v1/subscriptions/ca11ab76-86f9-428c-8d3a-666c24e34d32", "resource": "/cluster/node/openshift-worker-0.openshift.example.com/redfish/event" } ]
HTTP 方法
POST api/ocloudNotifications/v1/subscriptions
描述
创建新订阅。如果订阅成功创建,或者已存在,则返回 201 Created
状态代码。
参数 | 类型 |
---|---|
subscription | data |
有效负载示例
{ "uriLocation": "http://localhost:8089/api/ocloudNotifications/v1/subscriptions", "resource": "/cluster/node/openshift-worker-0.openshift.example.com/redfish/event" }
api/ocloudNotifications/v1/subscriptions/<subscription_id>
HTTP 方法
GET api/ocloudNotifications/v1/subscriptions/<subscription_id>
描述
返回 ID 为 <subscription_id>
的订阅详情
参数 | 类型 |
---|---|
| string |
API 响应示例
{ "id":"ca11ab76-86f9-428c-8d3a-666c24e34d32", "endpointUri":"http://localhost:9089/api/ocloudNotifications/v1/dummy", "uriLocation":"http://localhost:8089/api/ocloudNotifications/v1/subscriptions/ca11ab76-86f9-428c-8d3a-666c24e34d32", "resource":"/cluster/node/openshift-worker-0.openshift.example.com/redfish/event" }
api/ocloudNotifications/v1/health/
HTTP 方法
GET api/ocloudNotifications/v1/health/
描述
返回 ocloudNotifications
REST API 的健康状况。
API 响应示例
OK
9.6. 迁移消费者应用程序,以使用 PTP 或裸机事件的 HTTP 传输
如果您之前部署了 PTP 或裸机事件消费者应用程序,您需要更新应用程序以使用 HTTP 消息传输。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 您已将 PTP Operator 或 Bare Metal Event Relay 更新至使用 HTTP 传输的版本 4.12 或更新的版本。
流程
更新您的事件消费者应用以使用 HTTP 传输。为云事件 sidecar 部署设置
http-event-publishers
变量。例如,在配置了 PTP 事件的集群中,以下 YAML 片断演示了一个云事件 sidecar 部署:
containers: - name: cloud-event-sidecar image: cloud-event-sidecar args: - "--metrics-addr=127.0.0.1:9091" - "--store-path=/store" - "--transport-host=consumer-events-subscription-service.cloud-events.svc.cluster.local:9043" - "--http-event-publishers=ptp-event-publisher-service-NODE_NAME.openshift-ptp.svc.cluster.local:9043" 1 - "--api-port=8089"
- 1
- PTP Operator 会自动将
NODE_NAME
解析为正在生成 PTP 事件的主机。例如,compute-1.example.com
。
在配置了裸机事件的集群中,在云事件 sidecar 部署 CR 中将
http-event-publishers
字段设置为hw-event-publisher-service.openshift-bare-metal-events.svc.cluster.local:9043
。将
consumer-events-subscription-service
服务与事件消费者应用程序一起部署。例如:apiVersion: v1 kind: Service metadata: annotations: prometheus.io/scrape: "true" service.alpha.openshift.io/serving-cert-secret-name: sidecar-consumer-secret name: consumer-events-subscription-service namespace: cloud-events labels: app: consumer-service spec: ports: - name: sub-port port: 9043 selector: app: consumer clusterIP: None sessionAffinity: None type: ClusterIP
第 10 章 巨页的作用及应用程序如何使用它们
10.1. 巨页的作用
内存在块(称为页)中进行管理。在大多数系统中,页的大小为 4Ki。1Mi 内存相当于 256 个页,1Gi 内存相当于 256,000 个页。CPU 有内置的内存管理单元,可在硬件中管理这些页的列表。Translation Lookaside Buffer (TLB) 是虚拟页到物理页映射的小型硬件缓存。如果在硬件指令中包括的虚拟地址可以在 TLB 中找到,则其映射信息可以被快速获得。如果没有包括在 TLN 中,则称为 TLB miss。系统将会使用基于软件的,速度较慢的地址转换机制,从而出现性能降低的问题。因为 TLB 的大小是固定的,因此降低 TLB miss 的唯一方法是增加页的大小。
巨页指一个大于 4Ki 的内存页。在 x86_64 构架中,有两个常见的巨页大小: 2Mi 和 1Gi。在其它构架上的大小会有所不同。要使用巨页,必须写相应的代码以便应用程序了解它们。Transparent Huge Pages(THP)试图在应用程序不需要了解的情况下自动管理巨页,但这个技术有一定的限制。特别是,它的页大小会被限为 2Mi。当有较高的内存使用率时,THP 可能会导致节点性能下降,或出现大量内存碎片(因为 THP 的碎片处理)导致内存页被锁定。因此,有些应用程序可能更适用于(或推荐)使用预先分配的巨页,而不是 THP。
在 OpenShift Container Platform 中,pod 中的应用程序可以分配并消耗预先分配的巨页。
10.2. 应用程序如何使用巨页
节点必须预先分配巨页以便节点报告其巨页容量。一个节点只能预先分配一个固定大小的巨页。
巨页可以使用名为 hugepages-<size>
的容器一级的资源需求被消耗。其中 size 是特定节点上支持的整数值的最精简的二进制标记。例如:如果某个节点支持 2048KiB 页大小,它将会有一个可调度的资源 hugepages-2Mi
。与 CPU 或者内存不同,巨页不支持过量分配。
apiVersion: v1
kind: Pod
metadata:
generateName: hugepages-volume-
spec:
containers:
- securityContext:
privileged: true
image: rhel7:latest
command:
- sleep
- inf
name: example
volumeMounts:
- mountPath: /dev/hugepages
name: hugepage
resources:
limits:
hugepages-2Mi: 100Mi 1
memory: "1Gi"
cpu: "1"
volumes:
- name: hugepage
emptyDir:
medium: HugePages
- 1
- 为
巨页
指定要分配的准确内存数量。不要将这个值指定为巨页
内存大小乘以页的大小。例如,巨页的大小为 2MB,如果应用程序需要使用由巨页组成的 100MB 的内存,则需要分配 50 个巨页。OpenShift Container Platform 会进行相应的计算。如上例所示,您可以直接指定100MB
。
分配特定大小的巨页
有些平台支持多个巨页大小。要分配指定大小的巨页,在巨页引导命令参数前使用巨页大小选择参数hugepagesz=<size>
。<size>
的值必须以字节为单位,并可以使用一个可选的后缀 [kKmMgG
]。默认的巨页大小可使用 default_hugepagesz=<size>
引导参数定义。
巨页要求
- 巨页面请求必须等于限制。如果指定了限制,则它是默认的,但请求不是。
- 巨页在 pod 范围内被隔离。容器隔离功能计划在以后的版本中推出。
-
后端为巨页的
EmptyDir
卷不能消耗大于 pod 请求的巨页内存。 -
通过带有
SHM_HUGETLB
的shmget()
来使用巨页的应用程序,需要运行一个匹配 proc/sys/vm/hugetlb_shm_group 的 supplemental 组。
10.3. 使用 Downward API 消耗巨页资源
您可以使用 Downward API 注入容器消耗的巨页资源的信息。
您可以将资源分配作为环境变量、卷插件或两者都注入。您在容器中开发和运行的应用可以通过读取指定卷中的环境变量或文件来确定可用的资源。
流程
创建一个类似以下示例的
hugepages-volume-pod.yaml
文件:apiVersion: v1 kind: Pod metadata: generateName: hugepages-volume- labels: app: hugepages-example spec: containers: - securityContext: capabilities: add: [ "IPC_LOCK" ] image: rhel7:latest command: - sleep - inf name: example volumeMounts: - mountPath: /dev/hugepages name: hugepage - mountPath: /etc/podinfo name: podinfo resources: limits: hugepages-1Gi: 2Gi memory: "1Gi" cpu: "1" requests: hugepages-1Gi: 2Gi env: - name: REQUESTS_HUGEPAGES_1GI <.> valueFrom: resourceFieldRef: containerName: example resource: requests.hugepages-1Gi volumes: - name: hugepage emptyDir: medium: HugePages - name: podinfo downwardAPI: items: - path: "hugepages_1G_request" <.> resourceFieldRef: containerName: example resource: requests.hugepages-1Gi divisor: 1Gi
<.> 指定从
requests.hugepages-1Gi
读取资源使用,并将值公开为REQUESTS_HUGEPAGES_1GI
环境变量。< .> 指定从requests.hugepages-1Gi
读取资源使用,并将值公开为文件/etc/podinfo/hugepages_1G_request
。从
hugepages-volume-pod.yaml
文件创建 pod:$ oc create -f hugepages-volume-pod.yaml
验证
检查
REQUESTS_HUGEPAGES_1GI
环境变量的值:$ oc exec -it $(oc get pods -l app=hugepages-example -o jsonpath='{.items[0].metadata.name}') \ -- env | grep REQUESTS_HUGEPAGES_1GI
输出示例
REQUESTS_HUGEPAGES_1GI=2147483648
检查
/etc/podinfo/hugepages_1G_request
文件的值:$ oc exec -it $(oc get pods -l app=hugepages-example -o jsonpath='{.items[0].metadata.name}') \ -- cat /etc/podinfo/hugepages_1G_request
输出示例
2
10.4. 在引导时配置巨页
节点必须预先分配在 OpenShift Container Platform 集群中使用的巨页。保留巨页的方法有两种: 在引导时和在运行时。在引导时进行保留会增加成功的可能性,因为内存还没有很大的碎片。Node Tuning Operator 目前支持在特定节点上分配巨页。
流程
要减少节点重启的情况,请按照以下步骤顺序进行操作:
通过标签标记所有需要相同巨页设置的节点。
$ oc label node <node_using_hugepages> node-role.kubernetes.io/worker-hp=
创建一个包含以下内容的文件,并把它命名为
hugepages_tuning.yaml
:apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: hugepages 1 namespace: openshift-cluster-node-tuning-operator spec: profile: 2 - data: | [main] summary=Boot time configuration for hugepages include=openshift-node [bootloader] cmdline_openshift_node_hugepages=hugepagesz=2M hugepages=50 3 name: openshift-node-hugepages recommend: - machineConfigLabels: 4 machineconfiguration.openshift.io/role: "worker-hp" priority: 30 profile: openshift-node-hugepages
创建 Tuned
hugepages
对象$ oc create -f hugepages-tuned-boottime.yaml
创建一个带有以下内容的文件,并把它命名为
hugepages-mcp.yaml
:apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: name: worker-hp labels: worker-hp: "" spec: machineConfigSelector: matchExpressions: - {key: machineconfiguration.openshift.io/role, operator: In, values: [worker,worker-hp]} nodeSelector: matchLabels: node-role.kubernetes.io/worker-hp: ""
创建机器配置池:
$ oc create -f hugepages-mcp.yaml
因为有足够的非碎片内存,worker-hp
机器配置池中的所有节点现在都应分配 50 个 2Mi 巨页。
$ oc get node <node_using_hugepages> -o jsonpath="{.status.allocatable.hugepages-2Mi}" 100Mi
TuneD bootloader 插件只支持 Red Hat Enterprise Linux CoreOS (RHCOS) worker 节点。
10.5. 禁用透明巨页
Transparent Huge Pages (THP) 会试图自动执行创建、管理和使用巨页的大部分方面。由于 THP 自动管理巨页,因此并不始终对所有类型的工作负载进行最佳处理。THP 可能会导致性能下降,因为许多应用程序都自行处理巨页。因此,请考虑禁用 THP。以下步骤描述了如何使用 Node Tuning Operator (NTO)禁用 THP。
流程
使用以下内容创建文件,并将其命名为
thp-disable-tuned.yaml
:apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: thp-workers-profile namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=Custom tuned profile for OpenShift to turn off THP on worker nodes include=openshift-node [vm] transparent_hugepages=never name: openshift-thp-never-worker recommend: - match: - label: node-role.kubernetes.io/worker priority: 25 profile: openshift-thp-never-worker
创建 Tuned 对象:
$ oc create -f thp-disable-tuned.yaml
检查活跃配置集列表:
$ oc get profile -n openshift-cluster-node-tuning-operator
验证
登录到其中一个节点,并执行常规 THP 检查来验证节点是否成功应用了配置集:
$ cat /sys/kernel/mm/transparent_hugepage/enabled
输出示例
always madvise [never]
第 11 章 低延迟调整
11.1. 了解低延迟
在 Telco / 5G 领域,Edge 计算对于减少延迟和拥塞问题,以及提高应用程序性能方面扮演了关键角色。
简单地说,延迟决定了数据(packets)从发送方到接收方的速度,以及在接收方处理后返回到发送方的速度。维护一个最低延迟速度的网络构架是满足 5G 的网络性能要求的关键。与 4G 技术相比,平均延迟为 50 ms,5G 的目标是达到 1ms 或更少的延迟。这个对延迟的降低会将无线网络的吞吐量提高 10 倍。
很多在 Telco 空间部署的应用程序都需要低延迟,它们只能容忍零数据包丢失。针对零数据包丢失进行调节有助于缓解降低网络性能的固有问题。如需更多信息,请参阅 Red Hat OpenStack Platform(RHOSP)中的 Zero Packet Los 调节。
Edge 计算也可用于降低延迟率。将其想象成云边缘,并更接近用户。这可大大减少用户和远程数据中心之间的距离,从而减少应用程序响应时间和性能延迟。
管理员必须能够集中管理多个 Edge 站点和本地服务,以便所有部署都可以以最低的管理成本运行。它们还需要一个简便的方法来部署和配置其集群的某些节点,以实现实时低延迟和高性能目的。低延迟节点对于如 Cloud-native Network Functions(CNF)和 Data Plane Development Kit(DPDK) 等应用程序非常有用。
OpenShift Container Platform 目前提供在 OpenShift Container Platform 集群上调整软件的机制,以获取实时运行和低延迟时间(响应时间小于 20 微秒)。这包括调整内核和 OpenShift Container Platform 设置值、安装内核和重新配置机器。但是这个方法需要设置四个不同的 Operator,并执行很多配置,这些配置在手动完成时比较复杂,并容易出错。
OpenShift Container Platform 使用 Node Tuning Operator 实现自动性能优化,以实现 OpenShift Container Platform 应用程序的低延迟性能。集群管理员使用此性能配置集配置,这有助于以更可靠的方式进行更改。管理员可以指定是否要将内核更新至 kernel-rt,为集群和操作系统日常任务保留 CPU(包括 pod infra 容器),以及隔离 CPU,以便应用程序容器运行工作负载。
目前,cgroup v2 不支持禁用 CPU 负载均衡。因此,如果您启用了 cgroup v2,则可能无法从性能配置集中获取所需的行为。如果您使用 executeace 配置集,则不建议启用 cgroup v2。
OpenShift Container Platform 还支持 Node Tuning Operator 的工作负载提示,它可以微调 PerformanceProfile
以满足不同行业环境的需求。工作负载提示可用于 highPowerConsumption
(以增加功耗为代价已实现非常低的延迟),以及 realtime
(实现最佳延迟具有高优先级)。对于这些提示使用 true/false
设置的组合来处理特定于应用程序的工作负载配置文件和要求。
工作负载提示简化了行业扇区设置的性能微调。工作负载提示可以满足所有"大小"方法,而是可以将工作负载提示满足使用模式,例如将优先级放在:
- 低延迟
- 实时功能
- 有效地使用电源
在理想的情况中,所有这些都应该被优先考虑:但在现实情况中,对其中一些进行优化会造成其他部分的成本增加。Node Tuning Operator 现在可以了解工作负载预期并更好地满足工作负载的需求。集群管理员现在可以指定工作负载进入的用例。Node Tuning Operator 使用 PerformanceProfile
来微调工作负载的性能设置。
运行应用程序的环境会影响其行为。对于没有严格的延迟要求的典型数据中心,只需要最小默认调整,它会为某些高性能工作负载 pod 启用 CPU 分区。对于延迟具有更高的优先级的数据中心和工作负载,仍然会采取措施来优化功耗。最复杂的情况是接近对延迟非常敏感的设备的集群,如工厂中的制造设备,以及软件定义的无线电。最后一类部署通常被称为远边缘(Far edge)。对于远边缘部署,以下延迟是最终优先级,且牺牲电源管理。
在 OpenShift Container Platform 版本 4.10 及之前的版本中,Performance Addon Operator 用来实现自动性能优化,从而实现低延迟性能。现在,这个功能是 Node Tuning Operator 的一部分。
11.1.1. 关于低延迟和实时应用程序超线程
超线程是一个 Intel 处理器技术,它允许物理 CPU 处理器内核作为两个逻辑内核同时执行两个独立的线程。超线程可以为并行处理很有用的某些工作负载类型的系统吞吐量提供更好的系统吞吐量。默认的 OpenShift Container Platform 配置需要默认启用超线程。
对于电信领域的应用程序,设计您的应用程序架构非常重要,以尽量减小延迟。超线程会降低性能,并严重影响需要低延迟的计算负载的吞吐量。禁用超线程可确保性能的可预测性,并可减少这些工作负载的处理时间。
超线程实现和配置会因运行 OpenShift Container Platform 的硬件而异。如需了解特定于该硬件的超线程实现的更多详情,请参考相关的主机硬件调节信息。禁用超线程可以增加集群的每个内核的成本。
其他资源
11.2. 置备实时和低延迟工作负载
很多行业和机构需要非常高的计算性能,并需要低且可预测的延迟,特别是银行和电信业。对于这些行业,它们有不同的要求,OpenShift Container Platform 提供了 Node Tuning Operator 来实现自动性能优化,以便为 OpenShift Container Platform 应用程序实现低延迟性能和响应时间。
集群管理员可以使用此性能配置集配置以更可靠的方式进行这些更改。管理员可以指定是否将内核更新至 kernel-rt(实时),为集群和操作系统日常任务保留 CPU,包括 pod infra 容器,隔离 CPU 来运行工作负载,以及禁用未使用的 CPU 减少功耗。
将执行探测与需要保证 CPU 的应用配合使用可能会导致延迟激增。建议使用其他探测(如正确配置的一组网络探测作为替代方案)。
在早期版本的 OpenShift Container Platform 中,Performance Addon Operator 用来实现自动性能优化,以便为 OpenShift 应用程序实现低延迟性能。在 OpenShift Container Platform 4.11 及更高版本中,这些功能是 Node Tuning Operator 的一部分。
11.2.1. 已知的实时限制
在大多数部署中,只有使用具有三个 control plane 节点和三个 worker 节点的标准集群时,仅在 worker 节点上支持 kernel-rt。OpenShift Container Platform 部署中的紧凑和单一节点会有例外。对于在单一节点上的安装, kernel-rt 在单个 control plane 节点上被支持。
要充分利用实时模式,容器必须使用升级的权限运行。如需了解有关授予特权的信息,请参阅为容器设置能力。
OpenShift Container Platform 会限制允许的功能,因此您可能需要创建 SecurityContext
。
使用 Red Hat Enterprise Linux CoreOS(RHCOS)系统的裸机安装完全支持此步骤。
在确定正确的性能预期时,应该意识到实时内核并不是万能的。它的目的是提供一个持续的、低延迟的确定性机制,从而提供可预测的响应时间。在系统中,会存在与实时内核关联的额外内核开销。这是因为在单独调度的线程中处理硬件中断。某些增加的工作负载开销会导致整个吞吐量下降。实际的影响依赖于特定的负载,范围从 0% 到 30%。然而,这是获得确定性所需要付出的代价。
11.2.2. 使用实时功能置备 worker
- 可选:在 OpenShift Container Platform 集群中添加节点。请参阅为系统调整设置 BIOS 参数。
-
使用
oc
命令将标签worker-rt
添加到需要实时功能的 worker 节点。 为实时节点创建新机器配置池:
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfigPool metadata: name: worker-rt labels: machineconfiguration.openshift.io/role: worker-rt spec: machineConfigSelector: matchExpressions: - { key: machineconfiguration.openshift.io/role, operator: In, values: [worker, worker-rt], } paused: false nodeSelector: matchLabels: node-role.kubernetes.io/worker-rt: ""
请注意,为具有标签 worker-rt 标签的节点组创建一个机器配置池
worker-rt
。使用节点角色标签将节点添加到正确的机器配置池。
注意您必须决定使用实时工作负载配置哪些节点。您可以配置集群中的所有节点,或配置节点的子集。期望所有节点都是专用机器配置池的一部分的 Node Tuning Operator。如果使用所有节点,您必须将 Node Tuning Operator 指向 worker 节点角色标签。如果使用子集,您必须将节点分组到新机器配置池中。
-
使用正确的 housekeeping 内核和
realTimeKernel: enabled: true
创建PerformanceProfile
。 您必须在
PerformanceProfile
中设置MachineConfigPoolSelector
:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: example-performanceprofile spec: ... realTimeKernel: enabled: true nodeSelector: node-role.kubernetes.io/worker-rt: "" machineConfigPoolSelector: machineconfiguration.openshift.io/role: worker-rt
验证匹配的机器配置池是否存在一个标签:
$ oc describe mcp/worker-rt
输出示例
Name: worker-rt Namespace: Labels: machineconfiguration.openshift.io/role=worker-rt
- OpenShift Container Platform 将开始配置节点,这可能涉及多次重启。等待节点处于稳定状态。这个过程所需要的时间取决于您所使用的具体硬件,预计每个节点需要 20 分钟。
- 验证所有内容是否按预期工作。
11.2.3. 验证实时内核安装
使用这个命令确定安装了实时内核:
$ oc get node -o wide
注意 worker-rt 角色 worker-rt
,其中包含字符串 4.18.0-305.30.1.rt7.102.el8_4.x86_64 cri-o://1.25.0-99.rhaos4.10.gitc3131de.el8
:
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME rt-worker-0.example.com Ready worker,worker-rt 5d17h v1.25.0 128.66.135.107 <none> Red Hat Enterprise Linux CoreOS 46.82.202008252340-0 (Ootpa) 4.18.0-305.30.1.rt7.102.el8_4.x86_64 cri-o://1.25.0-99.rhaos4.10.gitc3131de.el8 [...]
11.2.4. 创建一个实时工作负载
使用以下步骤准备一个使用实时功能的工作负载。
流程
-
创建带有
Guaranteed
类 QoS 类的 pod。 - 可选:禁用 DPDK 的 CPU 负载均衡。
- 分配正确的节点选择器。
在编写应用程序时,请遵循应用程序调整和部署中的常规建议。
11.2.5. 创建带有 Guaranteed
类 QoS 类的 pod
在创建带有 Guaranteed
类的 QoS 类的 pod 时请注意以下几点:
- pod 中的每个容器都必须具有内存限制和内存请求,且它们必须相同。
- pod 中的每个容器都必须具有 CPU 限制和 CPU 请求,且它们必须相同。
以下示例显示了一个容器的 pod 的配置文件。容器设置了内存限制和内存请求,均为 200 MiB。容器具有 CPU 限制和 CPU 请求,均为 1 CPU。
apiVersion: v1 kind: Pod metadata: name: qos-demo namespace: qos-example spec: containers: - name: qos-demo-ctr image: <image-pull-spec> resources: limits: memory: "200Mi" cpu: "1" requests: memory: "200Mi" cpu: "1"
创建 pod:
$ oc apply -f qos-pod.yaml --namespace=qos-example
查看有关 pod 的详细信息:
$ oc get pod qos-demo --namespace=qos-example --output=yaml
输出示例
spec: containers: ... status: qosClass: Guaranteed
注意如果容器指定了自己的内存限值,但没有指定内存请求,OpenShift Container Platform 会自动分配与限制匹配的内存请求。同样,如果容器指定了自己的 CPU 限值,但没有指定 CPU 请求,OpenShift Container Platform 会自动分配与限制匹配的 CPU 请求。
11.2.6. 可选:禁用 DPDK 的 CPU 负载均衡
禁用或启用 CPU 负载均衡的功能在 CRI-O 级别实现。CRI-O 下的代码仅在满足以下要求时禁用或启用 CPU 负载均衡。
pod 必须使用
performance-<profile-name>
运行时类。您可以通过查看性能配置集的状态来获得正确的名称,如下所示:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile ... status: ... runtimeClass: performance-manual
目前,cgroup v2 不支持禁用 CPU 负载均衡。
Node Tuning Operator 负责在相关节点下创建高性能运行时处理器配置片断,并在集群下创建高性能运行时类。它具有与默认运行时处理相同的内容,但它启用了 CPU 负载均衡配置功能。
要禁用 pod 的 CPU 负载均衡,Pod
规格必须包括以下字段:
apiVersion: v1 kind: Pod metadata: ... annotations: ... cpu-load-balancing.crio.io: "disable" ... ... spec: ... runtimeClassName: performance-<profile_name> ...
仅在启用了 CPU 管理器静态策略,以及带有保证 QoS 使用整个 CPU 的 pod 时,禁用 CPU 负载均衡。否则,禁用 CPU 负载均衡会影响集群中其他容器的性能。
11.2.7. 分配适当的节点选择器
为节点分配 pod 的首选方法是使用与性能配置集相同的节点选择器,如下所示:
apiVersion: v1 kind: Pod metadata: name: example spec: # ... nodeSelector: node-role.kubernetes.io/worker-rt: ""
如需更多信息,请参阅使用节点选择器将 pod 放置到特定的节点上。
11.2.8. 将工作负载调度到具有实时功能的 worker
使用与附加到机器配置池的节点匹配的标签选择器,这些选择器是为低延迟配置的。如需更多信息,请参阅将 pod 分配给节点。
11.2.9. 通过使 CPU 离线减少电源消耗
您通常可以预计电信工作负载。如果不需要所有 CPU 资源,Node Tuning Operator 允许您让未使用的 CPU 离线,以通过手动更新性能配置集来降低功耗。
要使未使用的 CPU 离线,您必须执行以下任务:
在性能配置集中设置离线 CPU 并保存 YAML 文件的内容:
带有离线 CPU 的性能配置集示例
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: additionalKernelArgs: - nmi_watchdog=0 - audit=0 - mce=off - processor.max_cstate=1 - intel_idle.max_cstate=0 - idle=poll cpu: isolated: "2-23,26-47" reserved: "0,1,24,25" offlined: "48-59" 1 nodeSelector: node-role.kubernetes.io/worker-cnf: "" numa: topologyPolicy: single-numa-node realTimeKernel: enabled: true
- 1
- 可选。您可以在
offlined
字段中列出 CPU,使指定的 CPU 离线。
运行以下命令来应用更新的配置集:
$ oc apply -f my-performance-profile.yaml
11.2.10. 可选:节能配置
您可以为带有低优先级工作负载的节点实现节能,而不影响高优先级工作负载的延迟或吞吐量。无需修改工作负载本身即可进行节能。
Intel Ice Lake 及更新的 Intel CPU 支持该功能。处理器的功能可能会影响高优先级工作负载的延迟和吞吐量。
当您使用节能配置配置节点时,您必须使用 pod 级别的性能配置高优先级工作负载,这意味着配置适用于 pod 使用的所有内核。
通过在 pod 级别上禁用 P-states 和 C-states,您可以配置高优先级工作负载以获得最佳性能和最低延迟。
注解 | 描述 |
---|---|
annotations: cpu-c-states.crio.io: "disable" cpu-freq-governor.crio.io: "<governor>" |
通过禁用 C-states 并为 CPU 扩展指定调控器类型,为 pod 提供最佳性能。对于高优先级的工作负载,建议使用 |
先决条件
- 在 BIOS 中启用了 C-states 和 OS 控制的 P-states
流程
使用将每个
pod-power-management
设置为true
来生成PerformanceProfile
:$ podman run --entrypoint performance-profile-creator -v \ /must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12 \ --mcp-name=worker-cnf --reserved-cpu-count=20 --rt-kernel=true \ --split-reserved-cpus-across-numa=false --topology-manager-policy=single-numa-node \ --must-gather-dir-path /must-gather -power-consumption-mode=low-latency \ 1 --per-pod-power-management=true > my-performance-profile.yaml
- 1
- 当将
per-pod-power-management
设置为true
时,power-consumption-mode
必须是default
或low-latency
。
带有
perPodPowerManagement
的PerformanceProfile
示例apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: [.....] workloadHints: realTime: true highPowerConsumption: false perPodPowerManagement: true
在
PerformanceProfile
自定义资源(CR) 中将默认cpufreq
调控器设置为附加内核参数:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: ... additionalKernelArgs: - cpufreq.default_governor=schedutil 1
- 1
- 建议使用
schedutil
管理器,但您可以使用其他监管器,如ondemand
或powersave
governors。
在
Tuned PerformancePatch
CR 中设置最大 CPU 频率:spec: profile: - data: | [sysfs] /sys/devices/system/cpu/intel_pstate/max_perf_pct = <x> 1
- 1
max_perf_pct
控制cpufreq
驱动程序的最大频率,以最大百分比的形式设置支持的 cpu 频率。这个值适用于所有 CPU。您可以检查/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_max_freq
中的最大支持频率。作为起点,您可以使用以All Cores Turbo
频率封装所有 CPU 的百分比。All Cores Turbo
频率是所有内核在运行的频率,当内核完全占用时。
将所需的注解添加到高优先级工作负载 pod。注解会覆盖
默认
设置。高优先级工作负载注解示例
apiVersion: v1 kind: Pod metadata: ... annotations: ... cpu-c-states.crio.io: "disable" cpu-freq-governor.crio.io: "<governor>" ... ... spec: ... runtimeClassName: performance-<profile_name> ...
- 重启 pod。
其他资源
- 有关推荐的固件配置的更多信息,请参阅 vDU 集群主机的推荐固件配置。
11.2.11. 管理设备中断处理保证 pod 隔离 CPU
Node Tuning Operator 可以通过将主机 CPU 划分为保留的 CPU 来管理主机 CPU,以进行集群和操作系统日常任务(包括 pod infra 容器),以及用于应用程序容器运行工作负载的隔离 CPU。这可让您将低延迟工作负载的 CPU 设置为隔离状态。
设备中断在所有隔离和保留 CPU 之间平衡负载,以避免出现 CPU 超载问题,但运行有保证 pod 的 CPU 除外。当为 pod 设置相关注解时,保证 pod CPU 无法处理设备中断。
在性能配置集中,globallyDisableIrqLoadBalancing
用于管理设备中断是否被处理。对于某些工作负载,保留 CPU 并不总是足以处理设备中断,因此不会在隔离的 CPU 上禁用设备中断。默认情况下,Node Tuning Operator 不会禁用隔离 CPU 上的设备中断。
要实现低延迟,有些(而非全部)pod 需要它们运行的 CPU 不处理设备中断。pod 注解 irq-load-balancing.crio.io
用于定义是否处理设备中断。配置后,CRI-O 仅在 pod 正在运行时禁用设备中断。
11.2.11.1. 禁用 CPU CFS 配额
要减少单独保证 pod 的 CPU 节流,创建一个带有注解 cpu-quota.crio.io: "disable"
的 pod 规格。此注释在 pod 运行时禁用 CPU 完全公平调度程序(CFS)配额。以下 pod 规格包含此注解:
apiVersion: v1 kind: Pod metadata: annotations: cpu-quota.crio.io: "disable" spec: runtimeClassName: performance-<profile_name> ...
仅在启用了 CPU 管理器静态策略,以及带有保证 QoS 使用整个 CPU 的 pod 时禁用 CPU CFS 配额。否则,禁用 CPU CFS 配额可能会影响集群中其他容器的性能。
11.2.11.2. 禁用 Node Tuning Operator 中的全局设备中断处理
要将 Node Tuning Operator 配置为禁用隔离 CPU 集的全局设备中断,将 performance 配置集中的 globallyDisableIrqLoadBalancing
字段设置为 true
。在为 true
时,会忽略有冲突的 pod 注解。在为 false
时,IRQ 负载会在所有 CPU 之间平衡。
一个性能配置集片段演示了这个设置:
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: globallyDisableIrqLoadBalancing: true ...
11.2.11.3. 禁用单个 pod 的中断处理
要禁用单个 pod 的中断处理,确保在性能配置集中将 globallyDisableIrqLoadBalancing
设置为 false
。然后,在 pod 规格中,将 irq-load-balancing.crio.io
pod 注解设置为 disable
。以下 pod 规格包含此注解:
apiVersion: performance.openshift.io/v2 kind: Pod metadata: annotations: irq-load-balancing.crio.io: "disable" spec: runtimeClassName: performance-<profile_name> ...
11.2.12. 升级性能配置集以使用设备中断处理
当您将 Node Tuning Operator 性能配置集自定义资源定义(CRD)从 v1 或 v1alpha1 升级到 v2 时,现有配置集会将 globallyDisableIrqLoadBalancing
设置为 true
。
globallyDisableIrqLoadBalancing
切换用于 Isolated CPU 集是否禁用了 IRQ 负载均衡。当选项设置为 true
时,它会禁用 Isolated CPU 集的 IRQ 负载均衡。将选项设置为 false
允许在所有 CPU 之间平衡 IRQ。
11.2.12.1. 支持的 API 版本
Node Tuning Operator 在性能配置集 apiVersion
字段中支持 v2
、v1
和 v1alpha1
。v1 和 v1alpha1 API 相同。v2 API 包括一个可选的布尔值项 globallyDisableIrqLoadBalancing
,默认值为 false
。
11.2.12.1.1. 将 Node Tuning Operator API 从 v1alpha1 升级到 v1
当将 Node Tuning Operator API 版本从 v1alpha1 升级到 v1 时,,v1alpha1 性能配置集会通过"None" Conversion 策略自行转换,并提供给带有 API 版本 v1 的 Performance Addon Operator。
11.2.12.1.2. 将 Node Tuning Operator API 从 v1alpha1 或 v1 升级到 v2
当从旧的 Node Tuning Operator API 版本升级时,现有的 v1 和 v1alpha1 性能配置集将使用转换 Webhook 转换,它将注入 globallyDisableIrqLoadBalancing
字段,值为 true
。
11.3. 使用性能配置集调整节点以实现低延迟
性能配置集可让您控制属于特定机器配置池的节点的延迟调整方面。指定设置后,PerformanceProfile
对象将编译为执行实际节点级别调整的多个对象:
-
操作节点的
MachineConfig
文件。 -
用于配置拓扑管理器、CPU Manager 和 OpenShift Container Platform 节点的
KubeletConfig
文件。 - 配置 Node Tuning Operator 的 Tuned 配置集。
您可以使用性能配置集指定是否将内核更新至 kernel-rt,分配大页面,以及划分 CPU 以执行内务处理或运行工作负载。
您可以手动创建 PerformanceProfile
对象,或使用 Performance Profile Creator (PPC) 生成性能配置集。有关 PPC 的更多信息,请参见以下的其他资源。
性能配置集示例
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: cpu: isolated: "4-15" 1 reserved: "0-3" 2 hugepages: defaultHugepagesSize: "1G" pages: - size: "1G" count: 16 node: 0 realTimeKernel: enabled: true 3 numa: 4 topologyPolicy: "best-effort" nodeSelector: node-role.kubernetes.io/worker-cnf: "" 5
其他资源
- 有关使用 Performance Profile Creator (PPC) 生成性能配置集的详情,请参考创建性能配置集。
11.3.1. 配置巨页
节点必须预先分配在 OpenShift Container Platform 集群中使用的巨页。使用 Node Tuning Operator 在特定节点中分配巨页。
OpenShift Container Platform 提供了创建和分配巨页的方法。Node Tuning Operator 提供了一种更易于使用性能配置集的方法。
例如,在性能配置集的 hugepages
pages
部分,您可以指定多个块的 size
、count
以及可选的 node
:
hugepages:
defaultHugepagesSize: "1G"
pages:
- size: "1G"
count: 4
node: 0 1
- 1
node
是分配巨页的 NUMA 节点。如果省略了node
,该页面将平均分布在所有 NUMA 节点中。
等待显示更新已完成的相关机器配置池状态。
这些是分配巨页的唯一配置步骤。
验证
要验证配置,请查看节点上的
/proc/meminfo
文件:$ oc debug node/ip-10-0-141-105.ec2.internal
# grep -i huge /proc/meminfo
输出示例
AnonHugePages: ###### ## ShmemHugePages: 0 kB HugePages_Total: 2 HugePages_Free: 2 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: #### ## Hugetlb: #### ##
使用
oc describe
报告新大小:$ oc describe node worker-0.ocp4poc.example.com | grep -i huge
输出示例
hugepages-1g=true hugepages-###: ### hugepages-###: ###
11.3.2. 分配多个巨页大小
您可以在同一容器下请求具有不同大小的巨页。这样,您可以定义由具有不同巨页大小的容器组成的更复杂的 pod。
例如,您可以把大小定义为 1G
和 2M
,Node Tuning Operator 会在节点上配置这两个大小,如下所示:
spec: hugepages: defaultHugepagesSize: 1G pages: - count: 1024 node: 0 size: 2M - count: 4 node: 1 size: 1G
11.3.3. 为 IRQ 动态负载平衡配置节点
为 IRQ 动态负载平衡配置集群节点,以控制哪些内核可以接收设备中断请求 (IRQ)。
先决条件
- 对于内核隔离,所有服务器硬件组件都必须支持 IRQ 关联性。要检查服务器的硬件组件是否支持 IRQ 关联性,请查看服务器的硬件规格或联系您的硬件供应商。
流程
- 以具有 cluster-admin 权限的用户身份登录 OpenShift Container Platform 集群。
-
将性能配置集
apiVersion
设置为使用performance.openshift.io/v2
。 -
删除
globallyDisableIrqLoadBalancing
字段,或把它设置为false
。 设置适当的隔离 CPU 和保留的 CPU。以下片段演示了保留 2 个 CPU 的配置集。对于在
isolated
CPU 集中运行的 pod,启用 IRQ 负载均衡:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: dynamic-irq-profile spec: cpu: isolated: 2-5 reserved: 0-1 ...
注意当您配置保留的和隔离的 CPU 时,pod 中的 infra 容器将使用保留的 CPU,应用程序容器则使用隔离的 CPU。
创建使用独有 CPU 的 pod,并将
irq-load-balancing.crio.io
和cpu-quota.crio.io
注解设置为disable
。例如:apiVersion: v1 kind: Pod metadata: name: dynamic-irq-pod annotations: irq-load-balancing.crio.io: "disable" cpu-quota.crio.io: "disable" spec: containers: - name: dynamic-irq-pod image: "registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12" command: ["sleep", "10h"] resources: requests: cpu: 2 memory: "200M" limits: cpu: 2 memory: "200M" nodeSelector: node-role.kubernetes.io/worker-cnf: "" runtimeClassName: performance-dynamic-irq-profile ...
-
以 performance-<profile_name> 格式输入 pod 的
runtimeClassName
,其中 <profile_name> 是来自PerformanceProfile
YAML 的name
,在本例中是performance-dynamic-irq-profile
。 - 将节点选择器设置为以 cnf-worker 为目标。
确保 pod 正确运行。状态应该为
running
,并应正确设置了 cnf-worker 节点:$ oc get pod -o wide
预期输出
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES dynamic-irq-pod 1/1 Running 0 5h33m <ip-address> <node-name> <none> <none>
获取为 IRQ 动态负载均衡配置的 pod 运行 CPU:
$ oc exec -it dynamic-irq-pod -- /bin/bash -c "grep Cpus_allowed_list /proc/self/status | awk '{print $2}'"
预期输出
Cpus_allowed_list: 2-3
确保正确应用节点配置。登录节点以验证配置。
$ oc debug node/<node-name>
预期输出
Starting pod/<node-name>-debug ... To use host binaries, run `chroot /host` Pod IP: <ip-address> If you don't see a command prompt, try pressing enter. sh-4.4#
验证可以使用节点文件系统:
sh-4.4# chroot /host
预期输出
sh-4.4#
确保默认系统 CPU 关联性掩码不包括
dynamic-irq-pod
CPU,如 CPU 2 和 3。$ cat /proc/irq/default_smp_affinity
输出示例
33
确定系统 IRQ 没有配置为在
dynamic-irq-pod
CPU 中运行:find /proc/irq/ -name smp_affinity_list -exec sh -c 'i="$1"; mask=$(cat $i); file=$(echo $i); echo $file: $mask' _ {} \;
输出示例
/proc/irq/0/smp_affinity_list: 0-5 /proc/irq/1/smp_affinity_list: 5 /proc/irq/2/smp_affinity_list: 0-5 /proc/irq/3/smp_affinity_list: 0-5 /proc/irq/4/smp_affinity_list: 0 /proc/irq/5/smp_affinity_list: 0-5 /proc/irq/6/smp_affinity_list: 0-5 /proc/irq/7/smp_affinity_list: 0-5 /proc/irq/8/smp_affinity_list: 4 /proc/irq/9/smp_affinity_list: 4 /proc/irq/10/smp_affinity_list: 0-5 /proc/irq/11/smp_affinity_list: 0 /proc/irq/12/smp_affinity_list: 1 /proc/irq/13/smp_affinity_list: 0-5 /proc/irq/14/smp_affinity_list: 1 /proc/irq/15/smp_affinity_list: 0 /proc/irq/24/smp_affinity_list: 1 /proc/irq/25/smp_affinity_list: 1 /proc/irq/26/smp_affinity_list: 1 /proc/irq/27/smp_affinity_list: 5 /proc/irq/28/smp_affinity_list: 1 /proc/irq/29/smp_affinity_list: 0 /proc/irq/30/smp_affinity_list: 0-5
11.3.4. 关于 IRQ 关联性设置的支持
有些 IRQ 控制器缺少对 IRQ 关联性设置的支持,并将始终将所有在线 CPU 公开为 IRQ 掩码。这些 IRQ 控制器在 CPU 0 上运行。
以下是红帽了解对 IRQ 关联性设置的支持的驱动程序和硬件示例。以下是相关的列表(并没有包括所有):
-
一些 RAID 控制器驱动程序,如
megaraid_sas
- 许多非易失性内存表达 (NVMe) 驱动程序
- 主板 (LOM) 网络控制器上的一些 LAN
-
驱动程序使用
managed_irqs
不支持 IRQ 关联性设置的原因可能与主板中的处理器类型、IRI 控制器或断路器连接等因素相关。
如果任何 IRQ 的有效关联性被设置为一个隔离的 CPU,则可能代表一些硬件或驱动程序不支持 IRQ 关联性设置。要查找有效的关联性,请登录到主机并运行以下命令:
$ find /proc/irq -name effective_affinity -printf "%p: " -exec cat {} \;
输出示例
/proc/irq/0/effective_affinity: 1 /proc/irq/1/effective_affinity: 8 /proc/irq/2/effective_affinity: 0 /proc/irq/3/effective_affinity: 1 /proc/irq/4/effective_affinity: 2 /proc/irq/5/effective_affinity: 1 /proc/irq/6/effective_affinity: 1 /proc/irq/7/effective_affinity: 1 /proc/irq/8/effective_affinity: 1 /proc/irq/9/effective_affinity: 2 /proc/irq/10/effective_affinity: 1 /proc/irq/11/effective_affinity: 1 /proc/irq/12/effective_affinity: 4 /proc/irq/13/effective_affinity: 1 /proc/irq/14/effective_affinity: 1 /proc/irq/15/effective_affinity: 1 /proc/irq/24/effective_affinity: 2 /proc/irq/25/effective_affinity: 4 /proc/irq/26/effective_affinity: 2 /proc/irq/27/effective_affinity: 1 /proc/irq/28/effective_affinity: 8 /proc/irq/29/effective_affinity: 4 /proc/irq/30/effective_affinity: 4 /proc/irq/31/effective_affinity: 8 /proc/irq/32/effective_affinity: 8 /proc/irq/33/effective_affinity: 1 /proc/irq/34/effective_affinity: 2
有些驱动程序使用 managed_irqs
,其关联性由内核在内部管理,用户空间无法更改关联性。在某些情况下,这些 IRQ 可能会分配给隔离的 CPU。有关 managed_irqs
的更多信息,请参阅 无法更改受管中断的关联性,即使它们目标隔离 CPU。
11.3.5. 为集群配置超线程
要为 OpenShift Container Platform 集群配置超线程,请将性能配置集中的 CPU 线程设置为为保留或隔离的 CPU 池配置的相同内核。
如果您配置了性能配置集,然后更改主机的超线程配置,请确保更新 PerformanceProfile
YAML 中的 CPU isolated
和 reserved
字段以匹配新配置。
禁用之前启用的主机超线程配置可能会导致 PerformanceProfile
YAML 中列出的 CPU 内核 ID 错误。此不正确的配置可能会导致节点不可用,因为无法找到列出的 CPU。
先决条件
-
使用具有
cluster-admin
角色的用户访问集群。 - 安装 OpenShift CLI(oc)。
流程
确定在您要配置的主机的 CPU 上运行哪些线程。
您可以通过登录到集群并运行以下命令来查看在主机 CPU 上运行哪些线程:
$ lscpu --all --extended
输出示例
CPU NODE SOCKET CORE L1d:L1i:L2:L3 ONLINE MAXMHZ MINMHZ 0 0 0 0 0:0:0:0 yes 4800.0000 400.0000 1 0 0 1 1:1:1:0 yes 4800.0000 400.0000 2 0 0 2 2:2:2:0 yes 4800.0000 400.0000 3 0 0 3 3:3:3:0 yes 4800.0000 400.0000 4 0 0 0 0:0:0:0 yes 4800.0000 400.0000 5 0 0 1 1:1:1:0 yes 4800.0000 400.0000 6 0 0 2 2:2:2:0 yes 4800.0000 400.0000 7 0 0 3 3:3:3:0 yes 4800.0000 400.0000
在这个示例中,在四个物理 CPU 内核中运行了八个逻辑 CPU 内核。CPU0 和 CPU4 在物理 Core0 中运行,CPU1 和 CPU5 在物理 Core 1 中运行,以此类推。
另外要查看为特定物理 CPU 内核设定的线程(以下示例中的
cpu0
),打开命令提示符并运行以下命令:$ cat /sys/devices/system/cpu/cpu0/topology/thread_siblings_list
输出示例
0-4
在
PerformanceProfile
YAML 中应用隔离和保留的 CPU。例如,您可以将逻辑内核 CPU0 和 CPU4 设置为isolated
;将逻辑内核 CPU1 到 CPU3 以及 CPU5 到 CPU7 设置为reserved
。当您配置保留的和隔离的 CPU 时,pod 中的 infra 容器将使用保留的 CPU,应用程序容器则使用隔离的 CPU。... cpu: isolated: 0,4 reserved: 1-3,5-7 ...
注意保留和隔离的 CPU 池不得重叠,并且必须一起跨越 worker 节点中的所有可用内核。
大多数 Intel 处理器上默认启用超线程。如果启用超线程,特定内核处理的所有线程都必须被隔离或者在同一个内核中处理。
11.3.5.1. 禁用低延迟应用程序超线程
在为低延迟进程配置集群时,请考虑是否要在部署集群前禁用超线程。要禁用超线程,请执行以下操作:
- 创建一个适合您的硬件和拓扑的性能配置集。
将
nosmt
设为附加内核参数。以下示例的性能配置集演示了此设置:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: example-performanceprofile spec: additionalKernelArgs: - nmi_watchdog=0 - audit=0 - mce=off - processor.max_cstate=1 - idle=poll - intel_idle.max_cstate=0 - nosmt cpu: isolated: 2-3 reserved: 0-1 hugepages: defaultHugepagesSize: 1G pages: - count: 2 node: 0 size: 1G nodeSelector: node-role.kubernetes.io/performance: '' realTimeKernel: enabled: true
注意当您配置保留的和隔离的 CPU 时,pod 中的 infra 容器将使用保留的 CPU,应用程序容器则使用隔离的 CPU。
11.3.6. 了解工作负载提示
下表描述了节能和实时设置对延迟的影响。
可以手动配置以下工作负载提示。您还可以使用 Performance Profile Creator 来使用工作负载提示。有关性能配置集的更多信息,请参阅"创建性能配置集"部分。如果手动配置工作负载提示,并且未明确设置 realTime
工作负载提示,则默认为 true
。
性能配置集创建器设置 | 提示 | 环境 | 描述 |
---|---|---|---|
Default(默认) |
workloadHints: highPowerConsumption: false realTime: false | 没有延迟要求的高吞吐量集群 | 仅通过 CPU 分区实现的性能。 |
Low-latency |
workloadHints: highPowerConsumption: false realTime: true | 地区数据中心 | 节能和低延迟都需要考虑的:在电源管理、延迟和吞吐量之间进行妥当调节。 |
Ultra-low-latency |
workloadHints: highPowerConsumption: true realTime: true | 对于远边缘集群,对延迟非常敏感的工作负载 | 实现最小延迟和最大确定性会增加电源消耗的成本。 |
每个 pod 电源管理 |
workloadHints: realTime: true highPowerConsumption: false perPodPowerManagement: true | 关键和非关键工作负载 | 允许每个 pod 进行电源管理。 |
其他资源
- 有关使用 Performance Profile Creator (PPC) 生成性能配置集的详情,请参考创建性能配置集。
11.3.7. 手动配置工作负载提示
流程
-
按照 "Understanding workload hints" 的表,创建一个适合环境的硬件和拓扑的
PerformanceProfile
。调整配置集以匹配预期的工作负载。在这个示例中,我们针对最低的延迟进行优化。 添加
highPowerConsumption
和realTime
工作负载提示。这里两者都设为true
。apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: workload-hints spec: ... workloadHints: highPowerConsumption: true 1 realTime: true 2
当在性能配置集中将 realTime
工作负载 hint 标志设置为 true
时,将 cpu-quota.crio.io: disable
注解添加到带有固定 CPU 的每个保证 pod。此注解是防止 pod 中进程性能降级所必需的。如果没有显式设置 realTime
工作负载提示,则默认为 true
。
其他资源
- 有关减少单独保证 pod 的 CPU 节流的详情,请参考禁用 CPU CFS 配额。
11.3.8. 为 infra 和应用程序容器限制 CPU
通用内务处理和工作负载任务使用 CPU 的方式可能会影响对延迟敏感的进程。默认情况下,容器运行时使用所有在线 CPU 一起运行所有容器,这可能导致上下文切换和延迟激增。对 CPU 进行分区可防止无状态进程通过相互分离来干扰对延迟敏感的进程。下表描述了在使用 Node Tuning Operator 调整节点后在 CPU 上运行的进程:
进程类型 | 详情 |
---|---|
| 在除了运行低延迟工作负载外的任意 CPU 上运行 |
基础架构 pod | 在除了运行低延迟工作负载外的任意 CPU 上运行 |
中断 | 重定向到保留的 CPU(OpenShift Container Platform 4.7 及更新的版本中的可选) |
内核进程 | 固定保留的 CPU |
对延迟敏感的工作负载 pod | 固定到隔离池中的特定专用 CPU |
OS 进程/systemd 服务 | 固定保留的 CPU |
在一个节点上的对于所有 QoS 进程类型( Burstable
、BestEffort
或 Guaranteed
)的 pod 的可分配容量等于隔离池的容量。保留池的容量已从节点的总内核容量中删除,供集群和操作系统日常任务使用。
示例 1
节点具有 100 个内核的容量。通过使用性能配置集,集群管理员将 50 个内核分配给隔离池,将 50 个内核分配给保留池。集群管理员为 QoS 为 BestEffort
或 Burstable
的 pod 分配 25 个内核,为 Guaranteed
的 pod 分配 25 个内核。这与隔离池的容量匹配。
示例 2
节点具有 100 个内核的容量。通过使用性能配置集,集群管理员将 50 个内核分配给隔离池,将 50 个内核分配给保留池。集群管理员为 QoS 为 BestEffort
或 Burstable
的 pod 分配一个内核,为 Guaranteed
的 pod 分配 50 个内核。这超过了隔离池容量一个内核。Pod 调度因为 CPU 容量不足而失败。
使用的确切分区模式取决于许多因素,如硬件、工作负载特性和预期的系统负载。以下是一些用例示例:
- 如果对延迟敏感的工作负载使用特定的硬件,如网络接口控制器(NIC),请确保隔离池中的 CPU 尽可能地与这个硬件接近。至少,您应该将工作负载放在同一个非统一内存访问 (NUMA) 节点中。
- 保留的池用于处理所有中断。根据系统网络,分配一个足够大小的保留池来处理所有传入的数据包中断。在 4.12 及更高版本中,工作负载可以选择性地被标记为敏感版本。
在决定哪些特定 CPU 用于保留和隔离分区时,需要详细分析和测量。设备和内存的 NUMA 紧密度等因素扮演了角色。选择也取决于工作负载架构和具体的用例。
保留和隔离的 CPU 池不得重叠,并且必须一起跨越 worker 节点中的所有可用内核。
为确保内务处理任务和工作负载不会相互干扰,请在性能配置集的 spec
部分指定两组 CPU。
-
isolated
- 指定应用程序容器工作负载的 CPU。这些 CPU 的延迟最低。这个组中的进程没有中断,例如,可以达到更高的 DPDK 零数据包丢失带宽。 -
reserved
- 为集群和操作系统日常任务指定 CPU。reserved
组中的线程经常会比较繁忙。不要在reserved
组中运行对延迟敏感的应用程序。对延迟敏感的应用程序在isolated
组中运行。
流程
- 创建适合环境硬件和拓扑的性能配置集。
使用您想要为 infra 和应用程序容器保留和隔离的 CPU 添加
reserved
和isolated
参数:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: infra-cpus spec: cpu: reserved: "0-4,9" 1 isolated: "5-8" 2 nodeSelector: 3 node-role.kubernetes.io/worker: ""
11.4. 使用 Node Tuning Operator 减少 NIC 队列
Node Tuning Operator 允许您调整每个网络设备的网络接口控制器(NIC)队列计数。通过使用 PerformanceProfile,队列的数量可以减少到保留 CPU 的数量。
11.4.1. 使用性能配置集调整 NIC 队列
通过性能配置集,您可以调整每个网络设备的队列计数。
支持的网络设备:
- 非虚拟网络设备
- 支持多个队列的网络设备(通道)
不支持的网络设备:
- 纯软件网络接口
- 块设备
- Intel DPDK 虚拟功能
先决条件
-
使用具有
cluster-admin
角色的用户访问集群。 -
安装 OpenShift CLI(
oc
)。
流程
-
以具有
cluster-admin
权限的用户身份登录运行 Node Tuning Operator 的 OpenShift Container Platform 集群。 - 创建并应用适合您的硬件和拓扑的性能配置集。有关创建配置集的指南,请参阅"创建性能配置集"部分。
编辑这个创建的性能配置集:
$ oc edit -f <your_profile_name>.yaml
使用
net
对象填充spec
字段。对象列表可以包含两个字段:-
userLevelNetworking
是一个必需字段,指定为布尔值标记。如果userLevelNetworking
为true
,则队列数将设置为所有支持设备的保留 CPU 计数。默认值为false
。 devices
是一个可选字段,指定队列设置为保留 CPU 数的设备列表。如果设备列表为空,则配置适用于所有网络设备。配置如下:interfaceName
:此字段指定接口名称,并支持 shell 样式的通配符,可以是正数或负数。-
通配符语法示例如下:
<string> .*
-
负规则的前缀为感叹号。要将网络队列更改应用到排除列表以外的所有设备,请使用
!<device>
。例如!eno1
。
-
通配符语法示例如下:
-
vendorID
:网络设备供应商 ID,以带有0x
前缀的 16 位十六进制数字代表。 deviceID
:网络设备 ID(model),以带有0x
前缀的 16 位十六进制数字代表。注意当指定
deviceID
时,还必须定义vendorID
。与设备条目interfaceName
、vendorID
或vendorID
加deviceID
中指定的所有设备标识符相匹配的设备会被视为一个网络设备。然后,此网络设备的 net 队列数设置为保留的 CPU 计数。当指定了两个或多个设备时,网络队列数将设置为与其中一个设备匹配的任何网络设备。
-
使用此示例性能配置集将所有设备的队列数设置为保留的 CPU 计数:
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,55-103 reserved: 0-2,52-54 net: userLevelNetworking: true nodeSelector: node-role.kubernetes.io/worker-cnf: ""
使用这个示例性能配置集,将所有与任何定义的设备标识符匹配的保留 CPU 数设置为保留的 CPU 计数:
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,55-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: "eth0" - interfaceName: "eth1" - vendorID: "0x1af4" deviceID: "0x1000" nodeSelector: node-role.kubernetes.io/worker-cnf: ""
使用这个示例性能配置集,将所有以接口名称
eth
开头的设备的队列数设置为保留的 CPU 计数:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,55-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: "eth*" nodeSelector: node-role.kubernetes.io/worker-cnf: ""
使用这个示例性能配置集。将所有设备的队列数设置为保留的 CPU 计数,该接口具有
eno1
以外的任何接口:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,55-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: "!eno1" nodeSelector: node-role.kubernetes.io/worker-cnf: ""
使用这个示例性能配置集,将所有具有接口名称
eth0
,vendorID
为0x1af4
、deviceID
为0x1000
的设备的队列数设置为保留 CPU 数:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: manual spec: cpu: isolated: 3-51,55-103 reserved: 0-2,52-54 net: userLevelNetworking: true devices: - interfaceName: "eth0" - vendorID: "0x1af4" deviceID: "0x1000" nodeSelector: node-role.kubernetes.io/worker-cnf: ""
应用更新的性能配置集:
$ oc apply -f <your_profile_name>.yaml
其他资源
11.4.2. 验证队列状态
在这一部分中,一些示例演示了不同的性能配置集以及如何验证是否应用了更改。
示例 1
在本例中,网络队列数为所有支持的设备设置为保留 CPU 数(2)。
性能配置集中的相关部分是:
apiVersion: performance.openshift.io/v2 metadata: name: performance spec: kind: PerformanceProfile spec: cpu: reserved: 0-1 #total = 2 isolated: 2-8 net: userLevelNetworking: true # ...
使用以下命令显示与设备关联的队列状态:
注意在应用了性能配置集的节点中运行这个命令。
$ ethtool -l <device>
在应用配置集前验证队列状态:
$ ethtool -l ens4
输出示例
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 4
应用配置集后验证队列状态:
$ ethtool -l ens4
输出示例
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 2 1
- 1
- 该组合通道显示为所有支持的设备保留 CPU 的总数为 2。这与性能配置集中配置的内容匹配。
示例 2
在本例中,针对具有特定 vendorID
的所有受支持的网络设备,网络队列数设置为保留 CPU 数(2)。
性能配置集中的相关部分是:
apiVersion: performance.openshift.io/v2 metadata: name: performance spec: kind: PerformanceProfile spec: cpu: reserved: 0-1 #total = 2 isolated: 2-8 net: userLevelNetworking: true devices: - vendorID = 0x1af4 # ...
使用以下命令显示与设备关联的队列状态:
注意在应用了性能配置集的节点中运行这个命令。
$ ethtool -l <device>
应用配置集后验证队列状态:
$ ethtool -l ens4
输出示例
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 2 1
- 1
- 带有
vendorID=0x1af4
的所有支持设备的预留 CPU 总数为 2。例如,如果存在另一个网络设备ens2
,其vendorID=0x1af4
也具有总计的网络队列为 2。这与性能配置集中配置的内容匹配。
示例 3
在本例中,针对与任何定义的设备标识符匹配的所有受支持网络设备,网络队列数设置为保留 CPU 数(2)。
命令 udevadm info
提供了有关设备的详细报告。在这个示例中,设备是:
# udevadm info -p /sys/class/net/ens4 ... E: ID_MODEL_ID=0x1000 E: ID_VENDOR_ID=0x1af4 E: INTERFACE=ens4 ...
# udevadm info -p /sys/class/net/eth0 ... E: ID_MODEL_ID=0x1002 E: ID_VENDOR_ID=0x1001 E: INTERFACE=eth0 ...
对于
interfaceName
等于eth0
的设备,以及具有vendorID=0x1af4
的设备,并使用以下性能配置集,将网络队列设置为 2:apiVersion: performance.openshift.io/v2 metadata: name: performance spec: kind: PerformanceProfile spec: cpu: reserved: 0-1 #total = 2 isolated: 2-8 net: userLevelNetworking: true devices: - interfaceName = eth0 - vendorID = 0x1af4 ...
应用配置集后验证队列状态:
$ ethtool -l ens4
输出示例
Channel parameters for ens4: Pre-set maximums: RX: 0 TX: 0 Other: 0 Combined: 4 Current hardware settings: RX: 0 TX: 0 Other: 0 Combined: 2 1
- 1
- 带有
vendorID=0x1af4
的所有支持设备的预留 CPU 总数设置为 2。例如,如果存在另一个带有vendorID=0x1af4
的网络设备ens2
,则其总子网队列也将设置为 2。类似地,interfaceName
等于eth0
的设备会将总网络队列设置为 2。
11.4.3. 与调整 NIC 队列关联的日志记录
详细说明所分配设备的日志消息记录在相应的 Tuned 守护进程日志中。以下信息可能会记录到 /var/log/tuned/tuned.log
文件中:
记录了一个
INFO
信息,详细描述了成功分配的设备:INFO tuned.plugins.base: instance net_test (net): assigning devices ens1, ens2, ens3
如果无法分配任何设备,则会记录
WARNING
信息:WARNING tuned.plugins.base: instance net_test: no matching devices available
11.5. 调试低延迟 CNF 调整状态
PerformanceProfile
自定义资源(CR)包含报告调整状态和调试延迟降级问题的状态字段。这些字段报告描述 Operator 协调功能状态的条件。
当附加到性能配置集的机器配置池处于降级状态时会出现一个典型的问题,从而导致 PerformanceProfile
状态降级。在这种情况下,机器配置池会给出一个失败信息。
Node Tuning Operator 包含 performanceProfile.spec.status.Conditions
状态字段:
Status: Conditions: Last Heartbeat Time: 2020-06-02T10:01:24Z Last Transition Time: 2020-06-02T10:01:24Z Status: True Type: Available Last Heartbeat Time: 2020-06-02T10:01:24Z Last Transition Time: 2020-06-02T10:01:24Z Status: True Type: Upgradeable Last Heartbeat Time: 2020-06-02T10:01:24Z Last Transition Time: 2020-06-02T10:01:24Z Status: False Type: Progressing Last Heartbeat Time: 2020-06-02T10:01:24Z Last Transition Time: 2020-06-02T10:01:24Z Status: False Type: Degraded
Status
字段包含指定 Type
值来指示性能配置集状态的 Conditions
:
Available
- 所有机器配置和 Tuned 配置集都已被成功创建,且集群组件可用于处理它们(NTO、MCO、Kubelet)。
Upgradeable
- 代表 Operator 维护的资源是否处于可安全升级的状态。
Progressing
- 表示已从性能配置集启动部署过程。
Degraded
如果出现以下情况代表错误:
- 验证性能配置集失败。
- 创建所有相关组件未能成功完成。
每个类型都包括以下字段:
状态
-
特定类型的状态(
true
或false
)。 Timestamp
- 事务的时间戳。
Reason string
- 机器可读的原因。
Message string
- 描述状态和错误详情的人类可读的原因信息(如果存在)。
11.5.1. 机器配置池
性能配置集及其创建的产品会根据关联的机器配置池(MCP)应用到节点。MCP 包含有关应用由性能配置集创建的机器配置的有价值的信息,它包括了内核 arg、Kube 配置、巨页分配和 rt-kernel 部署。Performance Profile 控制器监控 MCP 中的更改,并相应地更新性能配置集状态。
MCP 返回到性能配置集状态的唯一条件是 MCP 处于 Degraded
状态,这会导致 performaceProfile.status.condition.Degraded = true
。
Example
以下示例是创建关联机器配置池(worker-cnf
)的性能配置集:
关联的机器配置池处于降级状态:
# oc get mcp
输出示例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-2ee57a93fa6c9181b546ca46e1571d2d True False False 3 3 3 0 2d21h worker rendered-worker-d6b2bdc07d9f5a59a6b68950acf25e5f True False False 2 2 2 0 2d21h worker-cnf rendered-worker-cnf-6c838641b8a08fff08dbd8b02fb63f7c False True True 2 1 1 1 2d20h
MCP 的
describe
部分包括了原因:# oc describe mcp worker-cnf
输出示例
Message: Node node-worker-cnf is reporting: "prepping update: machineconfig.machineconfiguration.openshift.io \"rendered-worker-cnf-40b9996919c08e335f3ff230ce1d170\" not found" Reason: 1 nodes are reporting degraded status on sync
降级状态也应该出现在标记为
degraded = true
的性能配置集的status
字段中:# oc describe performanceprofiles performance
输出示例
Message: Machine config pool worker-cnf Degraded Reason: 1 nodes are reporting degraded status on sync. Machine config pool worker-cnf Degraded Message: Node yquinn-q8s5v-w-b-z5lqn.c.openshift-gce-devel.internal is reporting: "prepping update: machineconfig.machineconfiguration.openshift.io \"rendered-worker-cnf-40b9996919c08e335f3ff230ce1d170\" not found". Reason: MCPDegraded Status: True Type: Degraded
11.6. 为红帽支持收集调试数据延迟
在提交问题单时同时提供您的集群信息,可以帮助红帽支持为您进行排除故障。
您可使用 must-gather
工具来收集有关 OpenShift Container Platform 集群的诊断信息,包括节点调整、NUMA 拓扑和其他调试延迟设置问题所需的信息。
为了获得快速支持,请提供 OpenShift Container Platform 和低延迟调整的诊断信息。
11.6.1. 关于 must-gather 工具
oc adm must-gather
CLI 命令可收集最有助于解决问题的集群信息,如:
- 资源定义
- 审计日志
- 服务日志
您在运行该命令时,可通过包含 --image
参数来指定一个或多个镜像。指定镜像后,该工具便会收集有关相应功能或产品的信息。在运行 oc adm must-gather
时,集群上会创建一个新 pod。在该 pod 上收集数据,并保存至以 must-gather.local
开头的一个新目录中。该目录在当前工作目录中创建。
11.6.2. 关于收集低延迟数据
使用 oc adm must-gather
CLI 命令来收集有关集群的信息,包括与低延迟性能优化相关的功能和对象,包括:
- Node Tuning Operator 命名空间和子对象。
-
MachineConfigPool
和关联的MachineConfig
对象。 - Node Tuning Operator 和关联的 Tuned 对象。
- Linux 内核命令行选项。
- CPU 和 NUMA 拓扑
- 基本 PCI 设备信息和 NUMA 本地性。
要使用 must-gather
来收集调试信息,您必须指定 Performance Addon Operator must-gather
镜像:
--image=registry.redhat.io/openshift4/performance-addon-operator-must-gather-rhel8:v4.12.
在早期版本的 OpenShift Container Platform 中,Performance Addon Operator 为应用程序提供了自动、低延迟的性能调整。在 OpenShift Container Platform 4.11 及更新的版本中,这个功能是 Node Tuning Operator 的一部分。但是,在运行 must-gather
命令时,仍必须使用 performance-addon-operator-must-gather
镜像。
11.6.3. 收集有关特定功能的数据
您可通过将 oc adm must-gather
CLI 命令与 --image
或 --image-stream
参数结合使用来收集有关特定功能的调试信息。must-gather
工具支持多个镜像,这样您便可通过运行单个命令收集多个功能的数据。
要收集除特定功能数据外的默认 must-gather
数据,请添加 --image-stream=openshift/must-gather
参数。
在早期版本的 OpenShift Container Platform 中,Performance Addon Operator 为应用程序提供了自动、低延迟的性能调整。在 OpenShift Container Platform 4.11 中,这些功能是 Node Tuning Operator 的一部分。但是,在运行 must-gather
命令时,仍必须使用 performance-addon-operator-must-gather
镜像。
先决条件
-
使用具有
cluster-admin
角色的用户访问集群。 - 安装了 OpenShift Container Platform CLI(oc)。
流程
-
进入存储
must-gather
数据的目录。 使用一个或多个
--image
或--image-stream
参数运行oc adm must-gather
命令。例如,使用以下命令可收集默认集群数据和 Node Tuning Operator 特定信息:$ oc adm must-gather \ --image-stream=openshift/must-gather \ 1 --image=registry.redhat.io/openshift4/performance-addon-operator-must-gather-rhel8:v4.12 2
从工作目录中创建的
must-gather
目录创建一个压缩文件。例如,在使用 Linux 操作系统的计算机上运行以下命令:$ tar cvaf must-gather.tar.gz must-gather.local.5421342344627712289/ 1
- 1
- 将
must-gather-local.5421342344627712289/
替换为实际目录名称。
- 在红帽客户门户中为您的问题单附上压缩文件。
其他资源
- 有关 MachineConfig 和 KubeletConfig 的更多信息,请参阅管理节点。
- 如需有关 Node Tuning Operator 的更多信息,请参阅使用 Node Tuning Operator。
- 有关 PerformanceProfile 的更多信息,请参阅配置巨页。
- 有关容器消耗巨页的更多信息,请参阅应用程序如何使用巨页。
第 12 章 为平台验证执行延迟测试
您可以使用 Cloud-native Network Function (CNF) 测试镜像在启用了 CNF 的 OpenShift Container Platform 集群上运行延迟测试,其中安装了运行 CNF 工作负载所需的所有组件。运行延迟测试以验证工作负载的节点调整。
cnf-tests
容器镜像位于 registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12
中。
cnf-tests
镜像还包含了红帽不支持的多个测试。红帽只支持延迟测试。
12.1. 运行延迟测试的先决条件
运行延迟测试前,集群必须满足以下要求:
- 已使用 Node Tuning Operator 配置一个性能配置集。
- 已在集群中应用了所有所需的 CNF 配置。
-
已在集群中应用了已存在的
MachineConfigPool
CR。默认 worker 池为worker-cnf
。
其他资源
- 有关创建集群性能配置集的更多信息,请参阅置备具有实时功能的 worker。
12.2. 关于延迟测试的发现模式
使用发现模式在不更改其配置的情况下验证集群的功能。在测试时使用现有环境配置。测试可以找到所需的配置项目,并使用这些项目来执行测试。如果没有找到运行特定测试所需的资源,则会跳过测试,为用户提供正确的信息。测试完成后,不会清理预配置的配置项目,测试环境可立即用于另一个测试运行。
在运行延迟测试时,始终使用 -e DISCOVERY_MODE=true
和 -ginkgo.focus
设置为适当的延迟测试。如果您没有以发现模式运行延迟测试,则测试运行修改现有的实时集群性能配置集配置。
限制测试过程中使用的节点
通过指定 NODES_SELECTOR
环境变量来限制执行测试的节点,例如 -e NODES_SELECTOR=node-role.kubernetes.io/worker-cnf
。测试创建的任何资源都仅限于具有匹配标签的节点。
如果要覆盖默认 worker 池,请将 -e ROLE_WORKER_CNF=<custom_worker_pool>
变量传递给指定适当标签的命令。
12.3. 测量延迟
cnf-tests
镜像使用三种工具来测量系统的延迟:
-
hwlatdetect
-
cyclictest
-
oslat
每个工具都有特定的用途。按顺序使用工具来获取可靠的测试结果。
- hwlatdetect
-
测量裸机硬件可达到的基准。在继续执行下一个延迟测试前,请确保
hwlatdetect
报告的延迟满足所需的阈值,因为您无法通过操作系统调整来修复硬件延迟高峰。 - cyclictest
-
在
hwlatdetect
验证后验证实时内核调度程序延迟。cyclictest
工具调度重复的计时器,并测量所需与实际触发时间之间的差别。这种差别可以发现与中断或进程优先级导致的调优相关的基本问题。该工具必须在实时内核中运行。 - oslat
- 行为与 CPU 密集型 DPDK 应用程序类似,并测量模拟 CPU 繁重数据处理的忙碌循环和中断。
测试引入了以下环境变量:
环境变量 | 描述 |
---|---|
| 指定测试开始运行的时间(以秒为单位)。您可以使用变量来允许 CPU 管理器协调循环来更新默认的 CPU 池。默认值为 0。 |
| 指定运行延迟测试的 pod 使用的 CPU 数量。如果没有设置变量,则默认配置包含所有隔离的 CPU。 |
| 指定延迟测试必须运行的时间(以秒为单位)。默认值为 300 秒。 |
|
指定工作负载和操作系统的最大可接受硬件延迟(微秒)。如果您没有设置 |
|
指定 |
|
指定 |
| 指定以微秒为单位的最大可接受的延迟的统一变量。适用于所有可用延迟工具。 |
|
指明测试是否应该运行的布尔值参数。 |
特定于延迟工具的变量优先于统一变量。例如,如果 OSLAT_MAXIMUM_LATENCY
设置为 30 微秒,而 MAXIMUM_LATENCY
被设置为 10 微秒,则 oslat
测试将以最大可接受的延迟 30 微秒运行。
12.4. 运行延迟测试
运行集群延迟测试,以验证 Cloud-native Network Function (CNF) 工作负载的节点调整。
始终使用 DISCOVERY_MODE=true
设置运行延迟测试。如果没有,测试套件将对正在运行的集群配置进行更改。
当以非 root 用户或非特权用户执行 podman
命令时,挂载路径可能会失败,错误为 permission denied
。要使 podman
命令正常工作,请将 :Z
附加到卷创建中,例如 -v $(pwd)/:/kubeconfig:Z
。这允许 podman
进行正确的 SELinux 重新标记。
流程
在包含
kubeconfig
文件的目录中打开 shell 提示符。您可以在当前目录中为测试镜像提供
kubeconfig
文件,及其相关的$KUBECONFIG
环境变量(通过卷挂载)。这允许运行的容器使用容器内的kubeconfig
文件。输入以下命令运行延迟测试:
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \ /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"
-
可选:附加
-ginkgo.dryRun
以空运行模式运行延迟测试。这对于检查测试运行的内容非常有用。 -
可选: 附加
-ginkgo.v
用来运行测试,并增加详细程度。 可选: 要针对特定的性能配置集运行延迟测试,请运行以下命令,替换适当的值:
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e LATENCY_TEST_RUN=true -e FEATURES=performance -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \ -e PERF_TEST_PROFILE=<performance_profile> registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \ /usr/bin/test-run.sh -ginkgo.focus="[performance]\ Latency\ Test"
其中:
- <performance_profile>
- 是您要对其运行延迟测试的性能配置集的名称。
重要如需有效延迟测试结果,请至少运行测试 12 小时。
12.4.1. 运行 hwlatdetect
hwlatdetect
工具位于 rt-kernel
软件包中,带有常规订阅 Red Hat Enterprise Linux (RHEL) 8.x。
始终使用 DISCOVERY_MODE=true
设置运行延迟测试。如果没有,测试套件将对正在运行的集群配置进行更改。
当以非 root 用户或非特权用户执行 podman
命令时,挂载路径可能会失败,错误为 permission denied
。要使 podman
命令正常工作,请将 :Z
附加到卷创建中,例如 -v $(pwd)/:/kubeconfig:Z
。这允许 podman
进行正确的 SELinux 重新标记。
先决条件
- 已在集群中安装了实时内核。
-
您使用客户门户网站凭证登录到
registry.redhat.io
。
流程
要运行
hwlatdetect
测试,请运行以下命令,并根据情况替换变量值:$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=worker-cnf \ -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \ /usr/bin/test-run.sh -ginkgo.v -ginkgo.focus="hwlatdetect"
hwlatdetect
测试运行了 10 分钟 (600 秒)。当最观察到的延迟低于MAXIMUM_LATENCY
(20 FORWARD) 时,测试会成功运行。如果结果超过延迟阈值,测试会失败。
重要对于有效结果,测试应至少运行 12 小时。
失败输出示例
running /usr/bin/cnftests -ginkgo.v -ginkgo.focus=hwlatdetect I0908 15:25:20.023712 27 request.go:601] Waited for 1.046586367s due to client-side throttling, not priority and fairness, request: GET:https://api.hlxcl6.lab.eng.tlv2.redhat.com:6443/apis/imageregistry.operator.openshift.io/v1?timeout=32s Running Suite: CNF Features e2e integration tests ================================================= Random Seed: 1662650718 Will run 1 of 194 specs [...] • Failure [283.574 seconds] [performance] Latency Test /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:62 with the hwlatdetect image /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:228 should succeed [It] /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:236 Log file created at: 2022/09/08 15:25:27 Running on machine: hwlatdetect-b6n4n Binary: Built with gc go1.17.12 for linux/amd64 Log line format: [IWEF]mmdd hh:mm:ss.uuuuuu threadid file:line] msg I0908 15:25:27.160620 1 node.go:39] Environment information: /proc/cmdline: BOOT_IMAGE=(hd1,gpt3)/ostree/rhcos-c6491e1eedf6c1f12ef7b95e14ee720bf48359750ac900b7863c625769ef5fb9/vmlinuz-4.18.0-372.19.1.el8_6.x86_64 random.trust_cpu=on console=tty0 console=ttyS0,115200n8 ignition.platform.id=metal ostree=/ostree/boot.1/rhcos/c6491e1eedf6c1f12ef7b95e14ee720bf48359750ac900b7863c625769ef5fb9/0 ip=dhcp root=UUID=5f80c283-f6e6-4a27-9b47-a287157483b2 rw rootflags=prjquota boot=UUID=773bf59a-bafd-48fc-9a87-f62252d739d3 skew_tick=1 nohz=on rcu_nocbs=0-3 tuned.non_isolcpus=0000ffff,ffffffff,fffffff0 systemd.cpu_affinity=4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79 intel_iommu=on iommu=pt isolcpus=managed_irq,0-3 nohz_full=0-3 tsc=nowatchdog nosoftlockup nmi_watchdog=0 mce=off skew_tick=1 rcutree.kthread_prio=11 + + I0908 15:25:27.160830 1 node.go:46] Environment information: kernel version 4.18.0-372.19.1.el8_6.x86_64 I0908 15:25:27.160857 1 main.go:50] running the hwlatdetect command with arguments [/usr/bin/hwlatdetect --threshold 1 --hardlimit 1 --duration 100 --window 10000000us --width 950000us] F0908 15:27:10.603523 1 main.go:53] failed to run hwlatdetect command; out: hwlatdetect: test duration 100 seconds detector: tracer parameters: Latency threshold: 1us 1 Sample window: 10000000us Sample width: 950000us Non-sampling period: 9050000us Output File: None Starting test test finished Max Latency: 326us 2 Samples recorded: 5 Samples exceeding threshold: 5 ts: 1662650739.017274507, inner:6, outer:6 ts: 1662650749.257272414, inner:14, outer:326 ts: 1662650779.977272835, inner:314, outer:12 ts: 1662650800.457272384, inner:3, outer:9 ts: 1662650810.697273520, inner:3, outer:2 [...] JUnit report was created: /junit.xml/cnftests-junit.xml Summarizing 1 Failure: [Fail] [performance] Latency Test with the hwlatdetect image [It] should succeed /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:476 Ran 1 of 194 Specs in 365.797 seconds FAIL! -- 0 Passed | 1 Failed | 0 Pending | 193 Skipped --- FAIL: TestTest (366.08s) FAIL
hwlatdetect 测试结果示例
您可以捕获以下类型的结果:
- 在每次运行后收集的粗略结果,以便对整个测试过程中所做的任何更改产生影响的历史记录。
- 基本测试和配置设置的组合。
良好结果的示例
hwlatdetect: test duration 3600 seconds detector: tracer parameters: Latency threshold: 10us Sample window: 1000000us Sample width: 950000us Non-sampling period: 50000us Output File: None Starting test test finished Max Latency: Below threshold Samples recorded: 0
hwlatdetect
工具仅在示例超过指定阈值时提供输出。
错误结果的示例
hwlatdetect: test duration 3600 seconds detector: tracer parameters:Latency threshold: 10usSample window: 1000000us Sample width: 950000usNon-sampling period: 50000usOutput File: None Starting tests:1610542421.275784439, inner:78, outer:81 ts: 1610542444.330561619, inner:27, outer:28 ts: 1610542445.332549975, inner:39, outer:38 ts: 1610542541.568546097, inner:47, outer:32 ts: 1610542590.681548531, inner:13, outer:17 ts: 1610543033.818801482, inner:29, outer:30 ts: 1610543080.938801990, inner:90, outer:76 ts: 1610543129.065549639, inner:28, outer:39 ts: 1610543474.859552115, inner:28, outer:35 ts: 1610543523.973856571, inner:52, outer:49 ts: 1610543572.089799738, inner:27, outer:30 ts: 1610543573.091550771, inner:34, outer:28 ts: 1610543574.093555202, inner:116, outer:63
hwlatdetect
的输出显示多个样本超过阈值。但是,相同的输出可能会根据以下因素显示不同的结果:
- 测试的持续时间
- CPU 内核数
- 主机固件设置
在继续执行下一个延迟测试前,请确保 hwlatdetect
报告的延迟满足所需的阈值。修复硬件带来的延迟可能需要您联系系统厂商支持。
并非所有延迟高峰都与硬件相关。确保调整主机固件以满足您的工作负载要求。如需更多信息,请参阅为系统调整设置固件参数。
12.4.2. 运行 cyclictest
cyclictest
工具测量指定 CPU 上的实时内核调度程序延迟。
始终使用 DISCOVERY_MODE=true
设置运行延迟测试。如果没有,测试套件将对正在运行的集群配置进行更改。
当以非 root 用户或非特权用户执行 podman
命令时,挂载路径可能会失败,错误为 permission denied
。要使 podman
命令正常工作,请将 :Z
附加到卷创建中,例如 -v $(pwd)/:/kubeconfig:Z
。这允许 podman
进行正确的 SELinux 重新标记。
先决条件
-
您使用客户门户网站凭证登录到
registry.redhat.io
。 - 已在集群中安装了实时内核。
- 已使用 Node Tuning Operator 应用了集群性能配置集。
流程
要执行
cyclictest
,请运行以下命令,并根据情况替换变量值:$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=worker-cnf \ -e LATENCY_TEST_CPUS=10 -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \ /usr/bin/test-run.sh -ginkgo.v -ginkgo.focus="cyclictest"
该命令运行
cyclictest
工具 10 分钟(600 秒)。当观察到的延迟低于MAXIMUM_LATENCY
时,测试会成功运行(在本例中,20 TOKENs)。对于电信 RAN 工作负载,对 20 个以上延迟的激增通常并不能接受。如果结果超过延迟阈值,测试会失败。
重要对于有效结果,测试应至少运行 12 小时。
失败输出示例
running /usr/bin/cnftests -ginkgo.v -ginkgo.focus=cyclictest I0908 13:01:59.193776 27 request.go:601] Waited for 1.046228824s due to client-side throttling, not priority and fairness, request: GET:https://api.compute-1.example.com:6443/apis/packages.operators.coreos.com/v1?timeout=32s Running Suite: CNF Features e2e integration tests ================================================= Random Seed: 1662642118 Will run 1 of 194 specs [...] Summarizing 1 Failure: [Fail] [performance] Latency Test with the cyclictest image [It] should succeed /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:220 Ran 1 of 194 Specs in 161.151 seconds FAIL! -- 0 Passed | 1 Failed | 0 Pending | 193 Skipped --- FAIL: TestTest (161.48s) FAIL
cyclictest 结果示例
相同的输出可能会显示不同工作负载的结果。例如,spikes 最长为 18μs 对 4G DU 工作负载是可以接受的,但对于 5G DU 工作负载不能接受。
良好结果的示例
running cmd: cyclictest -q -D 10m -p 1 -t 16 -a 2,4,6,8,10,12,14,16,54,56,58,60,62,64,66,68 -h 30 -i 1000 -m # Histogram 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000001 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000002 579506 535967 418614 573648 532870 529897 489306 558076 582350 585188 583793 223781 532480 569130 472250 576043 More histogram entries ... # Total: 000600000 000600000 000600000 000599999 000599999 000599999 000599998 000599998 000599998 000599997 000599997 000599996 000599996 000599995 000599995 000599995 # Min Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 # Avg Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 # Max Latencies: 00005 00005 00004 00005 00004 00004 00005 00005 00006 00005 00004 00005 00004 00004 00005 00004 # Histogram Overflows: 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 00000 # Histogram Overflow at cycle number: # Thread 0: # Thread 1: # Thread 2: # Thread 3: # Thread 4: # Thread 5: # Thread 6: # Thread 7: # Thread 8: # Thread 9: # Thread 10: # Thread 11: # Thread 12: # Thread 13: # Thread 14: # Thread 15:
错误结果的示例
running cmd: cyclictest -q -D 10m -p 1 -t 16 -a 2,4,6,8,10,12,14,16,54,56,58,60,62,64,66,68 -h 30 -i 1000 -m # Histogram 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000001 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000000 000002 564632 579686 354911 563036 492543 521983 515884 378266 592621 463547 482764 591976 590409 588145 589556 353518 More histogram entries ... # Total: 000599999 000599999 000599999 000599997 000599997 000599998 000599998 000599997 000599997 000599996 000599995 000599996 000599995 000599995 000599995 000599993 # Min Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 # Avg Latencies: 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 00002 # Max Latencies: 00493 00387 00271 00619 00541 00513 00009 00389 00252 00215 00539 00498 00363 00204 00068 00520 # Histogram Overflows: 00001 00001 00001 00002 00002 00001 00000 00001 00001 00001 00002 00001 00001 00001 00001 00002 # Histogram Overflow at cycle number: # Thread 0: 155922 # Thread 1: 110064 # Thread 2: 110064 # Thread 3: 110063 155921 # Thread 4: 110063 155921 # Thread 5: 155920 # Thread 6: # Thread 7: 110062 # Thread 8: 110062 # Thread 9: 155919 # Thread 10: 110061 155919 # Thread 11: 155918 # Thread 12: 155918 # Thread 13: 110060 # Thread 14: 110060 # Thread 15: 110059 155917
12.4.3. 运行 oslat
oslat
测试模拟 CPU 密集型 DPDK 应用程序,并测量所有中断和中断来测试集群处理 CPU 大量数据处理的方式。
始终使用 DISCOVERY_MODE=true
设置运行延迟测试。如果没有,测试套件将对正在运行的集群配置进行更改。
当以非 root 用户或非特权用户执行 podman
命令时,挂载路径可能会失败,错误为 permission denied
。要使 podman
命令正常工作,请将 :Z
附加到卷创建中,例如 -v $(pwd)/:/kubeconfig:Z
。这允许 podman
进行正确的 SELinux 重新标记。
先决条件
-
您使用客户门户网站凭证登录到
registry.redhat.io
。 - 已使用 Node Tuning Operator 应用了集群性能配置集。
流程
要执行
oslat
测试,请运行以下命令,根据需要替换变量值:$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e LATENCY_TEST_RUN=true -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=worker-cnf \ -e LATENCY_TEST_CPUS=10 -e LATENCY_TEST_RUNTIME=600 -e MAXIMUM_LATENCY=20 \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \ /usr/bin/test-run.sh -ginkgo.v -ginkgo.focus="oslat"
LATENCY_TEST_CPUS
指定使用oslat
命令测试的 CPU 列表。命令运行
oslat
工具 10 分钟(600 秒)。当最观察到的延迟低于MAXIMUM_LATENCY
(20 FORWARD) 时,测试会成功运行。如果结果超过延迟阈值,测试会失败。
重要对于有效结果,测试应至少运行 12 小时。
失败输出示例
running /usr/bin/cnftests -ginkgo.v -ginkgo.focus=oslat I0908 12:51:55.999393 27 request.go:601] Waited for 1.044848101s due to client-side throttling, not priority and fairness, request: GET:https://compute-1.example.com:6443/apis/machineconfiguration.openshift.io/v1?timeout=32s Running Suite: CNF Features e2e integration tests ================================================= Random Seed: 1662641514 Will run 1 of 194 specs [...] • Failure [77.833 seconds] [performance] Latency Test /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:62 with the oslat image /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:128 should succeed [It] /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:153 The current latency 304 is bigger than the expected one 1 : 1 [...] Summarizing 1 Failure: [Fail] [performance] Latency Test with the oslat image [It] should succeed /remote-source/app/vendor/github.com/openshift/cluster-node-tuning-operator/test/e2e/performanceprofile/functests/4_latency/latency.go:177 Ran 1 of 194 Specs in 161.091 seconds FAIL! -- 0 Passed | 1 Failed | 0 Pending | 193 Skipped --- FAIL: TestTest (161.42s) FAIL
- 1
- 在本例中,测量的延迟超出了最大允许的值。
12.5. 生成延迟测试失败报告
使用以下步骤生成 JUnit 延迟测试输出和测试失败报告。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。
流程
使用集群状态和资源的信息创建测试失败报告,通过传递
--report
参数并使用报告转储的路径来进行故障排除:$ podman run -v $(pwd)/:/kubeconfig:Z -v $(pwd)/reportdest:<report_folder_path> \ -e KUBECONFIG=/kubeconfig/kubeconfig -e DISCOVERY_MODE=true -e FEATURES=performance \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \ /usr/bin/test-run.sh --report <report_folder_path> \ -ginkgo.focus="\[performance\]\ Latency\ Test"
其中:
- <report_folder_path>
- 是生成报告的文件夹的路径。
12.6. 生成 JUnit 延迟测试报告
使用以下步骤生成 JUnit 延迟测试输出和测试失败报告。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。
流程
通过传递
--junit
参数和转储报告的路径来创建兼容 JUnit 的 XML 报告:$ podman run -v $(pwd)/:/kubeconfig:Z -v $(pwd)/junitdest:<junit_folder_path> \ -e KUBECONFIG=/kubeconfig/kubeconfig -e DISCOVERY_MODE=true -e FEATURES=performance \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \ /usr/bin/test-run.sh --junit <junit_folder_path> \ -ginkgo.focus="\[performance\]\ Latency\ Test"
其中:
- <junit_folder_path>
- 是生成 junit 报告的文件夹的路径
12.7. 在单节点 OpenShift 集群上运行延迟测试
您可以在单节点 OpenShift 集群上运行延迟测试。
始终使用 DISCOVERY_MODE=true
设置运行延迟测试。如果没有,测试套件将对正在运行的集群配置进行更改。
当以非 root 用户或非特权用户执行 podman
命令时,挂载路径可能会失败,错误为 permission denied
。要使 podman
命令正常工作,请将 :Z
附加到卷创建中,例如 -v $(pwd)/:/kubeconfig:Z
。这允许 podman
进行正确的 SELinux 重新标记。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。
流程
要在单节点 OpenShift 集群上运行延迟测试,请运行以下命令:
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e DISCOVERY_MODE=true -e FEATURES=performance -e ROLE_WORKER_CNF=master \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \ /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"
注意ROLE_WORKER_CNF=master
是必需的,因为 master 是唯一节点所属的机器池。有关为延迟测试设置所需的MachineConfigPool
的更多信息,请参阅 "Prerequisites for running latency test"。运行测试套件后,,清理所有悬停的资源。
12.8. 在断开连接的集群中运行延迟测试
CNF 测试镜像可在无法访问外部 registry 的断开连接的集群中运行测试。这需要两个步骤:
-
将
cnf-tests
镜像镜像到自定义断开连接的 registry。 - 指示测试使用来自自定义断开连接的 registry 的镜像。
将镜像镜像(mirror)到集群可访问的自定义 registry
mirror
中提供了镜像可执行文件,以提供 oc
需要的输入来镜像运行测试到本地 registry 所需的镜像。
从可访问集群和 registry.redhat.io 的中间机器运行这个命令:
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \ /usr/bin/mirror -registry <disconnected_registry> | oc image mirror -f -
其中:
- <disconnected_registry>
-
是您配置的断开连接的镜像 registry,如
my.local.registry:5000/
。
当您将
cnf-tests
镜像 mirror 到断开连接的 registry 中时,您必须覆盖用于运行测试时用来获取镜像的原始 registry,例如:$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e DISCOVERY_MODE=true -e FEATURES=performance -e IMAGE_REGISTRY="<disconnected_registry>" \ -e CNF_TESTS_IMAGE="cnf-tests-rhel8:v4.12" \ /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"
配置测试以使用自定义 registry 中的镜像
您可以使用 CNF_TESTS_IMAGE
和 IMAGE_REGISTRY
变量来使用自定义测试镜像和镜像 registry 运行延迟测试。
要将延迟测试配置为使用自定义测试镜像和镜像 registry,请运行以下命令:
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e IMAGE_REGISTRY="<custom_image_registry>" \ -e CNF_TESTS_IMAGE="<custom_cnf-tests_image>" \ -e FEATURES=performance \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 /usr/bin/test-run.sh
其中:
- <custom_image_registry>
-
是自定义镜像 registry,如
custom.registry:5000/
。 - <custom_cnf-tests_image>
-
是自定义 cnf-tests 镜像,如
custom-cnf-tests-image:latest
。
将镜像镜像 (mirror) 到集群 OpenShift 镜像 registry
OpenShift Container Platform 提供了一个内建的容器镜像 registry,它作为一个标准的工作负载在集群中运行。
流程
通过使用路由公开到 registry 的外部访问权限:
$ oc patch configs.imageregistry.operator.openshift.io/cluster --patch '{"spec":{"defaultRoute":true}}' --type=merge
运行以下命令来获取 registry 端点:
$ REGISTRY=$(oc get route default-route -n openshift-image-registry --template='{{ .spec.host }}')
创建用于公开镜像的命名空间:
$ oc create ns cnftests
使镜像流可供用于测试的所有命名空间使用。这需要允许 test 命名空间从
cnf-tests
镜像流中获取镜像。运行以下命令:$ oc policy add-role-to-user system:image-puller system:serviceaccount:cnf-features-testing:default --namespace=cnftests
$ oc policy add-role-to-user system:image-puller system:serviceaccount:performance-addon-operators-testing:default --namespace=cnftests
运行以下命令,检索 docker secret 名称和 auth 令牌:
$ SECRET=$(oc -n cnftests get secret | grep builder-docker | awk {'print $1'}
$ TOKEN=$(oc -n cnftests get secret $SECRET -o jsonpath="{.data['\.dockercfg']}" | base64 --decode | jq '.["image-registry.openshift-image-registry.svc:5000"].auth')
创建
dockerauth.json
文件,例如:$ echo "{\"auths\": { \"$REGISTRY\": { \"auth\": $TOKEN } }}" > dockerauth.json
对镜像进行 mirror:
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ registry.redhat.io/openshift4/cnf-tests-rhel8:4.12 \ /usr/bin/mirror -registry $REGISTRY/cnftests | oc image mirror --insecure=true \ -a=$(pwd)/dockerauth.json -f -
运行测试:
$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ -e DISCOVERY_MODE=true -e FEATURES=performance -e IMAGE_REGISTRY=image-registry.openshift-image-registry.svc:5000/cnftests \ cnf-tests-local:latest /usr/bin/test-run.sh -ginkgo.focus="\[performance\]\ Latency\ Test"
对不同的测试镜像进行镜像(mirror)
您可以选择更改对延迟测试镜像的默认上游镜像。
流程
mirror
命令默认尝试对上游镜像进行 mirror。这可以通过向镜像传递带有以下格式的文件来覆盖:[ { "registry": "public.registry.io:5000", "image": "imageforcnftests:4.12" } ]
将文件传递给
mirror
命令,例如将其在本地保存为images.json
。使用以下命令,本地路径挂载到容器内的/kubeconfig
中,并可传递给 mirror 命令。$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 /usr/bin/mirror \ --registry "my.local.registry:5000/" --images "/kubeconfig/images.json" \ | oc image mirror -f -
12.9. 对 cnf-tests 容器的错误进行故障排除
要运行延迟测试,集群必须从 cnf-tests
容器中访问。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。
流程
运行以下命令,验证可以从
cnf-tests
容器中访问集群:$ podman run -v $(pwd)/:/kubeconfig:Z -e KUBECONFIG=/kubeconfig/kubeconfig \ registry.redhat.io/openshift4/cnf-tests-rhel8:v4.12 \ oc get nodes
如果这个命令无法正常工作,则可能会出现与跨 DNS、MTU 大小或防火墙访问相关的错误。
第 13 章 使用 worker 延迟配置集提高高延迟环境中的集群稳定性
如果集群管理员为平台验证执行了延迟测试,他们可以发现需要调整集群的操作,以确保高延迟的情况的稳定性。集群管理员只需要更改一个参数,该参数记录在一个文件中,它控制了 Supervisory 进程读取状态并解释集群的运行状况的四个参数。仅更改一个参数可以以方便、可支持的方式提供集群调整。
Kubelet
进程提供监控集群运行状况的起点。Kubelet
为 OpenShift Container Platform 集群中的所有节点设置状态值。Kubernetes Controller Manager (kube controller
) 默认每 10 秒读取状态值。如果 kube 控制器
无法读取节点状态值,它会在配置的时间后丢失与该节点联系。默认行为是:
-
control plane 上的节点控制器将节点健康状况更新为
Unhealthy
,并奖节点Ready
的条件标记为 'Unknown'。 - 因此,调度程序会停止将 pod 调度到该节点。
-
Node Lifecycle Controller 添加了一个
node.kubernetes.io/unreachable
污点,对节点具有NoExecute
效果,默认在五分钟后调度节点上的任何 pod 进行驱除。
如果您的网络容易出现延迟问题,尤其是在网络边缘中有节点时,此行为可能会造成问题。在某些情况下,Kubernetes Controller Manager 可能会因为网络延迟而从健康的节点接收更新。Kubelet
会从节点中驱除 pod,即使节点处于健康状态。
要避免这个问题,您可以使用 worker 延迟配置集调整 kubelet
和 Kubernetes Controller Manager 在执行操作前等待状态更新的频率。如果在控制平面和 worker 节点间存在网络延迟,worker 节点没有处于最近状态,这个调整有助于集群可以正常工作。
这些 worker 延迟配置集包含预定义的三组参数,它们带有经过仔细调优的值,以控制集群对增加的延迟进行适当地响应。用户不需要手动进行实验以查找最佳值。
您可在安装集群时配置 worker 延迟配置集,或当您发现集群网络中的延迟增加时。
13.1. 了解 worker 延迟配置集
worker 延迟配置集带有四个不同的、包括经过仔细调优的参数的类别。实现这些值的四个参数是 node-status-update-frequency
、node-monitor-grace-period
、default-not-ready-toleration-seconds
和 default-unreachable-toleration-seconds
。这些参数可让您使用这些值来控制集群对延迟问题的响应,而无需手动确定最佳值。
不支持手动设置这些参数。参数设置不正确会影响集群的稳定性。
所有 worker 延迟配置集配置以下参数:
- node-status-update-frequency
- 指定 kubelet 将节点状态发布到 API 服务器的频率。
- node-monitor-grace-period
-
指定 Kubernetes Controller Manager 在节点不健康前等待更新的时间(以秒为单位),并将
node.kubernetes.io/not-ready
或node.kubernetes.io/unreachable
污点添加到节点。 - default-not-ready-toleration-seconds
- 指定在标记节点不健康后,Kube API Server Operator 在从该节点驱除 pod 前等待的时间(以秒为单位)。
- default-unreachable-toleration-seconds
- 指定在节点无法访问后,Kube API Server Operator 在从该节点驱除 pod 前等待的时间(以秒为单位)。
以下 Operator 监控 worker 延迟配置集的更改并相应地响应:
-
Machine Config Operator (MCO) 更新 worker 节点上的
node-status-update-frequency
参数。 -
Kubernetes Controller Manager 更新 control plane 节点上的
node-monitor-grace-period
参数。 -
Kubernetes API Server Operator 更新 control plane 节点上的
default-not-ready-toleration-seconds
和default-unreachable-toleration-seconds
参数。
虽然默认配置在大多数情况下可以正常工作,但 OpenShift Container Platform 会为网络遇到比通常更高的延迟的情况提供两个其他 worker 延迟配置集。以下部分描述了三个 worker 延迟配置集:
- 默认 worker 延迟配置集
使用
Default
配置集时,每个Kubelet
每 10 秒更新其状态(node-status-update-frequency
)。Kube Controller Manager
每 5 秒检查Kubelet
的状态(node-monitor-grace-period
)。在认为
Kubelet
不健康前,Kubernetes Controller Manager 会等待 40 秒以获取来自Kubelet
的状态更新。如果没有可用于 Kubernetes Controller Manager 的使用状态,它会使用node.kubernetes.io/not-ready
或node.kubernetes.io/unreachable
污点标记节点,并驱除该节点上的 pod。如果该节点上的 pod 具有
NoExecute
污点,则 pod 会根据tolerationSeconds
运行。如果 pod 没有污点,它将在 300 秒内被驱除(default-not-ready-toleration-seconds
和Kube API Server
的default-unreachable-toleration-seconds
设置)。profile 组件 参数 值 Default(默认)
kubelet
node-status-update-frequency
10s
kubelet Controller Manager
node-monitor-grace-period
40s
Kubernetes API Server Operator
default-not-ready-toleration-seconds
300s
Kubernetes API Server Operator
default-unreachable-toleration-seconds
300s
- 中型 worker 延迟配置集
如果网络延迟比通常稍高,则使用
MediumUpdateAverageReaction
配置集。MediumUpdateAverageReaction
配置集减少了 kubelet 更新频率为 20 秒,并将 Kubernetes Controller Manager 等待这些更新的时间更改为 2 分钟。该节点上的 pod 驱除周期会减少到 60 秒。如果 pod 具有tolerationSeconds
参数,则驱除会等待该参数指定的周期。Kubernetes Controller Manager 会先等待 2 分钟时间,才会认为节点不健康。另一分钟后,驱除过程会启动。
profile 组件 参数 值 MediumUpdateAverageReaction
kubelet
node-status-update-frequency
20s
kubelet Controller Manager
node-monitor-grace-period
2m
Kubernetes API Server Operator
default-not-ready-toleration-seconds
60s
Kubernetes API Server Operator
default-unreachable-toleration-seconds
60s
- 低 worker 延迟配置集
如果网络延迟非常高,请使用
LowUpdateSlowReaction
配置集。LowUpdateSlowReaction
配置集将 kubelet 更新频率减少为 1 分钟,并将 Kubernetes Controller Manager 等待这些更新的时间更改为 5 分钟。该节点上的 pod 驱除周期会减少到 60 秒。如果 pod 具有tolerationSeconds
参数,则驱除会等待该参数指定的周期。Kubernetes Controller Manager 在认为节点不健康前会等待 5 分钟。另一分钟后,驱除过程会启动。
profile 组件 参数 值 LowUpdateSlowReaction
kubelet
node-status-update-frequency
1m
kubelet Controller Manager
node-monitor-grace-period
5m
Kubernetes API Server Operator
default-not-ready-toleration-seconds
60s
Kubernetes API Server Operator
default-unreachable-toleration-seconds
60s
13.2. 在集群创建时实现 worker 延迟配置集
要编辑安装程序的配置,首先需要使用命令 openshift-install create manifests
来创建默认节点清单,以及其他清单 YAML 文件。在添加 workerLatencyProfile 前,该文件结构必须存在。安装的平台可能具有不同的要求。有关特定平台,请参阅文档中的安装部分。
workerLatencyProfile
必须按以下顺序添加到清单中:
- 使用适合您安装的文件夹名称,创建构建集群所需的清单。
-
创建 YAML 文件以定义
config.node
。该文件必须位于manifests
目录中。 -
第一次在清单中定义
workerLatencyProfile
时,在集群创建时指定任何配置集:Default
,MediumUpdateAverageReaction
或LowUpdateSlowReaction
。
验证
以下是一个清单创建示例,显示清单文件中的
spec.workerLatencyProfile
Default
值:$ openshift-install create manifests --dir=<cluster-install-dir>
编辑清单并添加值。在本例中,我们使用
vi
显示添加了 "Default"workerLatencyProfile
值的示例清单文件:$ vi <cluster-install-dir>/manifests/config-node-default-profile.yaml
输出示例
apiVersion: config.openshift.io/v1 kind: Node metadata: name: cluster spec: workerLatencyProfile: "Default"
13.3. 使用和更改 worker 延迟配置集
要更改 worker 延迟配置集以处理网络延迟,请编辑 node.config
对象以添加配置集的名称。当延迟增加或减少时,您可以随时更改配置集。
您必须一次移动一个 worker 延迟配置集。例如,您无法直接从 Default
配置集移到 LowUpdateSlowReaction
worker 延迟配置集。您必须首先从 Default
worker 延迟配置集移到 MediumUpdateAverageReaction
配置集,然后再移到 LowUpdateSlowReaction
。同样,当返回到 Default
配置集时,您必须首先从低配置集移到中配置集,然后移到 Default
。
您还可以在安装 OpenShift Container Platform 集群时配置 worker 延迟配置集。
流程
将默认的 worker 延迟配置集改为:
中 worke worker 延迟配置集:
编辑
node.config
对象:$ oc edit nodes.config/cluster
添加
spec.workerLatencyProfile: MediumUpdateAverageReaction
:node.config
对象示例apiVersion: config.openshift.io/v1 kind: Node metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" release.openshift.io/create-only: "true" creationTimestamp: "2022-07-08T16:02:51Z" generation: 1 name: cluster ownerReferences: - apiVersion: config.openshift.io/v1 kind: ClusterVersion name: version uid: 36282574-bf9f-409e-a6cd-3032939293eb resourceVersion: "1865" uid: 0c0f7a4c-4307-4187-b591-6155695ac85b spec: workerLatencyProfile: MediumUpdateAverageReaction 1 # ...
- 1
- 指定中 worker 延迟策略。
随着更改被应用,每个 worker 节点上的调度都会被禁用。
可选:改为低 worker 延迟配置集:
编辑
node.config
对象:$ oc edit nodes.config/cluster
将
spec.workerLatencyProfile
值更改为LowUpdateSlowReaction
:node.config
对象示例apiVersion: config.openshift.io/v1 kind: Node metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" release.openshift.io/create-only: "true" creationTimestamp: "2022-07-08T16:02:51Z" generation: 1 name: cluster ownerReferences: - apiVersion: config.openshift.io/v1 kind: ClusterVersion name: version uid: 36282574-bf9f-409e-a6cd-3032939293eb resourceVersion: "1865" uid: 0c0f7a4c-4307-4187-b591-6155695ac85b spec: workerLatencyProfile: LowUpdateSlowReaction 1 # ...
- 1
- 指定使用低 worker 延迟策略。
随着更改被应用,每个 worker 节点上的调度都会被禁用。
验证
当所有节点都返回到
Ready
条件时,您可以使用以下命令查看 Kubernetes Controller Manager 以确保应用它:$ oc get KubeControllerManager -o yaml | grep -i workerlatency -A 5 -B 5
输出示例
# ... - lastTransitionTime: "2022-07-11T19:47:10Z" reason: ProfileUpdated status: "False" type: WorkerLatencyProfileProgressing - lastTransitionTime: "2022-07-11T19:47:10Z" 1 message: all static pod revision(s) have updated latency profile reason: ProfileUpdated status: "True" type: WorkerLatencyProfileComplete - lastTransitionTime: "2022-07-11T19:20:11Z" reason: AsExpected status: "False" type: WorkerLatencyProfileDegraded - lastTransitionTime: "2022-07-11T19:20:36Z" status: "False" # ...
- 1
- 指定配置集被应用并激活。
要将中配置集改为默认,或将默认改为中,编辑 node.config
对象,并将 spec.workerLatencyProfile
参数设置为适当的值。
13.4. 显示 workerLatencyProfile 生成的值的步骤示例
您可以使用以下命令显示 workerLatencyProfile
中的值。
验证
检查 Kube API Server 的
default-not-ready-toleration-seconds
和default-unreachable-toleration-seconds
字段输出:$ oc get KubeAPIServer -o yaml | grep -A 1 default-
输出示例
default-not-ready-toleration-seconds: - "300" default-unreachable-toleration-seconds: - "300"
从 Kube Controller Manager 检查
node-monitor-grace-period
字段的值:$ oc get KubeControllerManager -o yaml | grep -A 1 node-monitor
输出示例
node-monitor-grace-period: - 40s
检查 Kubelet 中的
nodeStatusUpdateFrequency
值。将目录/host
设置为 debug shell 中的根目录。将根目录改为/host
,您可以运行主机可执行路径中包含的二进制文件:$ oc debug node/<worker-node-name> $ chroot /host # cat /etc/kubernetes/kubelet.conf|grep nodeStatusUpdateFrequency
输出示例
“nodeStatusUpdateFrequency”: “10s”
这些输出验证 Worker Latency Profile 的计时变量集合。
第 14 章 创建性能配置集
了解 Performance Profile Creator(PPC),以及如何使用它来创建性能配置集。
目前,cgroup v2 不支持禁用 CPU 负载均衡。因此,如果您启用了 cgroup v2,则可能无法从性能配置集中获取所需的行为。如果您使用 executeace 配置集,则不建议启用 cgroup v2。
14.1. 关于性能配置集创建器
Performance Profile Creator (PPC) 是一个命令行工具,由 Node Tuning Operator 提供,用于创建性能配置集。该工具消耗来自集群的 must-gather
数据以及几个用户提供的配置集参数。PPC 生成适合您的硬件和拓扑的性能配置集。
该工具使用以下方法之一运行:
-
调用
podman
- 调用一个打包程序脚本
14.1.1. 使用 must-gather 命令收集有关集群的数据
Performance Profile Creator(PPC)工具需要 must-gather
数据。作为集群管理员,运行 must-gather
命令来捕获集群的信息。
在早期版本的 OpenShift Container Platform 中,Performance Addon Operator 为应用程序提供了自动、低延迟的性能调整。在 OpenShift Container Platform 4.11 及更新的版本中,这个功能是 Node Tuning Operator 的一部分。但是,在运行 must-gather
命令时,仍必须使用 performance-addon-operator-must-gather
镜像。
先决条件
-
使用具有
cluster-admin
角色的用户访问集群。 -
访问 Performance Addon Operator
must gather
镜像。 -
已安装 OpenShift CLI(
oc
)。
流程
可选:验证匹配的机器配置池是否存在标签:
$ oc describe mcp/worker-rt
输出示例
Name: worker-rt Namespace: Labels: machineconfiguration.openshift.io/role=worker-rt
如果匹配的标签不存在,为与 MCP 名称匹配的机器配置池(MCP) 添加标签:
$ oc label mcp <mcp_name> machineconfiguration.openshift.io/role=<mcp_name>
-
进入存储
must-gather
数据的目录。 在集群中运行
must-gather
:$ oc adm must-gather --image=<PAO_must_gather_image> --dest-dir=<dir>
注意must-gather
命令必须使用performance-addon-operator-must-gather
镜像运行。输出可以被压缩(可选)。如果您正在运行性能配置集 Creator wrapper 脚本,则需要压缩输出。Example
$ oc adm must-gather --image=registry.redhat.io/openshift4/performance-addon-operator-must-gather-rhel8:v4.12 --dest-dir=<path_to_must-gather>/must-gather
从
must-gather
目录创建一个压缩文件:$ tar cvaf must-gather.tar.gz must-gather/
14.1.2. 使用 podman 运行 Performance Profile Creator
作为集群管理员,您可以运行 podman
和 Performance Profile Creator 来创建性能配置集。
先决条件
-
使用具有
cluster-admin
角色的用户访问集群。 - 在裸机硬件上安装的集群。
-
安装了
podman
和 OpenShift CLI(oc
)的节点。 - 访问 Node Tuning Operator 镜像。
流程
检查机器配置池:
$ oc get mcp
输出示例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-acd1358917e9f98cbdb599aea622d78b True False False 3 3 3 0 22h worker-cnf rendered-worker-cnf-1d871ac76e1951d32b2fe92369879826 False True False 2 1 1 0 22h
使用 Podman 向
registry.redhat.io
进行身份验证:$ podman login registry.redhat.io
Username: <username> Password: <password>
可选:显示 PPC 工具的帮助信息:
$ podman run --rm --entrypoint performance-profile-creator registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12 -h
输出示例
A tool that automates creation of Performance Profiles Usage: performance-profile-creator [flags] Flags: --disable-ht Disable Hyperthreading -h, --help help for performance-profile-creator --info string Show cluster information; requires --must-gather-dir-path, ignore the other arguments. [Valid values: log, json] (default "log") --mcp-name string MCP name corresponding to the target machines (required) --must-gather-dir-path string Must gather directory path (default "must-gather") --offlined-cpu-count int Number of offlined CPUs --per-pod-power-management Enable Per Pod Power Management --power-consumption-mode string The power consumption mode. [Valid values: default, low-latency, ultra-low-latency] (default "default") --profile-name string Name of the performance profile to be created (default "performance") --reserved-cpu-count int Number of reserved CPUs (required) --rt-kernel Enable Real Time Kernel (required) --split-reserved-cpus-across-numa Split the Reserved CPUs across NUMA nodes --topology-manager-policy string Kubelet Topology Manager Policy of the performance profile to be created. [Valid values: single-numa-node, best-effort, restricted] (default "restricted") --user-level-networking Run with User level Networking(DPDK) enabled
以发现模式运行 Performance Profile Creator 工具:
注意发现模式使用
must-gather
的输出来检查您的集群。生成的输出包括以下信息:- 使用分配的 CPU ID 进行 NUMA 单元分区
- 是否启用超线程
使用此信息,您可以为提供给 Performance Profile Creator 工具的部分参数设置适当的值。
$ podman run --entrypoint performance-profile-creator -v <path_to_must-gather>/must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12 --info log --must-gather-dir-path /must-gather
注意此命令使用性能配置集创建器作为
podman
的新入口点。它将主机的must-gather
数据映射到容器镜像,并调用所需的用户提供的配置集参数来生成my-performance-profile.yaml
文件。-v
选项可以是到以下的任一路径:-
must-gather
输出目录 -
包含
must-gather
解压缩 tarball 的现有目录
info
选项要求值指定输出格式。可能的值有 log 和 JSON。JSON 格式被保留用于调试。运行
podman
:$ podman run --entrypoint performance-profile-creator -v /must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12 --mcp-name=worker-cnf --reserved-cpu-count=4 --rt-kernel=true --split-reserved-cpus-across-numa=false --must-gather-dir-path /must-gather --power-consumption-mode=ultra-low-latency --offlined-cpu-count=6 > my-performance-profile.yaml
注意Performance Profile Creator 参数显示在 Performance Profile Creator 参数表中。需要以下参数:
-
reserved-cpu-count
-
mcp-name
-
rt-kernel
本例中的
mcp-name
参数根据oc get mcp
命令的输出设置为worker-cnf
。对于单节点 OpenShift,请使用--mcp-name=master
。-
查看创建的 YAML 文件:
$ cat my-performance-profile.yaml
输出示例
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: cpu: isolated: 2-39,48-79 offlined: 42-47 reserved: 0-1,40-41 machineConfigPoolSelector: machineconfiguration.openshift.io/role: worker-cnf nodeSelector: node-role.kubernetes.io/worker-cnf: "" numa: topologyPolicy: restricted realTimeKernel: enabled: true workloadHints: highPowerConsumption: true realTime: true
应用生成的配置集:
$ oc apply -f my-performance-profile.yaml
14.1.2.1. 如何运行 podman
创建性能配置集
以下示例演示了如何运行 podman
来创建具有 20 个保留 CPU 的性能配置集,这些 CPU 将在 NUMA 节点之间拆分。
节点硬件配置:
- 80 个 CPU
- 启用超线程
- 两个 NUMA 节点
- 编号为偶数的 CPU 在 NUMA 节点 0 上运行,编号为奇数的 CPU 在 NUMA 节点 1 上运行
运行 podman
以创建性能配置集:
$ podman run --entrypoint performance-profile-creator -v /must-gather:/must-gather:z registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12 --mcp-name=worker-cnf --reserved-cpu-count=20 --rt-kernel=true --split-reserved-cpus-across-numa=true --must-gather-dir-path /must-gather > my-performance-profile.yaml
创建的配置集在以下 YAML 中描述:
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: cpu: isolated: 10-39,50-79 reserved: 0-9,40-49 nodeSelector: node-role.kubernetes.io/worker-cnf: "" numa: topologyPolicy: restricted realTimeKernel: enabled: true
在这种情况下,在 NUMA 节点 0 上保留 10 个 CPU,NUMA 节点 1 上保留 10 个 CPU。
14.1.3. 运行性能配置集 Creator wrapper 脚本
性能配置集打包程序脚本简化了性能配置文件 Creator(PPC)工具的运行。它隐藏了运行 podman
的复杂性并指定映射目录,它支持创建性能配置集。
先决条件
- 访问 Node Tuning Operator 镜像。
-
访问
must-gather
tarball。
流程
在本地机器上创建一个文件,例如
run-perf-profile-creator.sh
:$ vi run-perf-profile-creator.sh
将以下代码粘贴到文件中:
#!/bin/bash readonly CONTAINER_RUNTIME=${CONTAINER_RUNTIME:-podman} readonly CURRENT_SCRIPT=$(basename "$0") readonly CMD="${CONTAINER_RUNTIME} run --entrypoint performance-profile-creator" readonly IMG_EXISTS_CMD="${CONTAINER_RUNTIME} image exists" readonly IMG_PULL_CMD="${CONTAINER_RUNTIME} image pull" readonly MUST_GATHER_VOL="/must-gather" NTO_IMG="registry.redhat.io/openshift4/ose-cluster-node-tuning-operator:v4.12" MG_TARBALL="" DATA_DIR="" usage() { print "Wrapper usage:" print " ${CURRENT_SCRIPT} [-h] [-p image][-t path] -- [performance-profile-creator flags]" print "" print "Options:" print " -h help for ${CURRENT_SCRIPT}" print " -p Node Tuning Operator image" print " -t path to a must-gather tarball" ${IMG_EXISTS_CMD} "${NTO_IMG}" && ${CMD} "${NTO_IMG}" -h } function cleanup { [ -d "${DATA_DIR}" ] && rm -rf "${DATA_DIR}" } trap cleanup EXIT exit_error() { print "error: $*" usage exit 1 } print() { echo "$*" >&2 } check_requirements() { ${IMG_EXISTS_CMD} "${NTO_IMG}" || ${IMG_PULL_CMD} "${NTO_IMG}" || \ exit_error "Node Tuning Operator image not found" [ -n "${MG_TARBALL}" ] || exit_error "Must-gather tarball file path is mandatory" [ -f "${MG_TARBALL}" ] || exit_error "Must-gather tarball file not found" DATA_DIR=$(mktemp -d -t "${CURRENT_SCRIPT}XXXX") || exit_error "Cannot create the data directory" tar -zxf "${MG_TARBALL}" --directory "${DATA_DIR}" || exit_error "Cannot decompress the must-gather tarball" chmod a+rx "${DATA_DIR}" return 0 } main() { while getopts ':hp:t:' OPT; do case "${OPT}" in h) usage exit 0 ;; p) NTO_IMG="${OPTARG}" ;; t) MG_TARBALL="${OPTARG}" ;; ?) exit_error "invalid argument: ${OPTARG}" ;; esac done shift $((OPTIND - 1)) check_requirements || exit 1 ${CMD} -v "${DATA_DIR}:${MUST_GATHER_VOL}:z" "${NTO_IMG}" "$@" --must-gather-dir-path "${MUST_GATHER_VOL}" echo "" 1>&2 } main "$@"
为这个脚本中的每个人添加执行权限:
$ chmod a+x run-perf-profile-creator.sh
可选:显示
run-perf-profile-creator.sh
命令用法:$ ./run-perf-profile-creator.sh -h
预期输出
Wrapper usage: run-perf-profile-creator.sh [-h] [-p image][-t path] -- [performance-profile-creator flags] Options: -h help for run-perf-profile-creator.sh -p Node Tuning Operator image 1 -t path to a must-gather tarball 2 A tool that automates creation of Performance Profiles Usage: performance-profile-creator [flags] Flags: --disable-ht Disable Hyperthreading -h, --help help for performance-profile-creator --info string Show cluster information; requires --must-gather-dir-path, ignore the other arguments. [Valid values: log, json] (default "log") --mcp-name string MCP name corresponding to the target machines (required) --must-gather-dir-path string Must gather directory path (default "must-gather") --offlined-cpu-count int Number of offlined CPUs --per-pod-power-management Enable Per Pod Power Management --power-consumption-mode string The power consumption mode. [Valid values: default, low-latency, ultra-low-latency] (default "default") --profile-name string Name of the performance profile to be created (default "performance") --reserved-cpu-count int Number of reserved CPUs (required) --rt-kernel Enable Real Time Kernel (required) --split-reserved-cpus-across-numa Split the Reserved CPUs across NUMA nodes --topology-manager-policy string Kubelet Topology Manager Policy of the performance profile to be created. [Valid values: single-numa-node, best-effort, restricted] (default "restricted") --user-level-networking Run with User level Networking(DPDK) enabled
注意有两个参数类型:
-
wrapper 参数,即
-h
、-p
和-t
- PPC 参数
-
wrapper 参数,即
以发现模式运行性能配置集创建器工具:
注意发现模式使用
must-gather
的输出来检查您的集群。生成的输出包括以下信息:- 使用分配的 CPU ID 进行 NUMA 单元分区
- 是否启用超线程
使用此信息,您可以为提供给 Performance Profile Creator 工具的部分参数设置适当的值。
$ ./run-perf-profile-creator.sh -t /must-gather/must-gather.tar.gz -- --info=log
注意info
选项要求值指定输出格式。可能的值有 log 和 JSON。JSON 格式被保留用于调试。检查机器配置池:
$ oc get mcp
输出示例
NAME CONFIG UPDATED UPDATING DEGRADED MACHINECOUNT READYMACHINECOUNT UPDATEDMACHINECOUNT DEGRADEDMACHINECOUNT AGE master rendered-master-acd1358917e9f98cbdb599aea622d78b True False False 3 3 3 0 22h worker-cnf rendered-worker-cnf-1d871ac76e1951d32b2fe92369879826 False True False 2 1 1 0 22h
创建性能配置集:
$ ./run-perf-profile-creator.sh -t /must-gather/must-gather.tar.gz -- --mcp-name=worker-cnf --reserved-cpu-count=2 --rt-kernel=true > my-performance-profile.yaml
注意Performance Profile Creator 参数显示在 Performance Profile Creator 参数表中。需要以下参数:
-
reserved-cpu-count
-
mcp-name
-
rt-kernel
本例中的
mcp-name
参数根据oc get mcp
命令的输出设置为worker-cnf
。对于单节点 OpenShift,请使用--mcp-name=master
。-
查看创建的 YAML 文件:
$ cat my-performance-profile.yaml
输出示例
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: performance spec: cpu: isolated: 1-39,41-79 reserved: 0,40 nodeSelector: node-role.kubernetes.io/worker-cnf: "" numa: topologyPolicy: restricted realTimeKernel: enabled: false
应用生成的配置集:
注意在应用配置集前安装 Node Tuning Operator。
$ oc apply -f my-performance-profile.yaml
14.1.4. Performance Profile Creator 参数
参数 | 描述 |
---|---|
| 禁用超线程。
可能的值:
默认值: 警告
如果此参数设为 |
|
这会捕获集群信息,仅用于发现模式。发现模式还需要 可能的值:
默认: |
|
MCP 名称(如 |
| 必须收集目录路径。这个参数是必需的。
当用户使用 wrapper 脚本 |
| 离线 CPU 数量。 注意 这必须是一个大于 0 的自然数字。如果没有足够的逻辑处理器离线,则会记录错误消息。信息是: Error: failed to compute the reserved and isolated CPUs: please ensure that reserved-cpu-count plus offlined-cpu-count should be in the range [0,1] Error: failed to compute the reserved and isolated CPUs: please specify the offlined CPU count in the range [0,1] |
| 电源功耗模式。 可能的值:
默认: |
|
为每个 pod 电源管理启用。如果您将
可能的值:
默认值: |
|
要创建的性能配置集的名称。默认: |
| 保留 CPU 的数量。这个参数是必需的。 注意 这必须是一个自然数字。不允许使用 0 值。 |
| 启用实时内核。这个参数是必需的。
可能的值: |
| 将保留的 CPU 划分到 NUMA 节点。
可能的值:
默认值: |
| 要创建的性能配置集的 kubelet Topology Manager 策略。 可能的值:
默认: |
| 在启用了用户级别网络(DPDK)的情况下运行。
可能的值:
默认值: |
14.2. 参考性能配置集
14.2.1. 在 OpenStack 上使用 OVS-DPDK 的集群的性能配置集模板
要最大化使用 Open vSwitch 和 Red Hat OpenStack Platform(RHOSP)上的 Data Plane Development Kit(OVS-DPDK)的机器性能,您可以使用性能配置集。
您可以使用以下性能配置集模板为您的部署创建配置集。
使用 OVS-DPDK 的集群的性能配置集模板
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: cnf-performanceprofile spec: additionalKernelArgs: - nmi_watchdog=0 - audit=0 - mce=off - processor.max_cstate=1 - idle=poll - intel_idle.max_cstate=0 - default_hugepagesz=1GB - hugepagesz=1G - intel_iommu=on cpu: isolated: <CPU_ISOLATED> reserved: <CPU_RESERVED> hugepages: defaultHugepagesSize: 1G pages: - count: <HUGEPAGES_COUNT> node: 0 size: 1G nodeSelector: node-role.kubernetes.io/worker: '' realTimeKernel: enabled: false globallyDisableIrqLoadBalancing: true
插入适用于 CPU_ISOLATED
、CPU_RESERVED
和 HUGEPAGES_COUNT
密钥的配置的值。
要了解如何创建和使用性能配置集,请参阅 OpenShift Container Platform 文档中的"可扩展性和性能"部分的"创建性能配置集"。
14.3. 其他资源
-
有关
must-gather
工具的更多信息,请参阅收集集群的相关数据。
第 15 章 单节点 OpenShift 上的工作负载分区
在资源有限制的环境中,如单节点 OpenShift 部署,使用工作负载分区来隔离 OpenShift Container Platform 服务、集群管理工作负载和基础架构 pod,以便在保留的一组 CPU 上运行。
对于在单节点 OpenShift 中的集群管理,需要最少保留的 CPU 数量是四个 CPU Hyper-Threads (HT)。使用工作负载分区,您可以注解一组集群管理 pod 和一组典型的附加 Operator,以包含在集群管理工作负载分区中。这些 pod 通常在大小为最小要求的 CPU 配置中运行。除了最小集群管理 pod 之外,额外的其他 Operator 或工作负载则需要将额外的 CPU 添加到工作负载分区中。
工作负载分区使用标准 Kubernetes 调度功能将用户工作负载与平台工作负载隔离。
以下是工作负载分区所需的配置概述:
-
使用
/etc/crio/crio.conf.d/01-workload-partitioning
的工作负载分区将 OpenShift Container Platform 基础架构 pod 固定到定义的cpuset
配置。 性能配置集将集群服务(如 systemd 和 kubelet)固定到
spec.cpu.reserved
字段中定义的 CPU。注意使用 Node Tuning Operator,您可以配置性能配置集,为节点上的完整工作负载分区配置固定系统级别的应用程序。
-
您在性能配置集
spec.cpu.reserved
字段中指定的 CPU,工作负载分区cpuset
字段必须匹配。
工作负载分区为每个定义的 CPU 池,或工作负载类型增加了一个扩展的 <workload-type>.workload.openshift.io/cores
资源。kubelet 根据相应资源内分配给池的 pod 公告资源和 CPU 请求。启用工作负载分区时,<workload-type>.workload.openshift.io/cores
资源允许访问主机的 CPU 容量,而不仅仅是默认的 CPU 池。
其他资源
- 有关单节点 OpenShift 集群的推荐工作负载分区配置,请参阅 Workload partitioning。
第 16 章 使用 Node Observability Operator 请求 CRI-O 和 Kubelet 分析数据
Node Observability Operator 会收集并存储 worker 节点的 CRI-O 和 Kubelet 分析数据。您可以查询性能分析数据来分析 CRI-O 和 Kubelet 性能趋势,并调试与性能相关的问题。
Node Observability Operator 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
16.1. Node Observability Operator 的工作流
以下工作流概述了如何使用 Node Observability Operator 查询分析数据:
- 在 OpenShift Container Platform 集群中安装 Node Observability Operator。
- 创建 NodeObservability 自定义资源,在您选择的 worker 节点上启用 CRI-O 分析。
- 运行性能分析查询,以生成分析数据。
16.2. 安装 Node Observability Operator
默认情况下,OpenShift Container Platform 中不会安装 Node Observability Operator。您可以使用 OpenShift Container Platform CLI 或 Web 控制台安装 Node Observability Operator。
16.2.1. 使用 CLI 安装 Node Observability Operator
您可以使用 OpenShift CLI(oc)安装 Node Observability Operator。
先决条件
- 已安装 OpenShift CLI(oc)。
-
您可以使用
cluster-admin
权限访问集群。
流程
运行以下命令确认 Node Observability Operator 可用:
$ oc get packagemanifests -n openshift-marketplace node-observability-operator
输出示例
NAME CATALOG AGE node-observability-operator Red Hat Operators 9h
运行以下命令来创建
node-observability-operator
命名空间:$ oc new-project node-observability-operator
创建
OperatorGroup
对象 YAML 文件:cat <<EOF | oc apply -f - apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: node-observability-operator namespace: node-observability-operator spec: targetNamespaces: [] EOF
创建一个
Subscription
对象 YAML 文件,以便为 Operator 订阅一个命名空间:cat <<EOF | oc apply -f - apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: node-observability-operator namespace: node-observability-operator spec: channel: alpha name: node-observability-operator source: redhat-operators sourceNamespace: openshift-marketplace EOF
验证
运行以下命令来查看安装计划名称:
$ oc -n node-observability-operator get sub node-observability-operator -o yaml | yq '.status.installplan.name'
输出示例
install-dt54w
运行以下命令验证安装计划状态:
$ oc -n node-observability-operator get ip <install_plan_name> -o yaml | yq '.status.phase'
<install_plan_name>
是您从上一命令的输出中获取的安装计划名称。输出示例
COMPLETE
验证 Node Observability Operator 是否正在运行:
$ oc get deploy -n node-observability-operator
输出示例
NAME READY UP-TO-DATE AVAILABLE AGE node-observability-operator-controller-manager 1/1 1 1 40h
16.2.2. 使用 Web 控制台安装 Node Observability Operator
您可从 OpenShift Container Platform Web 控制台安装 Node Observability Operator。
先决条件
-
您可以使用
cluster-admin
权限访问集群。 - 访问 OpenShift Container Platform web 控制台。
流程
- 登陆到 OpenShift Container Platform Web 控制台。
- 在管理员的导航面板中,展开 Operators → OperatorHub。
- 在 All items 字段中,输入 Node Observability Operator 并选择 Node Observability Operator 标题。
- 点 Install。
在 Install Operator 页面中,配置以下设置:
- 在 Update 频道区中,点 alpha。
- 在 Installation 模式 区中,点 A specific namespace on the cluster。
- 在 Installed Namespace 列表中,从列表中选择 node-observability-operator。
- 在 Update approval 区中,选择 Automatic。
- 点 Install。
验证
- 在 Administrator 的导航面板中,展开 Operators → Installed Operators。
- 验证 Node Observability Operator 是否列在 Operators 列表中。
16.3. 创建 Node Observability 自定义资源
在运行性能分析查询前,您必须创建并运行 NodeObservability
自定义资源 (CR)。运行 NodeObservability
CR 时,它会创建所需的机器配置和机器配置池 CR,以便在与 nodeSelector
匹配的 worker 节点上启用 CRI-O 分析。
如果 worker 节点上没有启用 CRI-O 分析,则会创建 NodeObservabilityMachineConfig
资源。与 NodeObservability
CR 中指定的 nodeSelector
匹配的 worker 节点。这可能需要 10 分钟或更长时间来完成。
kubelet 分析被默认启用。
节点的 CRI-O unix 套接字挂载在代理 pod 上,允许代理与 CRI-O 通信来运行 pprof 请求。同样,kubelet-serving-ca
证书链被挂载到代理 pod 上,允许在代理和节点的 kubelet 端点之间进行安全通信。
先决条件
- 已安装 Node Observability Operator。
- 已安装 OpenShift CLI(oc)。
-
您可以使用
cluster-admin
权限访问集群。
流程
运行以下命令登录到 OpenShift Container Platform CLI:
$ oc login -u kubeadmin https://<HOSTNAME>:6443
运行以下命令切换回
node-observability-operator
命名空间:$ oc project node-observability-operator
创建名为
nodeobservability.yaml
的 CR 文件,其中包含以下文本:apiVersion: nodeobservability.olm.openshift.io/v1alpha2 kind: NodeObservability metadata: name: cluster 1 spec: nodeSelector: kubernetes.io/hostname: <node_hostname> 2 type: crio-kubelet
运行
NodeObservability
CR:oc apply -f nodeobservability.yaml
输出示例
nodeobservability.olm.openshift.io/cluster created
运行以下命令,检查
NodeObservability
CR 的状态:$ oc get nob/cluster -o yaml | yq '.status.conditions'
输出示例
conditions: conditions: - lastTransitionTime: "2022-07-05T07:33:54Z" message: 'DaemonSet node-observability-ds ready: true NodeObservabilityMachineConfig ready: true' reason: Ready status: "True" type: Ready
当原因为
Ready
且状态为True
时,NodeObservability
CR 运行已完成。
16.4. 运行性能分析查询
要运行性能分析查询,您必须创建一个 NodeObservabilityRun
资源。分析查询是一个阻止操作,用于在 30 秒内获取 CRI-O 和 Kubelet 分析数据。分析查询完成后,您必须检索容器文件系统 /run/node-observability
目录中的性能分析数据。数据生命周期通过 emptyDir
卷绑定到代理 pod,因此您可以在代理 pod 处于 running
状态时访问性能分析数据。
您可以在任何时间点上请求一个性能分析查询。
先决条件
- 已安装 Node Observability Operator。
-
您已创建了
NodeObservability
自定义资源(CR)。 -
您可以使用
cluster-admin
权限访问集群。
流程
创建名为
nodeobservabilityrun.yaml
的NodeObservabilityRun
资源文件,其中包含以下文本:apiVersion: nodeobservability.olm.openshift.io/v1alpha2 kind: NodeObservabilityRun metadata: name: nodeobservabilityrun spec: nodeObservabilityRef: name: cluster
运行
NodeObservabilityRun
资源来触发性能分析查询:$ oc apply -f nodeobservabilityrun.yaml
运行以下命令,检查
NodeObservabilityRun
的状态:$ oc get nodeobservabilityrun nodeobservabilityrun -o yaml | yq '.status.conditions'
输出示例
conditions: - lastTransitionTime: "2022-07-07T14:57:34Z" message: Ready to start profiling reason: Ready status: "True" type: Ready - lastTransitionTime: "2022-07-07T14:58:10Z" message: Profiling query done reason: Finished status: "True" type: Finished
分析查询在状态变为
True
后完成,类型为Finished
。通过运行以下 bash 脚本,从容器的
/run/node-observability
路径中检索配置集数据:for a in $(oc get nodeobservabilityrun nodeobservabilityrun -o yaml | yq .status.agents[].name); do echo "agent ${a}" mkdir -p "/tmp/${a}" for p in $(oc exec "${a}" -c node-observability-agent -- bash -c "ls /run/node-observability/*.pprof"); do f="$(basename ${p})" echo "copying ${f} to /tmp/${a}/${f}" oc exec "${a}" -c node-observability-agent -- cat "${p}" > "/tmp/${a}/${f}" done done
第 17 章 处于边缘网络的集群
17.1. 网络边缘的挑战
在地理位置管理多个站点时,边缘计算带来了复杂的挑战。使用 ZTP 和 GitOps 在网络边缘置备和管理站点。
17.1.1. 克服网络边缘的挑战
今天,服务提供商希望在网络边缘部署其基础架构。这带来了显著的挑战:
- 您怎样处理并行部署多个边缘站点的部署?
- 当您需要在断开连接的环境中部署站点时,会出现什么情况?
- 如何管理集群的生命周期?
零接触置备(ZTP)和 GitOps 通过允许您为裸机设备使用声明站点定义和配置来大规模置备远程边缘站点。模板或覆盖配置安装 CNF 工作负载所需的 OpenShift Container Platform 功能。安装和升级的完整生命周期通过 ZTP 管道处理。
ZTP 将 GitOps 用于基础架构部署。使用 GitOps,您可以使用声明 YAML 文件和其他存储在 Git 存储库中的其他定义模式。Red Hat Advanced Cluster Management (RHACM)使用 Git 存储库来驱动基础架构部署。
GitOps 提供可追溯性、基于角色的访问控制 (RBAC),以及每个站点的所需状态的单一数据源。Git 方法可通过 webhook 解决可扩展性问题,以及事件驱动的操作。
您可以通过创建 ZTP 管道提供的声明性站点定义和配置自定义资源 (CR) 来启动 ZTP 工作流。
下图显示了 ZTP 如何在最边缘框架内工作。
17.1.2. 使用 ZTP 在网络边缘置备集群
Red Hat Advanced Cluster Management (RHACM)在 hub 和 spoke 架构中管理集群,其中单个 hub 集群管理多个 spoke 集群。运行 RHACM 的 hub 集群使用零接触置备 (ZTP) 和安装 RHACM 时部署的辅助服务来置备和部署受管集群。
协助的服务处理在单一节点集群、三节点集群或裸机上运行的标准集群上 OpenShift Container Platform 置备。
使用 ZTP 的高级别概述来置备和维护使用 OpenShift Container Platform 的裸机主机,如下所示:
- 运行 RHACM 的 hub 集群管理一个 OpenShift 镜像 registry,用于镜像 OpenShift Container Platform 发行镜像。RHACM 使用 OpenShift 镜像 registry 来置备受管集群。
- 您以 YAML 格式清单文件管理裸机主机,并在 Git 存储库中版本。
- 您可以使主机准备好作为受管集群置备,并使用 RHACM 和辅助服务在站点上安装裸机主机。
安装和部署集群分为两个阶段,涉及初始安装阶段和后续配置阶段。下图演示了这个工作流:
17.1.3. 使用 SiteConfig 资源和 RHACM 安装受管集群
GitOps ZTP 使用 Git 存储库中的 SiteConfig
自定义资源 (CR) 来管理安装 OpenShift Container Platform 集群的进程。SiteConfig
CR 包含安装所需的特定于集群的参数。它有在安装过程中应用所选配置 CR 的选项,包括用户定义的额外清单。
ZTP GitOps 插件处理 SiteConfig
CR,以便在 hub 集群上生成 CR 集合。这会在 Red Hat Advanced Cluster Management (RHACM) 中触发辅助服务,以便在裸机主机上安装 OpenShift Container Platform。您可以在 hub 集群上的这些 CR 中找到安装状态和错误消息。
您可以手动置备单个集群,或使用 ZTP 批量置备单个集群:
- 置备单个集群
-
为集群创建单一
SiteConfig
CR 及相关的安装和配置 CR,并在 hub 集群中应用它们以开始集群置备。这是在大规模部署前测试 CR 的好方法。 - 置备多个集群
-
通过在 Git 仓库中定义
SiteConfig
和相关 CR,以最多 400 的批处理中安装受管集群。ArgoCD 使用SiteConfig
CR 来部署站点。RHACM 策略生成器创建清单,并将其应用到 hub 集群。这将启动集群置备过程。
17.1.4. 使用策略和 PolicyGenTemplate 资源配置受管集群
ZTP 使用 Red Hat Advanced Cluster Management (RHACM) 使用基于策略的监管方法应用配置配置。
策略生成器或 PolicyGen
是 GitOps 操作器的一个插件,它允许从简洁的模板创建 RHACM 策略。该工具可将多个 CR 合并为一个策略,您可以生成多个策略应用到团队中集群的不同子集的策略。
为了扩展并降低跨集群管理配置的复杂性,请尽可能使用配置 CR。
- 在可能的情况下,使用机范围的通用策略应用配置 CR。
- 下一个首选项是创建集群的逻辑分组,以在组策略下尽可能管理剩余的配置。
- 当配置对单个站点是唯一的时,请使用 hub 集群上的 RHACM 模板将特定于站点的数据注入通用或组策略。或者,为站点应用单个站点策略。
下图显示了在集群部署配置阶段策略生成器如何与 GitOps 和 RHACM 交互。
对于大型集群群,在配置这些集群时通常具有高级别的一致性。
以下推荐的策略结构组合了配置 CR,以满足几个目标:
- 描述一次通用配置,并应用到所有系统。
- 最小化维护和管理策略的数量。
- 支持集群变体的通用配置的灵活性。
策略类别 | 描述 |
---|---|
Common |
一个存在于 common 类别中的策略被应用到该团队中的所有集群。使用通用 |
组 |
组类别中存在的策略应用到一组集群。使用组 |
Sites | 站点类别中存在的策略应用到特定的集群站点。任何集群都可以维护自己的特定策略。 |
其他资源
-
有关从
ztp-site-generate
容器镜像中提取参考SiteConfig
和PolicyGenTemplate
CR 的更多信息,请参阅准备 ZTP Git 存储库。
17.2. 为 ZTP 准备 hub 集群
要在断开连接的环境中使用 RHACM,请创建一个镜像 registry,镜像 OpenShift Container Platform 发行镜像和包含所需 Operator 镜像的 Operator Lifecycle Manager (OLM) 目录。OLM 在集群中管理、安装和升级 Operator 及其依赖项。您还可以使用断开连接的镜像主机来提供用于置备裸机主机的 RHCOS ISO 和 RootFS 磁盘镜像。
17.2.1. 满足 Telco RAN 4.12 的解决方案软件版本
Red Hat Telco Radio Access Network (RAN) 版本 4.12 解决方案已使用以下红帽软件产品进行验证。
产品 | 软件版本 |
---|---|
hub 集群 OpenShift Container Platform 版本 | 4.12 |
GitOps ZTP 插件 | 4.10、4.11 或 4.12 |
Red Hat Advanced Cluster Management (RHACM) | 2.6, 2.7 |
Red Hat OpenShift GitOps | 1.9, 1.10 |
Topology Aware Lifecycle Manager (TALM) | 4.10、4.11 或 4.12 |
17.2.2. 在断开连接的环境中安装 GitOps ZTP
在断开连接的环境中,使用 Red Hat Advanced Cluster Management (RHACM)、Red Hat OpenShift GitOps 和 Topology Aware Lifecycle Manager (TALM) 来管理多个受管集群的部署。
先决条件
-
已安装 OpenShift Container Platform CLI (
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 您已配置了断开连接的镜像 registry 以在集群中使用。
注意您创建的断开连接的镜像 registry 必须包含 TALM backup 和 pre-cache 镜像的版本,该镜像与 hub 集群中运行的 TALM 版本匹配。spoke 集群必须能够在断开连接的镜像 registry 中解析这些镜像。
流程
- 在 hub 集群上安装 RHACM。请参阅在断开连接的环境中安装 RHACM。
- 在 hub 集群中安装 GitOps 和 TALM。
17.2.3. 在断开连接的镜像主机中添加 RHCOS ISO 和 RootFS 镜像
在使用 Red Hat Advanced Cluster Management (RHACM) 在断开连接的环境中安装集群前,您必须首先托管 Red Hat Enterprise Linux CoreOS (RHCOS) 镜像供其使用。使用断开连接的镜像来托管 RHCOS 镜像。
先决条件
- 部署和配置 HTTP 服务器以托管网络上的 RHCOS 镜像资源。您必须能够从计算机以及您创建的机器访问 HTTP 服务器。
RHCOS 镜像可能不会随着 OpenShift Container Platform 的每个发行版本而改变。您必须下载最高版本的镜像,其版本号应小于或等于您安装的版本。如果可用,请使用与 OpenShift Container Platform 版本匹配的镜像版本。您需要 ISO 和 RootFS 镜像在主机上安装 RHCOS。此安装类型不支持 RHCOS QCOW2 镜像。
流程
- 登录到镜像主机。
从 mirror.openshift.com 获取 RHCOS ISO 和 RootFS 镜像,例如:
将所需的镜像名称和 OpenShift Container Platform 版本导出为环境变量:
$ export ISO_IMAGE_NAME=<iso_image_name> 1
$ export ROOTFS_IMAGE_NAME=<rootfs_image_name> 1
$ export OCP_VERSION=<ocp_version> 1
下载所需的镜像:
$ sudo wget https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.12/${OCP_VERSION}/${ISO_IMAGE_NAME} -O /var/www/html/${ISO_IMAGE_NAME}
$ sudo wget https://mirror.openshift.com/pub/openshift-v4/dependencies/rhcos/4.12/${OCP_VERSION}/${ROOTFS_IMAGE_NAME} -O /var/www/html/${ROOTFS_IMAGE_NAME}
验证步骤
验证下载的镜像是否成功,并在断开连接的镜像主机上提供,例如:
$ wget http://$(hostname)/${ISO_IMAGE_NAME}
输出示例
Saving to: rhcos-4.12.1-x86_64-live.x86_64.iso rhcos-4.12.1-x86_64-live.x86_64.iso- 11%[====> ] 10.01M 4.71MB/s
17.2.4. 启用辅助服务
Red Hat Advanced Cluster Management (RHACM)使用辅助服务来部署 OpenShift Container Platform 集群。当您在 Red Hat Advanced Cluster Management (RHACM)上启用 MultiClusterHub Operator 时,辅助服务会自动部署。之后,您需要配置 Provisioning
资源以监视所有命名空间,并更新 AgentServiceConfig
自定义资源(CR)以引用托管在镜像 registry HTTP 服务器上的 ISO 和 RootFS 镜像。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 - 启用了 MultiClusterHub 的 RHACM。
流程
-
启用
Provisioning
资源,以监视所有命名空间并为断开连接的环境配置镜像。如需更多信息,请参阅启用中央基础架构管理服务。 运行以下命令来更新
AgentServiceConfig
CR:$ oc edit AgentServiceConfig
在 CR 的
items.spec.osImages
字段中添加以下条目:- cpuArchitecture: x86_64 openshiftVersion: "4.12" rootFSUrl: https://<host>/<path>/rhcos-live-rootfs.x86_64.img url: https://<mirror-registry>/<path>/rhcos-live.x86_64.iso
其中:
- <host>
- 是目标镜像 registry HTTP 服务器的完全限定域名 (FQDN)。
- <path>
- 是目标镜像 registry 上镜像的路径。
保存并退出编辑器以应用更改。
17.2.5. 将 hub 集群配置为使用断开连接的镜像 registry
您可以将 hub 集群配置为使用断开连接的镜像 registry 作为断开连接的环境。
先决条件
- 已安装 Red Hat Advanced Cluster Management (RHACM) 2.7 的断开连接的 hub 集群安装。
-
您已在 HTTP 服务器中托管
rootfs
和iso
镜像。有关 Mirroring the OpenShift Container Platform image repository 的信息,请参阅附加资源部分。
如果为 HTTP 服务器启用 TLS,您必须确认 root 证书由客户端信任的颁发机构签名,并验证 OpenShift Container Platform hub 和受管集群和 HTTP 服务器之间的可信证书链。使用配置了不受信任的证书的服务器可防止将镜像下载到创建镜像中。不支持使用不受信任的 HTTPS 服务器。
流程
创建包含镜像 registry 配置的
ConfigMap
:apiVersion: v1 kind: ConfigMap metadata: name: assisted-installer-mirror-config namespace: multicluster-engine 1 labels: app: assisted-service data: ca-bundle.crt: <certificate> 2 registries.conf: | 3 unqualified-search-registries = ["registry.access.redhat.com", "docker.io"] [[registry]] location = <mirror_registry_url> 4 insecure = false mirror-by-digest-only = true
- 1
ConfigMap
命名空间必须设置为multicluster-engine
。- 2
- 创建镜像 registry 时使用的镜像 registry 证书。
- 3
- 镜像 registry 的配置文件。镜像 registry 配置将镜像信息添加到 Discovery 镜像中的
/etc/containers/registries.conf
中。在传递给安装程序时,镜像信息存储在install-config.yaml
文件的imageContentSources
部分中。在 HUB 集群中运行的 Assisted Service pod 从配置的镜像 registry 中获取容器镜像。 - 4
- 镜像 registry 的 URL。在配置镜像 registry 时,您必须运行
oc adm release mirror
命令使用imageContentSources
部分中的 URL。如需更多信息,请参阅 Mirroring the OpenShift Container Platform image repository 部分。
这会更新
AgentServiceConfig
自定义资源中的mirrorRegistryRef
,如下所示:输出示例
apiVersion: agent-install.openshift.io/v1beta1 kind: AgentServiceConfig metadata: name: agent namespace: multicluster-engine 1 spec: databaseStorage: volumeName: <db_pv_name> accessModes: - ReadWriteOnce resources: requests: storage: <db_storage_size> filesystemStorage: volumeName: <fs_pv_name> accessModes: - ReadWriteOnce resources: requests: storage: <fs_storage_size> mirrorRegistryRef: name: assisted-installer-mirror-config 2 osImages: - openshiftVersion: <ocp_version> url: <iso_url> 3
集群安装过程中需要一个有效的 NTP 服务器。确保有合适的 NTP 服务器可用,并可通过断开连接的网络从安装的系统访问。
17.2.6. 将 hub 集群配置为使用未经身份验证的 registry
您可以将 hub 集群配置为使用未经身份验证的 registry。未经身份验证的 registry 不需要进行身份验证才能访问和下载镜像。
先决条件
- 您已在 hub 集群上安装并配置了 hub 集群,并安装了 Red Hat Advanced Cluster Management (RHACM)。
- 已安装 OpenShift Container Platform CLI (oc)。
-
您已以具有
cluster-admin
权限的用户身份登录。 - 已配置了一个未经身份验证的 registry 以用于 hub 集群。
流程
运行以下命令来更新
AgentServiceConfig
自定义资源 (CR):$ oc edit AgentServiceConfig agent
在 CR 中添加
unauthenticatedRegistries
字段:apiVersion: agent-install.openshift.io/v1beta1 kind: AgentServiceConfig metadata: name: agent spec: unauthenticatedRegistries: - example.registry.com - example.registry2.com ...
未经身份验证的 registry 在
AgentServiceConfig
资源的spec.unauthenticatedRegistries
下列出。任何此列表中的 registry 都不需要在用于 spoke 集群安装的 pull secret 中有一个条目。assisted-service
通过确保包含用于安装的每个镜像 registry 的身份验证信息来验证 pull secret。
镜像 registry 会自动添加到 ignore 列表中,不需要在 spec.unauthenticatedRegistries
下添加。在 ConfigMap
中指定 PUBLIC_CONTAINER_REGISTRIES
环境变量会用指定的值覆盖默认值。PUBLIC_CONTAINER_REGISTRIES
默认值是 quay.io 和 registry.svc.ci.openshift.org。
验证
运行以下命令,验证您可以从 hub 集群访问新添加的 registry:
在 hub 集群中打开一个 debug shell 提示符:
$ oc debug node/<node_name>
运行以下命令测试对未经身份验证的 registry 的访问:
sh-4.4# podman login -u kubeadmin -p $(oc whoami -t) <unauthenticated_registry>
其中:
- <unauthenticated_registry>
-
新的 registry,如
unauthenticated-image-registry.openshift-image-registry.svc:5000
。
输出示例
Login Succeeded!
17.2.7. 使用 ArgoCD 配置 hub 集群
您可以使用一组 ArgoCD 应用程序来配置 hub 集群,每个站点使用 GitOps 零接触置备 (ZTP) 生成所需的安装和策略自定义资源(CR)。
Red Hat Advanced Cluster Management (RHACM) 使用 SiteConfig
CR 为 ArgoCD 生成第 1 天受管集群安装 CR。每个 ArgoCD 应用程序都可以管理最多 300 个 SiteConfig
CR。
先决条件
- 已安装 Red Hat Advanced Cluster Management (RHACM) 和 Red Hat OpenShift GitOps 的 OpenShift Container Platform hub 集群。
-
您已从 ZTP GitOps 插件容器中提取了引用部署,如 "Preparing the GitOps ZTP site configuration repository" 部分所述。提取引用部署会创建以下流程中引用的
out/argocd/deployment
目录。
流程
准备 ArgoCD 管道配置:
- 创建 Git 存储库,其目录结构类似于 example 目录。如需更多信息,请参阅"准备 GitOps ZTP 站点配置存储库"。
使用 ArgoCD UI 配置对存储库的访问。在 Settings 下配置以下内容:
-
Repositories - 添加连接信息。URL 必须以
.git
结尾,例如https://repo.example.com/repo.git
和凭证。 - 证书 - 如果需要,为存储库添加公共证书。
-
Repositories - 添加连接信息。URL 必须以
根据您的 Git 仓库修改两个 ArgoCD 应用程序,
out/argocd/deployment/clusters-app.yaml
和out/argocd/deployment/policies-app.yaml
:-
更新 URL 以指向 Git 存储库。URL 以
.git
结尾,例如https://repo.example.com/repo.git
。 -
targetRevision
表示要监控的 Git 存储库分支。 -
path
指定到SiteConfig
和PolicyGenTemplate
CR 的路径。
-
更新 URL 以指向 Git 存储库。URL 以
要安装 ZTP GitOps 插件,您必须使用之前提取到
out/argocd/deployment/
目录中的补丁文件来修补 hub 集群中的 ArgoCD 实例。运行以下命令:$ oc patch argocd openshift-gitops \ -n openshift-gitops --type=merge \ --patch-file out/argocd/deployment/argocd-openshift-gitops-patch.json
注意对于断开连接的环境,使用本地 registry 中镜像的
ztp-site-generate
镜像,修改out/argocd/deployment/argocd-openshift-gitops-patch.json
文件。运行以下命令:$ oc patch argocd openshift-gitops -n openshift-gitops --type='json' \ -p='[{"op": "replace", "path": "/spec/repo/initContainers/0/image", \ "value": "<local_registry>/<ztp_site_generate_image_ref>"}]'
其中:
- <local_registry>
-
是断开连接的 registry 的 URL,例如
my.local.registry:5000
- <ztp-site-generate-image-ref>
-
是本地 registry 中镜像
ztp-site-generate
镜像的路径,如openshift4-ztp-site-generate:custom
。
在 RHACM 2.7 及更高版本中,多集群引擎默认启用
cluster-proxy-addon
功能。要禁用此功能,请应用以下补丁来禁用并删除负责此附加组件的相关 hub 集群和受管集群 pod。$ oc patch multiclusterengines.multicluster.openshift.io multiclusterengine --type=merge --patch-file out/argocd/deployment/disable-cluster-proxy-addon.json
使用以下命令将管道配置应用到 hub 集群:
$ oc apply -k out/argocd/deployment
17.2.8. 准备 GitOps ZTP 站点配置存储库
在使用 ZTP GitOps 管道前,您需要准备 Git 存储库来托管站点配置数据。
先决条件
- 已配置了 hub 集群 GitOps 应用程序来生成所需的安装和策略自定义资源 (CR)。
- 您已使用 ZTP 部署受管集群。
流程
-
使用
SiteConfig
和PolicyGenTemplate
CR 的单独路径创建一个目录结构。 使用以下命令,从
ztp-site-generate
容器镜像导出argocd
目录:$ podman pull registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12
$ mkdir -p ./out
$ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12 extract /home/ztp --tar | tar x -C ./out
检查
out
目录是否包含以下子目录:-
out/extra-manifest
包含SiteConfig
用来生成额外清单configMap
的源 CR 文件。 -
out/source-crs
包含PolicyGenTemplate
用来生成 Red Hat Advanced Cluster Management(RHACM)策略的源 CR 文件。 -
out/argocd/deployment
包含补丁和 YAML 文件,可在 hub 集群中应用,以便在此过程的下一步中使用。 -
out/argocd/example
包含代表推荐的配置的siteConfig
和PolicyGenTemplate
文件的示例。
-
out/argocd/example
下的目录结构充当 Git 存储库结构和内容的参考。示例包括用于单节点、三节点和标准集群的 SiteConfig
和 PolicyGenTemplate
引用 CR。删除您对未使用集群类型的引用。以下示例描述了单节点集群网络的一组 CR:
example ├── policygentemplates │ ├── common-ranGen.yaml │ ├── example-sno-site.yaml │ ├── group-du-sno-ranGen.yaml │ ├── group-du-sno-validator-ranGen.yaml │ ├── kustomization.yaml │ └── ns.yaml └── siteconfig ├── example-sno.yaml ├── KlusterletAddonConfigOverride.yaml └── kustomization.yaml
在单独的目录中,保持 SiteConfig
和 PolicyGenTemplate
CR。SiteConfig
和 PolicyGenTemplate
目录必须包含一个 kustomization.yaml
文件,该文件明确包含该目录中的文件。
此目录结构以及 kustomization.yaml
文件必须提交并推送到 Git 存储库。初始推送到 Git 的推送应包含 kustomization.yaml
文件。在部署站点时,可以忽略 SiteConfig
(example-sno.yaml
) 和 PolicyGenTemplate
(common-ranGen.yaml
, group-du-sno*.yaml
, and example-sno-site.yaml
) 文件,并在以后需要时在推送它们。
只有在提交并推送到 Git 的一个或多个 SiteConfig
CR 时,才需要 KlusterletAddonConfigOverride.yaml
文件。如需有关如何使用的示例,请参阅 example-sno.yaml
。
17.3. 使用 RHACM 和 SiteConfig 资源安装受管集群
您可以使用辅助服务以及启用了 core-reduction 技术的 GitOps 插件策略生成器,以扩展 Red Hat Advanced Cluster Management (RHACM) 来大规模置备 OpenShift Container Platform 集群。ZTP 管道执行集群安装。ZTP 可以在断开连接的环境中使用。
17.3.1. GitOps ZTP 和 Topology Aware Lifecycle Manager
GitOps 零涉及置备(ZTP)从存储在 Git 中的清单生成安装和配置 CR。这些工件应用到一个中央化的 hub 集群,其中 Red Hat Advanced Cluster Management (RHACM)、辅助服务和 Topology Aware Lifecycle Manager (TALM) 使用 CR 来安装和配置受管集群。ZTP 管道的配置阶段使用 TALM 将配置 CR 的应用程序编排到集群。GitOps ZTP 和 TALM 之间有几个关键集成点。
- 通知策略
-
默认情况下,GitOps ZTP 创建所有带有
inform
的补救操作的策略。这些策略会导致 RHACM 报告与策略相关的集群合规性状态,但不会应用所需的配置。在 ZTP 过程中,在 OpenShift 安装后,TALM 步骤通过创建的inform
策略,并在目标受管集群中强制实施它们。这会将配置应用到受管集群。在集群生命周期的 ZTP 阶段之外,这允许您在不立即将这些更改部署到受影响的受管集群的情况下更改策略。您可以使用 TALM 控制时间和修复的集群集合。 - 自动创建 ClusterGroupUpgrade CR
要自动执行新部署的集群的初始配置,TALM 会监控 hub 集群上所有
ManagedCluster
CR 的状态。任何未应用ztp-done
标签的ManagedCluster
CR,包括新创建的ManagedCluster
CR,会导致 TALM 自动创建一个具有以下特征的ClusterGroupUpgrade
CR:-
在
ztp-install
命名空间中创建并启用ClusterGroupUpgrade
CR。 -
ClusterGroupUpgrade
CR 的名称与ManagedCluster
CR 的名称相同。 -
集群选择器仅包括与该
ManagedCluster
CR 关联的集群。 -
受管策略集合包含 RHACM 在
ClusterGroupUpgrade
创建时绑定到集群的所有策略。 - 禁用预缓存。
- 超时设置为 4 小时(240 分钟)。
启用的
ClusterGroupUpgrade
的自动创建可确保初始零接触集群部署继续进行,而无需用户干预。另外,对任何没有ztp-done
标签的ManagedCluster
自动创建一个ClusterGroupUpgrade
CR,会允许失败的 ZTP 安装重新启动(删除集群的ClusterGroupUpgrade
CR)。-
在
- Waves
从
PolicyGenTemplate
CR 生成的每个策略都包含一个ztp-deploy-wave
注解。此注解基于来自每个 CR 的同一注解,该注解包含在该策略中。wave 注解用于对自动生成的ClusterGroupUpgrade
CR 中的策略进行排序。wave 注解没有用于自动生成的ClusterGroupUpgrade
CR。注意同一策略中的所有 CR 都必须具有
ztp-deploy-wave
注解的设置。在PolicyGenTemplate
中,每个 CR 的此注解的默认值可以被覆盖。源 CR 中的 wave 注解用来决定和设置策略 wave 注解。此注解已从每个构建 CR 中删除,该 CR 在运行时包含在生成的策略中。TALM 按照 wave 注解指定的顺序应用配置策略。在移至下一个策略前,TALM 会等待每个策略兼容。确保每个 CR 的 wave 注解考虑要应用到集群的任何 CR 的先决条件。例如,必须在 Operator 配置之前或同时安装 Operator。同样,Operator 的
CatalogSource
必须在 Operator Subscription 之前或同时安装 wave。每个 CR 的默认 wave 值会考虑这些先决条件。多个 CR 和策略可以共享相同的 wave 编号。拥有较少的策略可缩短部署速度并降低 CPU 用量。将多个 CR 分组到相对较少的waves 是最佳实践方案。
要检查每个源 CR 中的默认 wave 值,请针对从 ztp-site-generate
容器镜像中提取的 out/source-crs
目录运行以下命令:
$ grep -r "ztp-deploy-wave" out/source-crs
- 阶段标签
ClusterGroupUpgrade
CR 会被自动创建,并包含在 ZTP 进程开始和结尾使用标签为ManagedCluster
CR 的说明。当 ZTP 配置安装后启动时,
ManagedCluster
会应用ztp-running
标签。当所有策略都修复至集群并完全合规时,这些指令会导致 TALM 删除ztp-running
标签并应用ztp-done
标签。对于使用
informDuValidator
策略的部署,当集群完全准备好部署应用程序时,会应用ztp-done
标签。这包括 ZTP 应用的配置 CR 的所有协调并产生影响。ztp-done
标签会影响 TALM 创建自动ClusterGroupUpgrade
CR。不要在集群初始 ZTP 安装后操作此标签。- 链接的 CR
-
自动创建的
ClusterGroupUpgrade
CR 将所有者引用设置为派生于ManagedCluster
的 ManagedCluster。此引用可确保删除ManagedCluster
CR 会导致ClusterGroupUpgrade
的实例以及任何支持的资源被删除。
17.3.2. 使用 ZTP 部署受管集群概述
Red Hat Advanced Cluster Management(RHACM)利用零接触置备(ZTP)来部署单节点 OpenShift Container Platform 集群、三节点集群和标准集群。您可以在 Git 存储库中将站点配置数据作为 OpenShift Container Platform 自定义资源 (CR) 进行管理。ZTP 使用声明性 GitOps 方法进行开发一次,部署任意位置模型来部署受管集群。
集群部署包括:
- 在空白服务器上安装主机操作系统 (RHCOS)
- 部署 OpenShift Container Platform
- 创建集群策略和站点订阅
- 为服务器操作系统进行必要的网络配置
- 部署配置集 Operator 并执行任何所需的软件相关配置,如性能配置集、PTP 和 SR-IOV
受管站点安装过程概述
在 hub 集群中应用受管站点自定义资源 (CR) 后,会自动执行以下操作:
- 在目标主机上生成并启动发现镜像 ISO 文件。
- 当 ISO 文件成功在目标主机上引导时,它会将主机硬件信息报告给 RHACM。
- 在所有主机被发现后,会安装 OpenShift Container Platform。
-
当 OpenShift Container Platform 完成安装后,hub 在目标集群上安装
klusterlet
服务。 - 请求的附加组件服务安装在目标集群中。
当在 hub 集群上创建受管集群的 Agent
CR 时,发现镜像 ISO 过程已完成。
目标裸机主机必须满足 vDU 应用程序工作负载的推荐单节点 OpenShift 集群配置中列出的网络、固件和硬件要求。
17.3.3. 创建受管裸机主机 secret
将受管裸机主机所需的 Secret
自定义资源 (CR) 添加到 hub 集群。您需要 ZTP 管道的 secret 来访问 Baseboard Management Controller (BMC) 和支持的安装程序服务的 secret,以便从 registry 中拉取集群安装镜像。
secret 按名称从 SiteConfig
CR 引用。命名空间必须与 SiteConfig
命名空间匹配。
流程
创建一个 YAML secret 文件,其中包含主机 Baseboard Management Controller (BMC) 和安装 OpenShift 和所有附加组件集群 Operator 所需的凭证:
将以下 YAML 保存为文件
example-sno-secret.yaml
:apiVersion: v1 kind: Secret metadata: name: example-sno-bmc-secret namespace: example-sno 1 data: 2 password: <base64_password> username: <base64_username> type: Opaque --- apiVersion: v1 kind: Secret metadata: name: pull-secret namespace: example-sno 3 data: .dockerconfigjson: <pull_secret> 4 type: kubernetes.io/dockerconfigjson
-
将到
example-sno-secret.yaml
的相对路径添加用于安装集群的kustomization.yaml
文件中。
17.3.4. 使用 GitOps ZTP 为安装配置 Discovery ISO 内核参数
GitOps ZTP 工作流使用 Discovery ISO 作为托管裸机主机的 OpenShift Container Platform 安装过程的一部分。您可以编辑 InfraEnv
资源来为 Discovery ISO 指定内核参数。这对具有特定环境要求的集群安装非常有用。例如,为发现 ISO 配置 rd.net.timeout.carrier
内核参数以促进集群的静态网络,或者在在安装过程中下载根文件系统前接收 DHCP 地址。
在 OpenShift Container Platform 4.12 中,您只能添加内核参数。您不能替换或删除内核参数。
先决条件
- 已安装 OpenShift CLI(oc)。
- 已以具有 cluster-admin 权限的用户身份登录到 hub 集群。
流程
创建
InfraEnv
CR,并编辑spec.kernelArguments
规格以配置内核参数。将以下 YAML 保存到
InfraEnv-example.yaml
文件中:注意本例中的
InfraEnv
CR 使用模板语法,如{{ .Cluster.ClusterName }}
,它根据SiteConfig
CR 中的值进行填充。SiteConfig
CR 在部署过程中自动填充这些模板的值。不要手动编辑模板。apiVersion: agent-install.openshift.io/v1beta1 kind: InfraEnv metadata: annotations: argocd.argoproj.io/sync-wave: "1" name: "{{ .Cluster.ClusterName }}" namespace: "{{ .Cluster.ClusterName }}" spec: clusterRef: name: "{{ .Cluster.ClusterName }}" namespace: "{{ .Cluster.ClusterName }}" kernelArguments: - operation: append 1 value: audit=0 2 - operation: append value: trace=1 sshAuthorizedKey: "{{ .Site.SshPublicKey }}" proxy: "{{ .Cluster.ProxySettings }}" pullSecretRef: name: "{{ .Site.PullSecretRef.Name }}" ignitionConfigOverride: "{{ .Cluster.IgnitionConfigOverride }}" nmStateConfigLabelSelector: matchLabels: nmstate-label: "{{ .Cluster.ClusterName }}" additionalNTPSources: "{{ .Cluster.AdditionalNTPSources }}"
将
InfraEnv-example.yaml
CR 提交到 Git 存储库中具有SiteConfig
CR 并推送您的更改的相同位置。以下示例显示了 Git 存储库结构示例:~/example-ztp/install └── site-install ├── siteconfig-example.yaml ├── InfraEnv-example.yaml ...
编辑
SiteConfig
CR 中的spec.clusters.crTemplates
规格来引用 Git 存储库中的InfraEnv-example.yaml
CR:clusters: crTemplates: InfraEnv: "InfraEnv-example.yaml"
当您准备好通过提交和推送
SiteConfig
CR 来部署集群时,构建管道会使用 Git 存储库中的自定义InfraEnv-example
CR 来配置基础架构环境,包括自定义内核参数。
验证
要验证是否应用了内核参数,在 Discovery 镜像验证 OpenShift Container Platform 是否准备好安装后,您可以在安装过程开始前通过 SSH 连接到目标主机。此时,您可以在 /proc/cmdline
文件中查看发现 ISO 的内核参数。
使用目标主机开始 SSH 会话:
$ ssh -i /path/to/privatekey core@<host_name>
使用以下命令查看系统的内核参数:
$ cat /proc/cmdline
17.3.5. 使用 SiteConfig 和 ZTP 部署受管集群
使用以下步骤创建 SiteConfig
自定义资源 (CR) 和相关文件,并启动零接触置备 (ZTP) 集群部署。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 - 配置了 hub 集群来生成所需的安装和策略 CR。
您创建了 Git 存储库,用于管理自定义站点配置数据。存储库必须可从 hub 集群访问,且必须将其配置为 ArgoCD 应用程序的源存储库。如需更多信息,请参阅"准备 GitOps ZTP 站点配置存储库"。
注意在创建源存储库时,请确保使用从
ztp-site-generate
容器中提取的argocd/deployment/argocd-openshift-gitops-patch.json
patch-file 来修补 ArgoCD 应用程序。请参阅"使用 ArgoCD 配置 hub 集群"。要准备好置备受管集群,每个裸机主机都需要以下内容:
- 网络连接
- 您的网络需要 DNS。受管集群主机应该可从 hub 集群访问。确保 hub 集群和受管集群主机之间存在第 3 层连接。
- Baseboard Management Controller (BMC) 详情
-
ZTP 使用 BMC 用户名和密码详情来在集群安装过程中连接到 BMC。GitOps ZTP 插件根据站点 Git 仓库中的
SiteConfig
CR 管理 hub 集群上的ManagedCluster
CR。您可以手动为每个主机创建单独的BMCSecret
CR。
流程
在 hub 集群中创建所需的受管集群 secret。这些资源必须位于名称与集群名称匹配的命名空间中。例如,在
out/argocd/example/siteconfig/example-sno.yaml
中,集群名称和命名空间是example-sno
。运行以下命令来导出集群命名空间:
$ export CLUSTERNS=example-sno
创建命名空间:
$ oc create namespace $CLUSTERNS
为受管集群创建 pull secret 和 BMC
Secret
CR。pull secret 必须包含安装 OpenShift Container Platform 和其他需要安装的 Operator 所需的所有凭证。如需更多信息,请参阅"创建受管裸机主机 secret"。注意secret 根据名称从
SiteConfig
自定义资源 (CR) 引用。命名空间必须与SiteConfig
命名空间匹配。在 Git 存储库本地克隆中为集群创建一个
SiteConfig
CR:从
out/argocd/example/siteconfig/
文件夹中选择适合您的 CR 示例。文件夹中包含单一节点、三节点和标准集群的示例文件:-
example-sno.yaml
-
example-3node.yaml
-
example-standard.yaml
-
更改示例文件中的集群和主机详情,以匹配您想要的集群类型。例如:
单节点 OpenShift 集群 SiteConfig CR 示例
apiVersion: ran.openshift.io/v1 kind: SiteConfig metadata: name: "<site_name>" namespace: "<site_name>" spec: baseDomain: "example.com" pullSecretRef: name: "assisted-deployment-pull-secret" 1 clusterImageSetNameRef: "openshift-4.12" 2 sshPublicKey: "ssh-rsa AAAA..." 3 clusters: - clusterName: "<site_name>" networkType: "OVNKubernetes" clusterLabels: 4 common: true group-du-sno: "" sites : "<site_name>" clusterNetwork: - cidr: 1001:1::/48 hostPrefix: 64 machineNetwork: - cidr: 1111:2222:3333:4444::/64 serviceNetwork: - 1001:2::/112 additionalNTPSources: - 1111:2222:3333:4444::2 #crTemplates: # KlusterletAddonConfig: "KlusterletAddonConfigOverride.yaml" 5 nodes: - hostName: "example-node.example.com" 6 role: "master" bmcAddress: idrac-virtualmedia://<out_of_band_ip>/<system_id>/ 7 bmcCredentialsName: name: "bmh-secret" 8 bootMACAddress: "AA:BB:CC:DD:EE:11" bootMode: "UEFI" 9 rootDeviceHints: wwn: "0x11111000000asd123" cpuset: "0-1,52-53" 10 nodeNetwork: 11 interfaces: - name: eno1 macAddress: "AA:BB:CC:DD:EE:11" config: interfaces: - name: eno1 type: ethernet state: up ipv4: enabled: false ipv6: 12 enabled: true address: - ip: 1111:2222:3333:4444::aaaa:1 prefix-length: 64 dns-resolver: config: search: - example.com server: - 1111:2222:3333:4444::2 routes: config: - destination: ::/0 next-hop-interface: eno1 next-hop-address: 1111:2222:3333:4444::1 table-id: 254
- 1
- 使用与
SiteConfig
CR 相同的命名空间创建assisted-deployment-pull-secret
CR。 - 2
clusterImageSetNameRef
定义 hub 集群中可用的镜像集。要查看 hub 集群上支持的版本列表,请运行oc get clusterimagesets
。- 3
- 配置用于访问集群的 SSH 公钥。
- 4
- 集群标签必须与您定义的
PolicyGenTemplate
CR 中的bindingRules
字段对应。例如,policygentemplates/common-ranGen.yaml
应用到所有带有common: true
设置的集群,policygentemplates/group-du-sno-ranGen.yaml
应用到所有带有group-du-sno: ""
设置的所有集群。 - 5
- 可选。
KlusterletAddonConfig
下的 CR specifed 用于覆盖为集群创建的默认KlusterletAddonConfig
。 - 6
- 对于单节点部署,请定义一个主机。对于三节点部署,请定义三个主机。对于标准部署,使用
role: master
定义三个主机,使用role: worker
定义两个或更多主机。 - 7
- 用于访问主机的 BMC 地址。适用于所有集群类型。
- 8
- 使用主机 BMC 凭证单独创建的
bmh-secret
CR 的名称。在创建bmh-secret
CR 时,请使用与置备主机的SiteConfig
CR 相同的命名空间。 - 9
- 配置主机的引导模式。默认值为
UEFI
。使用UEFISecureBoot
在主机上启用安全引导。 - 10
cpuset
应该与用于工作负载分区的集群PerformanceProfile
CR.spec.cpu.reserved
字段中设置的值匹配。- 11
- 指定节点的网络设置。
- 12
- 配置主机的 IPv6 地址。对于带有静态 IP 地址的单节点 OpenShift 集群,特定于节点的 API 和 Ingress IP 应该相同。
注意有关 BMC 寻址的更多信息,请参阅"添加资源"部分。
-
您可以在
out/argocd/extra-manifest
中检查默认的 extra-manifestMachineConfig
CR。它在安装时会自动应用到集群。 -
可选: 要在置备的集群中置备额外的安装清单,请在 Git 存储库中创建一个目录,如
sno-extra-manifest/
,并将自定义清单 CR 添加到这个目录中。如果您的SiteConfig.yaml
在extraManifestPath
字段中引用这个目录,则这个引用目录中的所有 CR 都会被附加到默认的额外的清单集合中。
-
在
kustomization.yaml
文件中将SiteConfig
CR 添加到generators
部分中 ,类似于out/argocd/example/siteconfig/kustomization.yaml
中显示的示例。 在 Git 存储库中提交
SiteConfig
CR 及关联的kustomization.yaml
更改并推送更改。ArgoCD 管道检测到更改并开始受管集群部署。
17.3.5.1. 单节点 OpenShift SiteConfig CR 安装参考
SiteConfig CR 字段 | 描述 |
---|---|
|
将 |
|
为站点中的所有集群配置 hub 集群上可用的镜像集。要查看 hub 集群上支持的版本列表,请运行 |
|
将 重要
使用示例 |
|
配置集群标签,使其与您定义的 |
|
可选。将 |
|
对于单节点部署,请定义一个主机。对于三节点部署,请定义三个主机。对于标准部署,使用 |
| 用于访问主机的 BMC 地址。适用于所有集群类型。{ztp} 支持使用 Redfish 或 IPMI 协议进行 iPXE 和虚拟介质引导。要使用 iPXE 启动,您必须使用 RHACM 2.8 或更高版本。有关 BMC 寻址的更多信息,请参阅"添加资源"部分。 |
| 用于访问主机的 BMC 地址。适用于所有集群类型。{ztp} 支持使用 Redfish 或 IPMI 协议进行 iPXE 和虚拟介质引导。要使用 iPXE 启动,您必须使用 RHACM 2.8 或更高版本。有关 BMC 寻址的更多信息,请参阅"添加资源"部分。 注意 在边缘 Telco 用例中,只有虚拟介质可用于 GitOps {ztp}。 |
|
配置使用主机 BMC 凭证单独创建的 |
|
将主机的引导模式设置为 |
|
指定用于部署的设备。建议在重启后稳定的标识符,例如 |
|
可选。提供的 |
|
配置 |
| 配置节点的网络设置。 |
| 为主机配置 IPv6 地址。对于带有静态 IP 地址的单节点 OpenShift 集群,特定于节点的 API 和 Ingress IP 应该相同。 |
17.3.6. 监控受管集群安装进度
ArgoCD 管道使用 SiteConfig
CR 生成集群配置 CR,并将其与 hub 集群同步。您可以在 ArgoCD 仪表板中监控此同步的进度。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。
流程
同步完成后,安装通常会按如下方式进行:
Assisted Service Operator 会在集群中安装 OpenShift Container Platform。您可以运行以下命令来从 RHACM 仪表板或命令行监控集群安装进度:
导出集群名称:
$ export CLUSTER=<clusterName>
查询受管集群的
AgentClusterInstall
CR:$ oc get agentclusterinstall -n $CLUSTER $CLUSTER -o jsonpath='{.status.conditions[?(@.type=="Completed")]}' | jq
获取集群的安装事件:
$ curl -sk $(oc get agentclusterinstall -n $CLUSTER $CLUSTER -o jsonpath='{.status.debugInfo.eventsURL}') | jq '.[-2,-1]'
17.3.7. 通过验证安装 CR 对 GitOps ZTP 进行故障排除
ArgoCD 管道使用 SiteConfig
和 PolicyGenTemplate
自定义资源 (CR) 生成集群配置 CR 和 Red Hat Advanced Cluster Management (RHACM) 策略。使用以下步骤对此过程中可能出现的问题进行故障排除。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。
流程
您可以使用以下命令检查安装 CR 是否已创建:
$ oc get AgentClusterInstall -n <cluster_name>
如果没有返回对象,请使用以下步骤对从
SiteConfig
文件到安装 CR 的 ArgoCD 管道流进行故障排除。验证
ManagedCluster
CR 是否使用 hub 集群上的SiteConfig
CR 生成:$ oc get managedcluster
如果缺少
ManagedCluster
,请检查clusters
应用程序是否将 Git 存储库中的文件与 hub 集群同步:$ oc describe -n openshift-gitops application clusters
检查
Status.Conditions
字段以查看受管集群的错误日志。例如,在SiteConfig
CR 中为extraManifestPath:
设置无效的值会引发以下错误:Status: Conditions: Last Transition Time: 2021-11-26T17:21:39Z Message: rpc error: code = Unknown desc = `kustomize build /tmp/https___git.com/ran-sites/siteconfigs/ --enable-alpha-plugins` failed exit status 1: 2021/11/26 17:21:40 Error could not create extra-manifest ranSite1.extra-manifest3 stat extra-manifest3: no such file or directory 2021/11/26 17:21:40 Error: could not build the entire SiteConfig defined by /tmp/kust-plugin-config-913473579: stat extra-manifest3: no such file or directory Error: failure in plugin configured via /tmp/kust-plugin-config-913473579; exit status 1: exit status 1 Type: ComparisonError
检查
Status.Sync
字段。如果有日志错误,Status.Sync
字段可能会指示Unknown
错误:Status: Sync: Compared To: Destination: Namespace: clusters-sub Server: https://kubernetes.default.svc Source: Path: sites-config Repo URL: https://git.com/ran-sites/siteconfigs/.git Target Revision: master Status: Unknown
17.3.8. 在 Supermicro 服务器上对 {ztp} 虚拟介质引导进行故障排除
在使用 https
协议提供镜像时,Supermicro X11 服务器不支持虚拟介质安装。因此,此环境的单节点 OpenShift 部署无法在目标节点上引导。要避免这个问题,请登录到 hub 集群并禁用 Provisioning
资源中的传输层安全 (TLS)。这样可确保镜像不通过 TLS 提供,即使镜像地址使用 https
方案。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。
流程
运行以下命令,在
Provisioning
资源中禁用 TLS:$ oc patch provisioning provisioning-configuration --type merge -p '{"spec":{"disableVirtualMediaTLS": true}}'
- 继续部署单节点 OpenShift 集群的步骤。
17.3.9. 从 ZTP 管道中删除受管集群站点
您可以从 ZTP 管道中删除受管站点以及关联的安装和配置策略 CR。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。
流程
通过从
kustomization.yaml
文件中删除关联的SiteConfig
和PolicyGenTemplate
文件来删除站点和相关 CR。当您再次运行 ZTP 管道时,生成的 CR 将被删除。
-
可选: 如果要永久删除站点,您还应从 Git 仓库中删除
SiteConfig
和特定站点的PolicyGenTemplate
文件。 -
可选:如果要临时删除站点,例如在重新部署站点时,可以保留 Git 存储库中的
SiteConfig
和特定站点的PolicyGenTemplate
CR。
其他资源
- 有关删除集群的详情,请参考从管理中删除集群。
17.3.10. 从 ZTP 管道中删除过时的内容
如果对 PolicyGenTemplate
配置的更改会导致过时的策略,例如,如果您重命名策略,请使用以下步骤删除过时的策略。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。
流程
-
从 Git 存储库中删除受影响的
PolicyGenTemplate
文件,提交并推送到远程存储库。 - 等待更改通过应用程序同步,并将受影响的策略从 hub 集群中删除。
将更新的
PolicyGenTemplate
文件重新添加到 Git 存储库,然后提交并推送到远程存储库。注意从 Git 仓库中删除零接触置备 (ZTP) 策略,因此也会从 hub 集群中删除它们,不会影响受管集群的配置。由该策略管理的策略和 CR 保留在受管集群上。
可选:作为替代方案,在修改了导致过时策略的
PolicyGenTemplate
CR 后,您可以手动从 hub 集群中删除这些策略。您可以使用 Governance 选项卡或运行以下命令来从 RHACM 控制台删除策略:$ oc delete policy -n <namespace> <policy_name>
17.3.11. 弃用 ZTP 管道
您可以删除 ArgoCD 管道和所有生成的 ZTP 工件。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。
流程
- 从 hub 集群上的 Red Hat Advanced Cluster Management (RHACM)分离所有集群。
使用以下命令,删除
deployment
目录中的kustomization.yaml
文件:$ oc delete -k out/argocd/deployment
- 提交您的更改并推送到站点存储库。
17.4. 使用策略和 PolicyGenTemplate 资源配置受管集群
应用的策略自定义资源 (CR) 配置您置备的受管集群。您可以自定义 Red Hat Advanced Cluster Management (RHACM) 如何使用 PolicyGenTemplate
CR 生成应用的策略 CR。
17.4.1. 关于 PolicyGenTemplate CRD
PolicyGenTemplate
自定义资源定义(CRD) 告知 PolicyGen
策略生成器在集群配置中包含哪些自定义资源 (CR),如何将 CR 组合到生成的策略中,以及这些 CR 中的项目需要使用 overlay 内容更新。
以下示例显示了从 ztp-site-generate
引用容器中提取的 PolicyGenTemplate
CR (common-du-ranGen.yaml
)。common-du-ranGen.yaml
文件定义了两个 Red Hat Advanced Cluster Management (RHACM) 策略。策略管理配置 CR 集合,每个 CR 中的 policyName
值对应一个。common-du-ranGen.yaml
创建一个单个放置绑定和一个放置规则,根据 bindingRules
部分中列出的标签将策略绑定到集群。
PolicyGenTemplate CR 示例 - common-du-ranGen.yaml
--- apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "common" namespace: "ztp-common" spec: bindingRules: common: "true" 1 sourceFiles: 2 - fileName: SriovSubscription.yaml policyName: "subscriptions-policy" - fileName: SriovSubscriptionNS.yaml policyName: "subscriptions-policy" - fileName: SriovSubscriptionOperGroup.yaml policyName: "subscriptions-policy" - fileName: SriovOperatorStatus.yaml policyName: "subscriptions-policy" - fileName: PtpSubscription.yaml policyName: "subscriptions-policy" - fileName: PtpSubscriptionNS.yaml policyName: "subscriptions-policy" - fileName: PtpSubscriptionOperGroup.yaml policyName: "subscriptions-policy" - fileName: PtpOperatorStatus.yaml policyName: "subscriptions-policy" - fileName: ClusterLogNS.yaml policyName: "subscriptions-policy" - fileName: ClusterLogOperGroup.yaml policyName: "subscriptions-policy" - fileName: ClusterLogSubscription.yaml policyName: "subscriptions-policy" - fileName: ClusterLogOperatorStatus.yaml policyName: "subscriptions-policy" - fileName: StorageNS.yaml policyName: "subscriptions-policy" - fileName: StorageOperGroup.yaml policyName: "subscriptions-policy" - fileName: StorageSubscription.yaml policyName: "subscriptions-policy" - fileName: StorageOperatorStatus.yaml policyName: "subscriptions-policy" - fileName: ReduceMonitoringFootprint.yaml policyName: "config-policy" - fileName: OperatorHub.yaml 3 policyName: "config-policy" - fileName: DefaultCatsrc.yaml 4 policyName: "config-policy" 5 metadata: name: redhat-operators spec: displayName: disconnected-redhat-operators image: registry.example.com:5000/disconnected-redhat-operators/disconnected-redhat-operator-index:v4.9 - fileName: DisconnectedICSP.yaml policyName: "config-policy" spec: repositoryDigestMirrors: - mirrors: - registry.example.com:5000 source: registry.redhat.io
- 1
common: "true"
将策略应用到具有此标签的所有集群。- 2
sourceFiles
下列出的文件为已安装的集群创建 Operator 策略。- 3
OperatorHub.yaml
为断开连接的 registry 配置 OperatorHub。- 4
DefaultCatsrc.yaml
配置断开连接的 registry 的目录源。- 5
policyName: "config-policy"
配置 Operator 订阅。OperatorHub
CR 禁用默认值,此 CR 将redhat-operators
替换为指向断开连接的 registry 的CatalogSource
CR。
PolicyGenTemplate
CR 可以使用任意数量的包含 CR 来构建。在 hub 集群中应用以下示例 CR 来生成包含单个 CR 的策略:
apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "group-du-sno" namespace: "ztp-group" spec: bindingRules: group-du-sno: "" mcp: "master" sourceFiles: - fileName: PtpConfigSlave.yaml policyName: "config-policy" metadata: name: "du-ptp-slave" spec: profile: - name: "slave" interface: "ens5f0" ptp4lOpts: "-2 -s --summary_interval -4" phc2sysOpts: "-a -r -n 24"
使用源文件 PtpConfigSlave.yaml
作为示例,文件会定义一个 PtpConfig
CR。为 PtpConfigSlave
示例生成的策略名为 group-du-sno-config-policy
。生成的 group-du-sno-config-policy
中定义的 PtpConfig
CR 被命名为 du-ptp-slave
。PtpConfigSlave.yaml
中定义的 spec
放置在 du-ptp-slave
下,以及与源文件中定义的其他 spec
项目一起放置。
以下示例显示了 group-du-sno-config-policy
CR:
apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: name: group-du-ptp-config-policy namespace: groups-sub annotations: policy.open-cluster-management.io/categories: CM Configuration Management policy.open-cluster-management.io/controls: CM-2 Baseline Configuration policy.open-cluster-management.io/standards: NIST SP 800-53 spec: remediationAction: inform disabled: false policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: group-du-ptp-config-policy-config spec: remediationAction: inform severity: low namespaceselector: exclude: - kube-* include: - '*' object-templates: - complianceType: musthave objectDefinition: apiVersion: ptp.openshift.io/v1 kind: PtpConfig metadata: name: du-ptp-slave namespace: openshift-ptp spec: recommend: - match: - nodeLabel: node-role.kubernetes.io/worker-du priority: 4 profile: slave profile: - interface: ens5f0 name: slave phc2sysOpts: -a -r -n 24 ptp4lConf: | [global] # # Default Data Set # twoStepFlag 1 slaveOnly 0 priority1 128 priority2 128 domainNumber 24 .....
17.4.2. 在自定义 PolicyGenTemplate CR 时建议
在自定义站点配置 PolicyGenTemplate
自定义资源 (CR) 时,请考虑以下最佳实践:
-
根据需要使用一些策略。使用较少的策略需要较少的资源。每个附加策略会为 hub 集群和部署的受管集群创建开销。CR 根据
PolicyGenTemplate
CR 中的policyName
字段合并到策略中。同一PolicyGenTemplate
中的 CR,在单个策略下管理相同的policyName
值。 -
在断开连接的环境中,通过将 registry 配置为包含所有 Operator 的单个索引,为所有 Operator 使用单个目录源。受管集群中的每个额外
CatalogSource
CR 会增加 CPU 用量。 -
MachineConfig
CR 应包含在siteConfig
CR 中作为extraManifests
,以便在安装过程中应用它们。这可减少在集群就绪部署应用程序前所花费的总时间。 -
PolicyGenTemplates
应该覆盖 channel 字段以明确标识所需版本。这样可确保源 CR 在升级过程中的更改不会更新生成的订阅。
其他资源
- 有关使用 RHACM 扩展集群的建议,请参阅性能和可扩展性。
在 hub 集群中管理大量 spoke 集群时,请最小化策略数量来减少资源消耗。
将多个配置 CR 分组到单个或有限的策略中,一种方法是减少 hub 集群上的总体策略数量。在使用 common/group/site 层次结构来管理站点配置时,务必要将特定于站点的配置组合成单一策略。
17.4.3. RAN 部署的 PolicyGenTemplate CR
使用 PolicyGenTemplate
(PGT) 自定义资源 (CR) 使用 GitOps 零接触置备 (ZTP) 管道自定义应用到集群的配置。PGT CR 允许您生成一个或多个策略来管理您的集群上的配置 CR 集合。PGT 标识一组受管 CR,将它们捆绑到策略中,构建与这些 CR 相关的策略,并使用标签绑定规则将策略与集群相关联。
从 GitOps ZTP 容器获取的参考配置旨在提供一组关键功能和节点调优设置,以确保集群可以支持字符串的性能和资源利用率限制,典型的 RAN 分布式单元(DU)应用程序。来自基准配置的更改或禁止可能会影响功能可用性、性能和资源利用率。使用 PolicyGenTemplate
CR 作为参考来创建根据您的特定站点要求量身定制的配置文件的层次结构。
为 RAN DU 集群配置定义的基准 PolicyGenTemplate
CR 可以从 GitOps ZTP ztp-site-generate
容器中提取。如需了解更多详细信息,请参阅"准备 GitOps ZTP 站点配置存储库"。
PolicyGenTemplate
CR 可以在 ./out/argocd/example/policygentemplates
文件夹中找到。参考架构具有共同、组和特定站点的配置 CR。每个 PolicyGenTemplate
CR 都引用可在 ./out/source-crs
文件夹中找到的其他 CR。
与 RAN 集群配置相关的 PolicyGenTemplate
CR 如下所述。为组 PolicyGenTemplate
CR 提供了变量,以考虑单节点、三节点紧凑和标准集群配置的不同。同样,为单节点集群和多节点(compact 或 standard)集群提供了特定于站点的配置变体。使用与部署相关的组和特定于站点的配置变体。
PolicyGenTemplate CR | 描述 |
---|---|
| 包含一组应用于多节点集群的 CR。这些 CR 配置 SR-IOV 功能,用于 RAN 安装。 |
| 包含一组应用于单节点 OpenShift 集群的 CR。这些 CR 配置 SR-IOV 功能,用于 RAN 安装。 |
| 包含一组应用于所有集群的通用 RAN CR。这些 CR 订阅一组 operator,提供典型的 RAN 和基准集群调整功能。 |
| 仅包含三节点集群的 RAN 策略。 |
| 仅包含单节点集群的 RAN 策略。 |
| 包含标准三个 control-plane 集群的 RAN 策略。 |
|
|
|
|
|
|
17.4.4. 使用 PolicyGenTemplate CR 自定义受管集群
使用以下步骤自定义应用于使用零接触置备 (ZTP) 管道置备的受管集群的策略。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 - 配置了 hub 集群来生成所需的安装和策略 CR。
- 您创建了 Git 存储库,用于管理自定义站点配置数据。该存储库必须可从 hub 集群访问,并定义为 Argo CD 应用程序的源仓库。
流程
为特定于站点的配置 CR 创建
PolicyGenTemplate
CR。-
从
out/argocd/example/policygentemplates
文件夹中选择适当的 CR 示例,例如example-sno-site.yaml
或example-multinode-site.yaml
。 更改示例文件中的
bindingRules
字段,使其与SiteConfig
CR 中包含的特定于站点的标签匹配。在示例SiteConfig
文件中,特定于站点的标签是sites: example-sno
。注意确保
PolicyGenTemplate
bindingRules
字段中定义的标签对应于相关受管集群SiteConfig
CR 中定义的标签。- 更改示例文件中的内容,使其与所需配置匹配。
-
从
可选:为应用到集群的任何通用配置 CR 创建一个
PolicyGenTemplate
CR。-
从
out/argocd/example/policygentemplates
文件夹中选择适合您的 CR 示例,例如common-ranGen.yaml
。 - 更改示例文件中的内容,使其与所需配置匹配。
-
从
可选:为应用到团队中特定集群组的任何组配置 CR 创建一个
PolicyGenTemplate
CR。确保 overlaid spec 文件的内容与您的预期最终状态匹配。作为参考,out/source-crs 目录包含可用于包含并由您的 PolicyGenTemplate 模板提供的 source-crs 的完整列表。
注意根据集群的特定要求,每个集群类型可能需要一个组策略,特别是考虑示例组策略各自有一个 PerformancePolicy.yaml 文件,如果这些集群是由相同的硬件配置,则只能在一组集群中共享。
-
从
out/argocd/example/policygentemplates
文件夹中选择适当的 CR 示例,例如group-du-sno-ranGen.yaml
。 - 更改示例文件中的内容,使其与所需配置匹配。
-
从
-
可选。当 ZTP 安装和配置完成后,创建验证器通知策略
PolicyGenTemplate
CR。如需更多信息,请参阅"创建验证器通知策略"。 在 YAML 文件中定义所有策略命名空间,类似于示例
out/argocd/example/policygentemplates/ns.yaml
文件。重要不要在带有
PolicyGenTemplate
CR 的同一文件中包括Namespace
CR。-
将
PolicyGenTemplate
CR 和Namespace
CR 添加到 generators 部分中的kustomization.yaml
文件中,类似于out/argocd/example/policygentemplates/kustomization.yaml
所示的示例。 在 Git 存储库中提交
PolicyGenTemplate
CR、Namespace
CR 和关联的kustomization.yaml
文件并推送更改。ArgoCD 管道检测到更改并开始受管集群部署。您可以同时将更改推送到
SiteConfig
CR 和PolicyGenTemplate
CR。
17.4.5. 监控受管集群策略部署进度
ArgoCD 管道使用 Git 中的 PolicyGenTemplate
CR 生成 RHACM 策略,然后将其同步到 hub 集群。您可以在辅助服务在受管集群中安装 OpenShift Container Platform 后监控受管集群策略同步的进度。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。
流程
Topology Aware Lifecycle Manager(TALM)应用绑定到集群的配置策略。
集群安装完成后,集群变为
Ready
,ClusterGroupUpgrade
CR 对应于此集群,且由run.openshift.io/ztp-deploy-wave annotations
定义的已排序策略列表由 TALM 自动创建。集群的策略按ClusterGroupUpgrade
CR 中列出的顺序应用。您可以使用以下命令监控配置策略协调的高级进度:
$ export CLUSTER=<clusterName>
$ oc get clustergroupupgrades -n ztp-install $CLUSTER -o jsonpath='{.status.conditions[-1:]}' | jq
输出示例
{ "lastTransitionTime": "2022-11-09T07:28:09Z", "message": "Remediating non-compliant policies", "reason": "InProgress", "status": "True", "type": "Progressing" }
您可以使用 RHACM 仪表板或命令行监控详细的集群策略合规状态。
要使用
oc
检查策略合规性,请运行以下命令:$ oc get policies -n $CLUSTER
输出示例
NAME REMEDIATION ACTION COMPLIANCE STATE AGE ztp-common.common-config-policy inform Compliant 3h42m ztp-common.common-subscriptions-policy inform NonCompliant 3h42m ztp-group.group-du-sno-config-policy inform NonCompliant 3h42m ztp-group.group-du-sno-validator-du-policy inform NonCompliant 3h42m ztp-install.example1-common-config-policy-pjz9s enforce Compliant 167m ztp-install.example1-common-subscriptions-policy-zzd9k enforce NonCompliant 164m ztp-site.example1-config-policy inform NonCompliant 3h42m ztp-site.example1-perf-policy inform NonCompliant 3h42m
要从 RHACM Web 控制台检查策略状态,请执行以下操作:
- 点 Governance → Find policies。
- 点集群策略检查其状态。
当所有集群策略都合规时,集群的 ZTP 安装和配置已完成。ztp-done
标签添加到集群中。
在引用配置中,合规的最终策略是 *-du-validator-policy
策略中定义的。此策略当在一个集群中合规时,确保所有集群配置、Operator 安装和 Operator 配置已完成。
17.4.6. 验证配置策略 CR 的生成
策略自定义资源(CR)在与创建它们的 PolicyGenTemplate
相同的命名空间中生成。同样的故障排除流程适用于从 PolicyGenTemplate
生成的所有策略 CR,无论它们是 ztp-common
、ztp-group
,还是基于 ztp-site
,请使用以下命令:
$ export NS=<namespace>
$ oc get policy -n $NS
应该会显示预期的策略嵌套 CR 集合。
如果策略失败的同步,请使用以下故障排除步骤。
流程
要显示策略的详细信息,请运行以下命令:
$ oc describe -n openshift-gitops application policies
检查
Status: Conditions:
来显示错误日志。例如,设置无效的sourceFile→fileName:
生成以下错误:Status: Conditions: Last Transition Time: 2021-11-26T17:21:39Z Message: rpc error: code = Unknown desc = `kustomize build /tmp/https___git.com/ran-sites/policies/ --enable-alpha-plugins` failed exit status 1: 2021/11/26 17:21:40 Error could not find test.yaml under source-crs/: no such file or directory Error: failure in plugin configured via /tmp/kust-plugin-config-52463179; exit status 1: exit status 1 Type: ComparisonError
检查
Status: Sync:
。如果Status: Conditions:
中存在日志错误,则Status: Sync:
显示Unknown
或Error
:Status: Sync: Compared To: Destination: Namespace: policies-sub Server: https://kubernetes.default.svc Source: Path: policies Repo URL: https://git.com/ran-sites/policies/.git Target Revision: master Status: Error
当 Red Hat Advanced Cluster Management(RHACM)识别策略应用到
ManagedCluster
对象时,策略 CR 对象应用到集群命名空间。检查策略是否已复制到集群命名空间中:$ oc get policy -n $CLUSTER
输出示例:
NAME REMEDIATION ACTION COMPLIANCE STATE AGE ztp-common.common-config-policy inform Compliant 13d ztp-common.common-subscriptions-policy inform Compliant 13d ztp-group.group-du-sno-config-policy inform Compliant 13d Ztp-group.group-du-sno-validator-du-policy inform Compliant 13d ztp-site.example-sno-config-policy inform Compliant 13d
RHACM 将所有适用的策略复制到集群命名空间中。复制的策略名称使用以下格式:
<policyGenTemplate.Namespace>.<policyGenTemplate.Name>-<policyName>
。检查放置规则中是否有没有复制到集群命名空间中的策略。这些策略的
PlacementRule
中的matchSelector
应与ManagedCluster
对象上的标签匹配:$ oc get placementrule -n $NS
使用以下命令,注意适合缺少策略、通用、组或站点的
PlacementRule
名称:$ oc get placementrule -n $NS <placementRuleName> -o yaml
- status-decisions 应该包括集群名称。
-
spec 中
matchSelector
的键值对必须与受管集群上的标签匹配。
使用以下命令,检查
ManagedCluster
对象上的标签:$ oc get ManagedCluster $CLUSTER -o jsonpath='{.metadata.labels}' | jq
使用以下命令查看合规策略:
$ oc get policy -n $CLUSTER
如果
Namespace
、OperatorGroup
和Subscription
策略兼容,但 Operator 配置策略不兼容,则 Operator 可能不会在受管集群中安装。这会导致 Operator 配置策略无法应用,因为 CRD 还没有应用到 spoke。
17.4.7. 重启策略协调
当发生意外合规问题时,您可以重启策略协调,例如 ClusterGroupUpgrade
自定义资源 (CR) 超时时。
流程
在受管集群变为
Ready
后,Topology Aware Lifecycle Manager 在命名空间ztp-install
中生成ClusterGroupUpgrade
CR:$ export CLUSTER=<clusterName>
$ oc get clustergroupupgrades -n ztp-install $CLUSTER
如果出现意外问题,且策略无法在配置超时(默认为 4 小时)内变为合规,
ClusterGroupUpgrade
CR 的状态会显示UpgradeTimedOut
:$ oc get clustergroupupgrades -n ztp-install $CLUSTER -o jsonpath='{.status.conditions[?(@.type=="Ready")]}'
UpgradeTimedOut
状态的ClusterGroupUpgrade
CR 每小时自动重启其策略协调。如果更改了策略,可以通过删除现有ClusterGroupUpgrade
CR 来启动立即重试。这会触发自动创建新的ClusterGroupUpgrade
CR,以开始立即协调策略:$ oc delete clustergroupupgrades -n ztp-install $CLUSTER
请注意,当 ClusterGroupUpgrade
CR 完成,其状态为 UpgradeCompleted
,且受管集群应用了 ztp-done
标签,您可以使用 PolicyGenTemplate
创建额外的配置更改。删除现有的 ClusterGroupUpgrade
CR 将无法生成新的 CR。
此时,ZTP 完成了与集群的交互,任何进一步的交互都应被视为更新,并为补救策略创建新的 ClusterGroupUpgrade
CR。
其他资源
-
有关使用 Topology Aware Lifecycle Manager (TALM)来构建自己的
ClusterGroupUpgrade
CR 的详情,请参考关于 ClusterGroupUpgrade CR。
17.4.8. 使用策略更改应用的受管集群 CR
您可以通过策略从受管集群中部署的自定义资源(CR)中删除内容。
默认情况下,从 PolicyGenTemplate
CR 创建的所有 Policy
CR 将 complianceType
字段设置为 musthave
。没有删除内容的 musthave
策略仍然合规,因为受管集群上的 CR 具有所有指定的内容。使用这个配置,当从 CR 中删除内容时,TALM 从策略中删除内容,但不会从受管集群的 CR 中删除内容。
当 complianceType
字段为 mustonlyhave
时,策略可确保集群中的 CR 与策略中指定的内容完全匹配。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 - 您已从运行 RHACM 的 hub 集群部署了受管集群。
- 您已在 hub 集群中安装了 Topology Aware Lifecycle Manager。
流程
从受影响的 CR 中删除您不再需要的内容。在本例中,
disableDrain: false
行已从SriovOperatorConfig
CR 中删除。CR 示例
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovOperatorConfig metadata: name: default namespace: openshift-sriov-network-operator spec: configDaemonNodeSelector: "node-role.kubernetes.io/$mcp": "" disableDrain: true enableInjector: true enableOperatorWebhook: true
在
group-du-sno-ranGen.yaml
文件中,将受影响的策略的complianceType
更改为mustonlyhave
。YAML 示例
# ... - fileName: SriovOperatorConfig.yaml policyName: "config-policy" complianceType: mustonlyhave # ...
创建
ClusterGroupUpdates
CR,并指定必须接收 CR 更改的集群:ClusterGroupUpdates CR 示例
apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-remove namespace: default spec: managedPolicies: - ztp-group.group-du-sno-config-policy enable: false clusters: - spoke1 - spoke2 remediationStrategy: maxConcurrency: 2 timeout: 240 batchTimeoutAction:
运行以下命令来创建
ClusterGroupUpgrade
CR:$ oc create -f cgu-remove.yaml
当您准备好应用更改时,例如在适当的维护窗口中,运行以下命令将
spec.enable
字段的值改为true
:$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-remove \ --patch '{"spec":{"enable":true}}' --type=merge
验证
运行以下命令,检查策略的状态:
$ oc get <kind> <changed_cr_name>
输出示例
NAMESPACE NAME REMEDIATION ACTION COMPLIANCE STATE AGE default cgu-ztp-group.group-du-sno-config-policy enforce 17m default ztp-group.group-du-sno-config-policy inform NonCompliant 15h
当策略的
COMPLIANCE STATE
为Compliant
时,这意味着已更新 CR,并删除不需要的内容。在受管集群中运行以下命令来检查策略是否已从目标集群中移除:
$ oc get <kind> <changed_cr_name>
如果没有结果,则会从受管集群中删除 CR。
17.4.9. 假定为 ZTP 安装
零接触置备 (ZTP) 简化了检查集群的 ZTP 安装状态的过程。ZTP 状态分为三个阶段:集群安装、集群配置和 ZTP。
- 集群安装阶段
-
集群安装阶段由
ManagedCluster
CR 中的ManagedClusterJoined
和ManagedClusterAvailable
条件显示。如果ManagedCluster
CR 没有这些条件,或者条件设置为False
,集群仍然处于安装阶段。有关安装的更多信息,请参阅AgentClusterInstall
和ClusterDeployment
CR。如需更多信息,请参阅"Troubleshooting GitOps ZTP"。 - 集群配置阶段
-
集群配置阶段由
ztp-running
标签显示,在集群中应用ManagedCluster
CR。 - 完成了 ZTP
集群安装和配置在 ZTP 完成。这可以通过删除
ztp-running
标签并在ManagedCluster
CR 中添加ztp-done
标签来显示。ztp-done
标签显示应用了配置,基准 DU 配置已完成集群调整。过渡到 ZTP 完成的状态是在 Red Hat Advanced Cluster Management (RHACM) 验证通知策略合规状态的条件。这个策略捕获了已完成的安装的现有条件,并确认只有在受管集群的 ZTP 置备完成后才会变为合规状态。
验证器通知策略可确保完全应用集群的配置,Operator 已完成初始化。策略验证以下内容:
-
目标
MachineConfigPool
包含预期的条目,并已完成更新。所有节点都可用,且没有降级。 -
至少有一个
SriovNetworkNodeState
带有syncStatus: Succeeded
则代表 SR-IOV Operator 已完成初始化。 - PTP Operator 守护进程集已存在。
-
目标
17.5. 使用 ZTP 手动安装单节点 OpenShift 集群
您可以使用 Red Hat Advanced Cluster Management (RHACM) 和支持的服务部署受管单节点 OpenShift 集群。
如果要创建多个受管集群,请参阅使用 ZTP 部署边缘站点中描述的 SiteConfig
方法。
目标裸机主机必须满足 vDU 应用程序工作负载的推荐集群配置中列出的网络、固件和硬件要求。
17.5.1. 手动生成 ZTP 安装和配置 CR
使用 ztp-site-generate
容器的 generator
入口点,根据 SiteConfig
和 PolicyGenTemplate
CR 为集群生成站点安装和配置自定义资源 (CR)。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。
流程
运行以下命令来创建输出文件夹:
$ mkdir -p ./out
从
ztp-site-generate
容器镜像导出argocd
目录:$ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12 extract /home/ztp --tar | tar x -C ./out
./out
目录包含out/argocd/example/
文件夹中的参考PolicyGenTemplate
和SiteConfig
CR。输出示例
out └── argocd └── example ├── policygentemplates │ ├── common-ranGen.yaml │ ├── example-sno-site.yaml │ ├── group-du-sno-ranGen.yaml │ ├── group-du-sno-validator-ranGen.yaml │ ├── kustomization.yaml │ └── ns.yaml └── siteconfig ├── example-sno.yaml ├── KlusterletAddonConfigOverride.yaml └── kustomization.yaml
为站点安装 CR 创建输出文件夹:
$ mkdir -p ./site-install
为您要安装的集群类型修改示例
SiteConfig
CR。将example-sno.yaml
复制到site-1-sno.yaml
,并修改 CR 以匹配您要安装的站点和裸机主机的详情,例如:单节点 OpenShift 集群 SiteConfig CR 示例
apiVersion: ran.openshift.io/v1 kind: SiteConfig metadata: name: "<site_name>" namespace: "<site_name>" spec: baseDomain: "example.com" pullSecretRef: name: "assisted-deployment-pull-secret" 1 clusterImageSetNameRef: "openshift-4.12" 2 sshPublicKey: "ssh-rsa AAAA..." 3 clusters: - clusterName: "<site_name>" networkType: "OVNKubernetes" clusterLabels: 4 common: true group-du-sno: "" sites : "<site_name>" clusterNetwork: - cidr: 1001:1::/48 hostPrefix: 64 machineNetwork: - cidr: 1111:2222:3333:4444::/64 serviceNetwork: - 1001:2::/112 additionalNTPSources: - 1111:2222:3333:4444::2 #crTemplates: # KlusterletAddonConfig: "KlusterletAddonConfigOverride.yaml" 5 nodes: - hostName: "example-node.example.com" 6 role: "master" bmcAddress: idrac-virtualmedia://<out_of_band_ip>/<system_id>/ 7 bmcCredentialsName: name: "bmh-secret" 8 bootMACAddress: "AA:BB:CC:DD:EE:11" bootMode: "UEFI" 9 rootDeviceHints: wwn: "0x11111000000asd123" cpuset: "0-1,52-53" 10 nodeNetwork: 11 interfaces: - name: eno1 macAddress: "AA:BB:CC:DD:EE:11" config: interfaces: - name: eno1 type: ethernet state: up ipv4: enabled: false ipv6: 12 enabled: true address: - ip: 1111:2222:3333:4444::aaaa:1 prefix-length: 64 dns-resolver: config: search: - example.com server: - 1111:2222:3333:4444::2 routes: config: - destination: ::/0 next-hop-interface: eno1 next-hop-address: 1111:2222:3333:4444::1 table-id: 254
- 1
- 使用与
SiteConfig
CR 相同的命名空间创建assisted-deployment-pull-secret
CR。 - 2
clusterImageSetNameRef
定义 hub 集群中可用的镜像集。要查看 hub 集群上支持的版本列表,请运行oc get clusterimagesets
。- 3
- 配置用于访问集群的 SSH 公钥。
- 4
- 集群标签必须与您定义的
PolicyGenTemplate
CR 中的bindingRules
字段对应。例如,policygentemplates/common-ranGen.yaml
应用到所有带有common: true
设置的集群,policygentemplates/group-du-sno-ranGen.yaml
应用到所有带有group-du-sno: ""
设置的所有集群。 - 5
- 可选。
KlusterletAddonConfig
下的 CR specifed 用于覆盖为集群创建的默认KlusterletAddonConfig
。 - 6
- 对于单节点部署,请定义一个主机。对于三节点部署,请定义三个主机。对于标准部署,使用
role: master
定义三个主机,使用role: worker
定义两个或更多主机。 - 7
- 用于访问主机的 BMC 地址。适用于所有集群类型。
- 8
- 使用主机 BMC 凭证单独创建的
bmh-secret
CR 的名称。在创建bmh-secret
CR 时,请使用与置备主机的SiteConfig
CR 相同的命名空间。 - 9
- 配置主机的引导模式。默认值为
UEFI
。使用UEFISecureBoot
在主机上启用安全引导。 - 10
cpuset
应该与用于工作负载分区的集群PerformanceProfile
CR.spec.cpu.reserved
字段中设置的值匹配。- 11
- 指定节点的网络设置。
- 12
- 配置主机的 IPv6 地址。对于带有静态 IP 地址的单节点 OpenShift 集群,特定于节点的 API 和 Ingress IP 应该相同。
运行以下命令,通过处理修改后的
SiteConfig
CRsite-1-sno.yaml
来生成 day-0 安装 CR:$ podman run -it --rm -v `pwd`/out/argocd/example/siteconfig:/resources:Z -v `pwd`/site-install:/output:Z,U registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12.1 generator install site-1-sno.yaml /output
输出示例
site-install └── site-1-sno ├── site-1_agentclusterinstall_example-sno.yaml ├── site-1-sno_baremetalhost_example-node1.example.com.yaml ├── site-1-sno_clusterdeployment_example-sno.yaml ├── site-1-sno_configmap_example-sno.yaml ├── site-1-sno_infraenv_example-sno.yaml ├── site-1-sno_klusterletaddonconfig_example-sno.yaml ├── site-1-sno_machineconfig_02-master-workload-partitioning.yaml ├── site-1-sno_machineconfig_predefined-extra-manifests-master.yaml ├── site-1-sno_machineconfig_predefined-extra-manifests-worker.yaml ├── site-1-sno_managedcluster_example-sno.yaml ├── site-1-sno_namespace_example-sno.yaml └── site-1-sno_nmstateconfig_example-node1.example.com.yaml
可选:使用
-E
选项处理参考SiteConfig
CR,只为特定集群类型生成 day-0MachineConfig
安装 CR。例如,运行以下命令:为
MachineConfig
CR 创建输出文件夹:$ mkdir -p ./site-machineconfig
生成
MachineConfig
安装 CR:$ podman run -it --rm -v `pwd`/out/argocd/example/siteconfig:/resources:Z -v `pwd`/site-machineconfig:/output:Z,U registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12.1 generator install -E site-1-sno.yaml /output
输出示例
site-machineconfig └── site-1-sno ├── site-1-sno_machineconfig_02-master-workload-partitioning.yaml ├── site-1-sno_machineconfig_predefined-extra-manifests-master.yaml └── site-1-sno_machineconfig_predefined-extra-manifests-worker.yaml
使用上一步中的参考
PolicyGenTemplate
CR 生成并导出 day-2 配置 CR。运行以下命令:为 day-2 CR 创建输出文件夹:
$ mkdir -p ./ref
生成并导出第 2 天配置 CR:
$ podman run -it --rm -v `pwd`/out/argocd/example/policygentemplates:/resources:Z -v `pwd`/ref:/output:Z,U registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12.1 generator config -N . /output
该命令在
./ref
文件夹中为单节点 OpenShift、三节点集群和标准集群生成示例组和特定于站点的PolicyGenTemplate
CR。输出示例
ref └── customResource ├── common ├── example-multinode-site ├── example-sno ├── group-du-3node ├── group-du-3node-validator │ └── Multiple-validatorCRs ├── group-du-sno ├── group-du-sno-validator ├── group-du-standard └── group-du-standard-validator └── Multiple-validatorCRs
- 使用生成的 CR 作为安装集群的 CR 的基础。您可以将安装 CR 应用到 hub 集群,如 "Installing a single managed cluster" 所述。配置 CR 可以在集群安装后应用到集群。
17.5.2. 创建受管裸机主机 secret
将受管裸机主机所需的 Secret
自定义资源 (CR) 添加到 hub 集群。您需要 ZTP 管道的 secret 来访问 Baseboard Management Controller (BMC) 和支持的安装程序服务的 secret,以便从 registry 中拉取集群安装镜像。
secret 按名称从 SiteConfig
CR 引用。命名空间必须与 SiteConfig
命名空间匹配。
流程
创建一个 YAML secret 文件,其中包含主机 Baseboard Management Controller (BMC) 和安装 OpenShift 和所有附加组件集群 Operator 所需的凭证:
将以下 YAML 保存为文件
example-sno-secret.yaml
:apiVersion: v1 kind: Secret metadata: name: example-sno-bmc-secret namespace: example-sno 1 data: 2 password: <base64_password> username: <base64_username> type: Opaque --- apiVersion: v1 kind: Secret metadata: name: pull-secret namespace: example-sno 3 data: .dockerconfigjson: <pull_secret> 4 type: kubernetes.io/dockerconfigjson
-
将到
example-sno-secret.yaml
的相对路径添加用于安装集群的kustomization.yaml
文件中。
17.5.3. 使用 GitOps ZTP 为手动安装配置 Discovery ISO 内核参数
GitOps ZTP 工作流使用 Discovery ISO 作为托管裸机主机的 OpenShift Container Platform 安装过程的一部分。您可以编辑 InfraEnv
资源来为 Discovery ISO 指定内核参数。这对具有特定环境要求的集群安装非常有用。例如,为发现 ISO 配置 rd.net.timeout.carrier
内核参数以促进集群的静态网络,或者在在安装过程中下载根文件系统前接收 DHCP 地址。
在 OpenShift Container Platform 4.12 中,您只能添加内核参数。您不能替换或删除内核参数。
先决条件
- 已安装 OpenShift CLI(oc)。
- 已以具有 cluster-admin 权限的用户身份登录到 hub 集群。
- 您已手动生成安装和配置自定义资源(CR)。
流程
-
编辑
InfraEnv
CR 中的spec.kernelArguments
规格以配置内核参数:
apiVersion: agent-install.openshift.io/v1beta1 kind: InfraEnv metadata: name: <cluster_name> namespace: <cluster_name> spec: kernelArguments: - operation: append 1 value: audit=0 2 - operation: append value: trace=1 clusterRef: name: <cluster_name> namespace: <cluster_name> pullSecretRef: name: pull-secret
SiteConfig
CR 生成 InfraEnv
资源,作为 day-0 安装 CR 的一部分。
验证
要验证是否应用了内核参数,在 Discovery 镜像验证 OpenShift Container Platform 是否准备好安装后,您可以在安装过程开始前通过 SSH 连接到目标主机。此时,您可以在 /proc/cmdline
文件中查看发现 ISO 的内核参数。
使用目标主机开始 SSH 会话:
$ ssh -i /path/to/privatekey core@<host_name>
使用以下命令查看系统的内核参数:
$ cat /proc/cmdline
17.5.4. 安装单个受管集群
您可以使用辅助服务和 Red Hat Advanced Cluster Management (RHACM) 手动部署单个受管集群。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 -
您已创建了基板管理控制器(BMC)
Secret
和镜像 pull-secretSecret
自定义资源 (CR)。详情请参阅"创建受管裸机主机 secret"。 - 您的目标裸机主机满足受管集群的网络和硬件要求。
流程
为要部署的每个特定集群版本创建一个
ClusterImageSet
,如clusterImageSet-4.12.yaml
。ClusterImageSet
具有以下格式:apiVersion: hive.openshift.io/v1 kind: ClusterImageSet metadata: name: openshift-4.12.0 1 spec: releaseImage: quay.io/openshift-release-dev/ocp-release:4.12.0-x86_64 2
应用
clusterImageSet
CR:$ oc apply -f clusterImageSet-4.12.yaml
在
cluster-namespace.yaml
文件中创建Namespace
CR:apiVersion: v1 kind: Namespace metadata: name: <cluster_name> 1 labels: name: <cluster_name> 2
运行以下命令来应用
Namespace
CR:$ oc apply -f cluster-namespace.yaml
应用从
ztp-site-generate
容器中提取的生成的 day-0 CR,并自定义以满足您的要求:$ oc apply -R ./site-install/site-sno-1
其他资源
17.5.5. 监控受管集群安装状态
通过检查集群状态,确保集群置备成功。
先决条件
-
所有自定义资源都已配置并置备,在受管集群的 hub 上创建
Agent
自定义资源。
流程
检查受管集群的状态:
$ oc get managedcluster
True
表示受管集群已就绪。检查代理状态:
$ oc get agent -n <cluster_name>
使用
describe
命令,提供代理条件的深入描述。支持的状态包括BackendError
、InputError
、ValidationsFailing
、InFailed
和AgentIsConnected
。这些状态与Agent
和AgentClusterInstall
自定义资源相关。$ oc describe agent -n <cluster_name>
检查集群置备状态:
$ oc get agentclusterinstall -n <cluster_name>
使用
describe
命令提供集群置备状态的深入描述:$ oc describe agentclusterinstall -n <cluster_name>
检查受管集群的附加服务的状态:
$ oc get managedclusteraddon -n <cluster_name>
检索受管集群的
kubeconfig
文件的身份验证信息:$ oc get secret -n <cluster_name> <cluster_name>-admin-kubeconfig -o jsonpath={.data.kubeconfig} | base64 -d > <directory>/<cluster_name>-kubeconfig
17.5.6. 受管集群故障排除
使用这个流程诊断受管集群中可能出现的任何安装问题。
流程
检查受管集群的状态:
$ oc get managedcluster
输出示例
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE SNO-cluster true True True 2d19h
如果
AVAILABLE
列中的状态为True
,受管集群由 hub 管理。如果
AVAILABLE
列中的状态为Unknown
,则受管集群不会由 hub 管理。使用以下步骤继续检查 以了解更多信息。检查
AgentClusterInstall
安装状态:$ oc get clusterdeployment -n <cluster_name>
输出示例
NAME PLATFORM REGION CLUSTERTYPE INSTALLED INFRAID VERSION POWERSTATE AGE Sno0026 agent-baremetal false Initialized 2d14h
如果
INSTALLED
列中的状态为false
,则安装会失败。如果安装失败,请输入以下命令查看
AgentClusterInstall
资源的状态:$ oc describe agentclusterinstall -n <cluster_name> <cluster_name>
解决错误并重置集群:
删除集群的受管集群资源:
$ oc delete managedcluster <cluster_name>
删除集群的命名空间:
$ oc delete namespace <cluster_name>
这会删除为此集群创建的所有命名空间范围自定义资源。您必须等待
ManagedCluster
CR 删除完成,然后才能继续。- 为受管集群重新创建自定义资源。
17.5.7. RHACM 生成的集群安装 CR 参考
Red Hat Advanced Cluster Management (RHACM)支持在每个站点的 SiteConfig
CR 上部署 OpenShift Container Platform,以及带有特定安装自定义资源 (CR) 的 OpenShift Container Platform。
每个受管集群都有自己的命名空间,除 ManagedCluster
和 ClusterImageSet
以外的所有安装 CR 都位于该命名空间中。ManagedCluster
和 ClusterImageSet
是集群范围的,而不是命名空间范围的。命名空间和 CR 名称与集群名称匹配。
下表列出了在使用您配置的 SiteConfig
CR 安装集群时 RHACM 辅助服务自动应用的安装 CR。
CR | 描述 | 使用方法 |
---|---|---|
| 包含目标裸机主机 Baseboard Management Controller(BMC)的连接信息。 | 提供对 BMC 的访问,以使用 Redfish 协议在目标服务器上加载和启动发现镜像。 |
| 包含在目标裸机主机上安装 OpenShift Container Platform 的信息。 |
与 |
|
指定管理集群配置的详情,如网络和 control plane 节点的数量。安装完成后,显示集群 | 指定受管集群配置信息,并在安装集群期间提供状态。 |
|
引用要使用的 |
与 |
|
提供网络配置信息,如 | 为受管集群的 Kube API 服务器设置静态 IP 地址。 |
| 包含有关目标裸机主机的硬件信息。 | 当目标机器的发现镜像引导时,在 hub 上自动创建。 |
| 当集群由 hub 管理时,必须导入并已知的集群。此 Kubernetes 对象提供该接口。 | hub 使用这个资源来管理和显示受管集群的状态。 |
|
包含要部署到 |
告知 hub 部署到 |
|
hub 上已存在的 |
将资源传播到 |
|
创建两个 CR: |
|
| 包含 OpenShift Container Platform 镜像信息,如存储库和镜像名称。 | 传递给资源以提供 OpenShift Container Platform 镜像。 |
17.6. 推荐的 vDU 应用程序工作负载的单节点 OpenShift 集群配置
使用以下引用信息,了解在集群中部署虚拟分布式单元 (vDU) 应用程序所需的单节点 OpenShift 配置。配置包括用于高性能工作负载的集群优化、启用工作负载分区以及最大程度减少安装后所需的重启数量。
其他资源
- 要手动部署单个集群,请参阅使用 ZTP 手动安装单节点 OpenShift 集群。
- 要使用 GitOps 零接触置备 (ZTP) 部署集群集合,请参阅使用 ZTP 部署边缘站点。
17.6.1. 在 OpenShift Container Platform 上运行低延迟应用程序
OpenShift Container Platform 通过使用几个技术和专用硬件设备,为在商业现成 (COTS) 硬件上运行的应用程序启用低延迟处理:
- RHCOS 的实时内核
- 确保以高度的进程确定性处理工作负载。
- CPU 隔离
- 避免 CPU 调度延迟并确保 CPU 容量一致可用。
- NUMA 感知拓扑管理
- 将内存和巨页与 CPU 和 PCI 设备对齐,以将容器内存和巨页固定到非统一内存访问(NUMA)节点。所有服务质量 (QoS) 类的 Pod 资源保留在同一个 NUMA 节点上。这可降低延迟并提高节点的性能。
- 巨页内存管理
- 使用巨页大小可减少访问页表所需的系统资源量,从而提高系统性能。
- 使用 PTP 进行精确计时同步
- 允许以子微秒的准确性在网络中的节点之间进行同步。
17.6.2. vDU 应用程序工作负载的推荐集群主机要求
运行 vDU 应用程序工作负载需要一个具有足够资源的裸机主机来运行 OpenShift Container Platform 服务和生产工作负载。
profile | vCPU | memory | Storage |
---|---|---|---|
最小值 | 4 到 8 个 vCPU 内核 | 32GB RAM | 120GB |
当未启用并发多线程 (SMT) 或超线程时,一个 vCPU 相当于一个物理内核。启用后,使用以下公式来计算对应的比率:
- (每个内核的线程数 x 内核数)x 插槽数 = vCPU
使用虚拟介质引导时,服务器必须具有基板管理控制器(BMC)。
17.6.3. 为低延迟和高性能配置主机固件
裸机主机需要在置备主机前配置固件。固件配置取决于您的特定硬件和安装的具体要求。
流程
-
将 UEFI/BIOS Boot Mode 设置为
UEFI
。 - 在主机引导顺序中,设置 Hard drive first。
为您的硬件应用特定的固件配置。下表描述了 Intel Xeon Skylake 或 Intel Cascade Lake 服务器的代表固件配置,它基于 Intel FlexRAN 4G 和 5G 基带 PHY 参考设计。
重要确切的固件配置取决于您的特定硬件和网络要求。以下示例配置仅用于说明目的。
表 17.7. Intel Xeon Skylake 或 Cascade Lake 服务器的固件配置示例 固件设置 配置 CPU Power 和性能策略
性能
非核心频率扩展
Disabled
性能限制
Disabled
增强的 Intel SpeedStep ® Tech
Enabled
Intel 配置的 TDP
Enabled
可配置 TDP 级别
2 级
Intel® Turbo Boost Technology
Enabled
节能 Turbo
Disabled
硬件 P-State
Disabled
软件包 C-State
C0/C1 状态
C1E
Disabled
处理器 C6
Disabled
在主机的固件中启用全局 SR-IOV 和 VT-d 设置。这些设置与裸机环境相关。
17.6.4. 受管集群网络的连接先决条件
在安装并置备带有零接触置备 (ZTP) GitOps 管道的受管集群前,受管集群主机必须满足以下网络先决条件:
- hub 集群中的 ZTP GitOps 容器和目标裸机主机的 Baseboard Management Controller (BMC) 之间必须有双向连接。
受管集群必须能够解析和访问 hub 主机名和
*.apps
主机名的 API 主机名。以下是 hub 和*.apps
主机名的 API 主机名示例:-
api.hub-cluster.internal.domain.com
-
console-openshift-console.apps.hub-cluster.internal.domain.com
-
hub 集群必须能够解析并访问受管集群的 API 和
*.app
主机名。以下是受管集群的 API 主机名和*.apps
主机名示例:-
api.sno-managed-cluster-1.internal.domain.com
-
console-openshift-console.apps.sno-managed-cluster-1.internal.domain.com
-
17.6.5. 使用 GitOps ZTP 在单节点 OpenShift 中的工作负载分区
工作负载分区配置 OpenShift Container Platform 服务、集群管理工作负载和基础架构 pod,以便在保留数量的主机 CPU 上运行。
要使用 GitOps ZTP 配置工作负载分区,您可以使用 SiteConfig
自定义资源 (CR) 的 cpuset
字段指定集群管理 CPU 资源,以及组 PolicyGenTemplate
CR 的 reserved
字段。GitOps ZTP 管道使用这些值来填充工作负载分区 MachineConfig
CR (cpuset
) 和配置单节点 OpenShift 集群的 PerformanceProfile
CR (reserved
)中的所需字段。
为了获得最佳性能,请确保 reserved
和 isolated
CPU 集不在 NUMA 区域间共享 CPU 内核。
-
MachineConfig
CR 的工作负载分区将 OpenShift Container Platform 基础架构 pod 固定到定义的cpuset
配置。 -
PerformanceProfile
CR 将 systemd 服务固定到保留的 CPU 中。
PerformanceProfile
CR 中指定的 保留
字段的值必须与工作负载分区 MachineConfig
CR 中的 cpuset
字段匹配。
其他资源
- 有关推荐的单节点 OpenShift 工作负载分区配置,请参阅 Workload partitioning。
17.6.6. 推荐的安装时集群配置
ZTP 管道在集群安装过程中应用以下自定义资源 (CR)。这些配置 CR 确保集群满足运行 vDU 应用程序所需的功能和性能要求。
当将 ZTP GitOps 插件和 SiteConfig
CR 用于集群部署时,默认包含以下 MachineConfig
CR。
使用 SiteConfig
extraManifests
过滤器更改默认包括的 CR。如需更多信息,请参阅使用 SiteConfig CR 的高级受管集群配置。
17.6.6.1. 工作负载分区
运行 DU 工作负载的单节点 OpenShift 集群需要工作负载分区。这限制了运行平台服务的内核数,从而最大程度提高应用程序有效负载的 CPU 内核。
工作负载分区只能在集群安装过程中启用。您不能在安装后禁用工作负载分区。但是,您可以通过更新您在性能配置集中定义的 cpu
值以及相关的 MachineConfig
自定义资源 (CR) 来重新配置工作负载分区。
启用工作负载分区的 base64 编码的 CR,它包含管理工作负载受限制的 CPU 集。为 base64 中的
crio.conf
和kubelet.conf
对特定于主机的值进行编码。调整内容以匹配集群性能配置集中指定的 CPU 集。它必须与集群主机中的内核数匹配。推荐的工作负载分区配置
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 02-master-workload-partitioning spec: config: ignition: version: 3.2.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,W2NyaW8ucnVudGltZS53b3JrbG9hZHMubWFuYWdlbWVudF0KYWN0aXZhdGlvbl9hbm5vdGF0aW9uID0gInRhcmdldC53b3JrbG9hZC5vcGVuc2hpZnQuaW8vbWFuYWdlbWVudCIKYW5ub3RhdGlvbl9wcmVmaXggPSAicmVzb3VyY2VzLndvcmtsb2FkLm9wZW5zaGlmdC5pbyIKcmVzb3VyY2VzID0geyAiY3B1c2hhcmVzIiA9IDAsICJjcHVzZXQiID0gIjAtMSw1Mi01MyIgfQo= mode: 420 overwrite: true path: /etc/crio/crio.conf.d/01-workload-partitioning user: name: root - contents: source: data:text/plain;charset=utf-8;base64,ewogICJtYW5hZ2VtZW50IjogewogICAgImNwdXNldCI6ICIwLTEsNTItNTMiCiAgfQp9Cg== mode: 420 overwrite: true path: /etc/kubernetes/openshift-workload-pinning user: name: root
在集群主机上配置时,
/etc/crio/crio.conf.d/01-workload-partitioning
的内容应该类似如下:[crio.runtime.workloads.management] activation_annotation = "target.workload.openshift.io/management" annotation_prefix = "resources.workload.openshift.io" resources = { "cpushares" = 0, "cpuset" = "0-1,52-53" } 1
- 1
cpuset
值因安装而异。如果启用了超线程,请为每个内核指定两个线程。cpuset
值必须与您在性能配置集中的spec.cpu.reserved
字段中定义的保留 CPU 匹配。
在集群中配置时,
/etc/kubernetes/openshift-workload-pinning
的内容应如下所示:{ "management": { "cpuset": "0-1,52-53" 1 } }
- 1
cpuset
必须与/etc/crio/crio.conf.d/01-workload-partitioning
中的cpuset
值匹配。
验证
检查应用程序和集群系统 CPU 固定是否正确。运行以下命令:
打开到受管集群的远程 shell 连接:
$ oc debug node/example-sno-1
检查 OpenShift 基础架构应用程序 CPU 固定是否正确:
sh-4.4# pgrep ovn | while read i; do taskset -cp $i; done
输出示例
pid 8481's current affinity list: 0-1,52-53 pid 8726's current affinity list: 0-1,52-53 pid 9088's current affinity list: 0-1,52-53 pid 9945's current affinity list: 0-1,52-53 pid 10387's current affinity list: 0-1,52-53 pid 12123's current affinity list: 0-1,52-53 pid 13313's current affinity list: 0-1,52-53
检查系统应用程序 CPU 固定是否正确:
sh-4.4# pgrep systemd | while read i; do taskset -cp $i; done
输出示例
pid 1's current affinity list: 0-1,52-53 pid 938's current affinity list: 0-1,52-53 pid 962's current affinity list: 0-1,52-53 pid 1197's current affinity list: 0-1,52-53
17.6.6.2. 减少平台管理占用空间
要减少平台的整体管理空间,需要一个 MachineConfig
自定义资源 (CR),它将所有特定于 Kubernetes 的挂载点放在独立于主机操作系统的新命名空间中。以下 base64 编码的示例 MachineConfig
CR 演示了此配置。
推荐的容器挂载命名空间配置
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: container-mount-namespace-and-kubelet-conf-master spec: config: ignition: version: 3.2.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKCmRlYnVnKCkgewogIGVjaG8gJEAgPiYyCn0KCnVzYWdlKCkgewogIGVjaG8gVXNhZ2U6ICQoYmFzZW5hbWUgJDApIFVOSVQgW2VudmZpbGUgW3Zhcm5hbWVdXQogIGVjaG8KICBlY2hvIEV4dHJhY3QgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaXJzdCBFeGVjU3RhcnQgc3RhbnphIGZyb20gdGhlIGdpdmVuIHN5c3RlbWQgdW5pdCBhbmQgcmV0dXJuIGl0IHRvIHN0ZG91dAogIGVjaG8KICBlY2hvICJJZiAnZW52ZmlsZScgaXMgcHJvdmlkZWQsIHB1dCBpdCBpbiB0aGVyZSBpbnN0ZWFkLCBhcyBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBuYW1lZCAndmFybmFtZSciCiAgZWNobyAiRGVmYXVsdCAndmFybmFtZScgaXMgRVhFQ1NUQVJUIGlmIG5vdCBzcGVjaWZpZWQiCiAgZXhpdCAxCn0KClVOSVQ9JDEKRU5WRklMRT0kMgpWQVJOQU1FPSQzCmlmIFtbIC16ICRVTklUIHx8ICRVTklUID09ICItLWhlbHAiIHx8ICRVTklUID09ICItaCIgXV07IHRoZW4KICB1c2FnZQpmaQpkZWJ1ZyAiRXh0cmFjdGluZyBFeGVjU3RhcnQgZnJvbSAkVU5JVCIKRklMRT0kKHN5c3RlbWN0bCBjYXQgJFVOSVQgfCBoZWFkIC1uIDEpCkZJTEU9JHtGSUxFI1wjIH0KaWYgW1sgISAtZiAkRklMRSBdXTsgdGhlbgogIGRlYnVnICJGYWlsZWQgdG8gZmluZCByb290IGZpbGUgZm9yIHVuaXQgJFVOSVQgKCRGSUxFKSIKICBleGl0CmZpCmRlYnVnICJTZXJ2aWNlIGRlZmluaXRpb24gaXMgaW4gJEZJTEUiCkVYRUNTVEFSVD0kKHNlZCAtbiAtZSAnL15FeGVjU3RhcnQ9LipcXCQvLC9bXlxcXSQvIHsgcy9eRXhlY1N0YXJ0PS8vOyBwIH0nIC1lICcvXkV4ZWNTdGFydD0uKlteXFxdJC8geyBzL15FeGVjU3RhcnQ9Ly87IHAgfScgJEZJTEUpCgppZiBbWyAkRU5WRklMRSBdXTsgdGhlbgogIFZBUk5BTUU9JHtWQVJOQU1FOi1FWEVDU1RBUlR9CiAgZWNobyAiJHtWQVJOQU1FfT0ke0VYRUNTVEFSVH0iID4gJEVOVkZJTEUKZWxzZQogIGVjaG8gJEVYRUNTVEFSVApmaQo= mode: 493 path: /usr/local/bin/extractExecStart - contents: source: data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKbnNlbnRlciAtLW1vdW50PS9ydW4vY29udGFpbmVyLW1vdW50LW5hbWVzcGFjZS9tbnQgIiRAIgo= mode: 493 path: /usr/local/bin/nsenterCmns systemd: units: - contents: | [Unit] Description=Manages a mount namespace that both kubelet and crio can use to share their container-specific mounts [Service] Type=oneshot RemainAfterExit=yes RuntimeDirectory=container-mount-namespace Environment=RUNTIME_DIRECTORY=%t/container-mount-namespace Environment=BIND_POINT=%t/container-mount-namespace/mnt ExecStartPre=bash -c "findmnt ${RUNTIME_DIRECTORY} || mount --make-unbindable --bind ${RUNTIME_DIRECTORY} ${RUNTIME_DIRECTORY}" ExecStartPre=touch ${BIND_POINT} ExecStart=unshare --mount=${BIND_POINT} --propagation slave mount --make-rshared / ExecStop=umount -R ${RUNTIME_DIRECTORY} enabled: true name: container-mount-namespace.service - dropins: - contents: | [Unit] Wants=container-mount-namespace.service After=container-mount-namespace.service [Service] ExecStartPre=/usr/local/bin/extractExecStart %n /%t/%N-execstart.env ORIG_EXECSTART EnvironmentFile=-/%t/%N-execstart.env ExecStart= ExecStart=bash -c "nsenter --mount=%t/container-mount-namespace/mnt \ ${ORIG_EXECSTART}" name: 90-container-mount-namespace.conf name: crio.service - dropins: - contents: | [Unit] Wants=container-mount-namespace.service After=container-mount-namespace.service [Service] ExecStartPre=/usr/local/bin/extractExecStart %n /%t/%N-execstart.env ORIG_EXECSTART EnvironmentFile=-/%t/%N-execstart.env ExecStart= ExecStart=bash -c "nsenter --mount=%t/container-mount-namespace/mnt \ ${ORIG_EXECSTART} --housekeeping-interval=30s" name: 90-container-mount-namespace.conf - contents: | [Service] Environment="OPENSHIFT_MAX_HOUSEKEEPING_INTERVAL_DURATION=60s" Environment="OPENSHIFT_EVICTION_MONITORING_PERIOD_DURATION=30s" name: 30-kubelet-interval-tuning.conf name: kubelet.service
17.6.6.3. SCTP
流控制传输协议 (SCTP) 是在 RAN 应用程序中使用的密钥协议。此 MachineConfig
对象向节点添加 SCTP 内核模块以启用此协议。
推荐的 SCTP 配置
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: load-sctp-module spec: config: ignition: version: 2.2.0 storage: files: - contents: source: data:, verification: {} filesystem: root mode: 420 path: /etc/modprobe.d/sctp-blacklist.conf - contents: source: data:text/plain;charset=utf-8,sctp filesystem: root mode: 420 path: /etc/modules-load.d/sctp-load.conf
17.6.6.4. 加速容器启动
以下 MachineConfig
CR 配置 OpenShift 核心进程和容器,以便在系统启动和关闭过程中使用所有可用的 CPU 内核。这会加快初始引导过程和重启过程中的系统恢复。
推荐的容器启动配置
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 04-accelerated-container-startup-master spec: config: ignition: version: 3.2.0 storage: files: - contents: source: data:text/plain;charset=utf-8;base64,IyEvYmluL2Jhc2gKIwojIFRlbXBvcmFyaWx5IHJlc2V0IHRoZSBjb3JlIHN5c3RlbSBwcm9jZXNzZXMncyBDUFUgYWZmaW5pdHkgdG8gYmUgdW5yZXN0cmljdGVkIHRvIGFjY2VsZXJhdGUgc3RhcnR1cCBhbmQgc2h1dGRvd24KIwojIFRoZSBkZWZhdWx0cyBiZWxvdyBjYW4gYmUgb3ZlcnJpZGRlbiB2aWEgZW52aXJvbm1lbnQgdmFyaWFibGVzCiMKCiMgVGhlIGRlZmF1bHQgc2V0IG9mIGNyaXRpY2FsIHByb2Nlc3NlcyB3aG9zZSBhZmZpbml0eSBzaG91bGQgYmUgdGVtcG9yYXJpbHkgdW5ib3VuZDoKQ1JJVElDQUxfUFJPQ0VTU0VTPSR7Q1JJVElDQUxfUFJPQ0VTU0VTOi0iY3JpbyBrdWJlbGV0IE5ldHdvcmtNYW5hZ2VyIGNvbm1vbiBkYnVzIn0KCiMgRGVmYXVsdCB3YWl0IHRpbWUgaXMgNjAwcyA9IDEwbToKTUFYSU1VTV9XQUlUX1RJTUU9JHtNQVhJTVVNX1dBSVRfVElNRTotNjAwfQoKIyBEZWZhdWx0IHN0ZWFkeS1zdGF0ZSB0aHJlc2hvbGQgPSAyJQojIEFsbG93ZWQgdmFsdWVzOgojICA0ICAtIGFic29sdXRlIHBvZCBjb3VudCAoKy8tKQojICA0JSAtIHBlcmNlbnQgY2hhbmdlICgrLy0pCiMgIC0xIC0gZGlzYWJsZSB0aGUgc3RlYWR5LXN0YXRlIGNoZWNrClNURUFEWV9TVEFURV9USFJFU0hPTEQ9JHtTVEVBRFlfU1RBVEVfVEhSRVNIT0xEOi0yJX0KCiMgRGVmYXVsdCBzdGVhZHktc3RhdGUgd2luZG93ID0gNjBzCiMgSWYgdGhlIHJ1bm5pbmcgcG9kIGNvdW50IHN0YXlzIHdpdGhpbiB0aGUgZ2l2ZW4gdGhyZXNob2xkIGZvciB0aGlzIHRpbWUKIyBwZXJpb2QsIHJldHVybiBDUFUgdXRpbGl6YXRpb24gdG8gbm9ybWFsIGJlZm9yZSB0aGUgbWF4aW11bSB3YWl0IHRpbWUgaGFzCiMgZXhwaXJlcwpTVEVBRFlfU1RBVEVfV0lORE9XPSR7U1RFQURZX1NUQVRFX1dJTkRPVzotNjB9CgojIERlZmF1bHQgc3RlYWR5LXN0YXRlIGFsbG93cyBhbnkgcG9kIGNvdW50IHRvIGJlICJzdGVhZHkgc3RhdGUiCiMgSW5jcmVhc2luZyB0aGlzIHdpbGwgc2tpcCBhbnkgc3RlYWR5LXN0YXRlIGNoZWNrcyB1bnRpbCB0aGUgY291bnQgcmlzZXMgYWJvdmUKIyB0aGlzIG51bWJlciB0byBhdm9pZCBmYWxzZSBwb3NpdGl2ZXMgaWYgdGhlcmUgYXJlIHNvbWUgcGVyaW9kcyB3aGVyZSB0aGUKIyBjb3VudCBkb2Vzbid0IGluY3JlYXNlIGJ1dCB3ZSBrbm93IHdlIGNhbid0IGJlIGF0IHN0ZWFkeS1zdGF0ZSB5ZXQuClNURUFEWV9TVEFURV9NSU5JTVVNPSR7U1RFQURZX1NUQVRFX01JTklNVU06LTB9CgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCgpLVUJFTEVUX0NQVV9TVEFURT0vdmFyL2xpYi9rdWJlbGV0L2NwdV9tYW5hZ2VyX3N0YXRlCkZVTExfQ1BVX1NUQVRFPS9zeXMvZnMvY2dyb3VwL2NwdXNldC9jcHVzZXQuY3B1cwpLVUJFTEVUX0NPTkY9L2V0Yy9rdWJlcm5ldGVzL2t1YmVsZXQuY29uZgp1bnJlc3RyaWN0ZWRDcHVzZXQoKSB7CiAgbG9jYWwgY3B1cwogIGlmIFtbIC1lICRLVUJFTEVUX0NQVV9TVEFURSBdXTsgdGhlbgogICAgY3B1cz0kKGpxIC1yICcuZGVmYXVsdENwdVNldCcgPCRLVUJFTEVUX0NQVV9TVEFURSkKICAgIGlmIFtbIC1uICIke2NwdXN9IiAmJiAtZSAke0tVQkVMRVRfQ09ORn0gXV07IHRoZW4KICAgICAgcmVzZXJ2ZWRfY3B1cz0kKGpxIC1yICcucmVzZXJ2ZWRTeXN0ZW1DUFVzJyA8L2V0Yy9rdWJlcm5ldGVzL2t1YmVsZXQuY29uZikKICAgICAgaWYgW1sgLW4gIiR7cmVzZXJ2ZWRfY3B1c30iIF1dOyB0aGVuCiAgICAgICAgIyBVc2UgdGFza3NldCB0byBtZXJnZSB0aGUgdHdvIGNwdXNldHMKICAgICAgICBjcHVzPSQodGFza3NldCAtYyAiJHtyZXNlcnZlZF9jcHVzfSwke2NwdXN9IiBncmVwIC1pIENwdXNfYWxsb3dlZF9saXN0IC9wcm9jL3NlbGYvc3RhdHVzIHwgYXdrICd7cHJpbnQgJDJ9JykKICAgICAgZmkKICAgIGZpCiAgZmkKICBpZiBbWyAteiAkY3B1cyBdXTsgdGhlbgogICAgIyBmYWxsIGJhY2sgdG8gdXNpbmcgYWxsIGNwdXMgaWYgdGhlIGt1YmVsZXQgc3RhdGUgaXMgbm90IGNvbmZpZ3VyZWQgeWV0CiAgICBbWyAtZSAkRlVMTF9DUFVfU1RBVEUgXV0gfHwgcmV0dXJuIDEKICAgIGNwdXM9JCg8JEZVTExfQ1BVX1NUQVRFKQogIGZpCiAgZWNobyAkY3B1cwp9CgpyZXN0cmljdGVkQ3B1c2V0KCkgewogIGZvciBhcmcgaW4gJCg8L3Byb2MvY21kbGluZSk7IGRvCiAgICBpZiBbWyAkYXJnID1+IF5zeXN0ZW1kLmNwdV9hZmZpbml0eT0gXV07IHRoZW4KICAgICAgZWNobyAke2FyZyMqPX0KICAgICAgcmV0dXJuIDAKICAgIGZpCiAgZG9uZQogIHJldHVybiAxCn0KCnJlc2V0QWZmaW5pdHkoKSB7CiAgbG9jYWwgY3B1c2V0PSIkMSIKICBsb2NhbCBmYWlsY291bnQ9MAogIGxvY2FsIHN1Y2Nlc3Njb3VudD0wCiAgbG9nZ2VyICJSZWNvdmVyeTogU2V0dGluZyBDUFUgYWZmaW5pdHkgZm9yIGNyaXRpY2FsIHByb2Nlc3NlcyBcIiRDUklUSUNBTF9QUk9DRVNTRVNcIiB0byAkY3B1c2V0IgogIGZvciBwcm9jIGluICRDUklUSUNBTF9QUk9DRVNTRVM7IGRvCiAgICBsb2NhbCBwaWRzPSIkKHBncmVwICRwcm9jKSIKICAgIGZvciBwaWQgaW4gJHBpZHM7IGRvCiAgICAgIGxvY2FsIHRhc2tzZXRPdXRwdXQKICAgICAgdGFza3NldE91dHB1dD0iJCh0YXNrc2V0IC1hcGMgIiRjcHVzZXQiICRwaWQgMj4mMSkiCiAgICAgIGlmIFtbICQ/IC1uZSAwIF1dOyB0aGVuCiAgICAgICAgZWNobyAiRVJST1I6ICR0YXNrc2V0T3V0cHV0IgogICAgICAgICgoZmFpbGNvdW50KyspKQogICAgICBlbHNlCiAgICAgICAgKChzdWNjZXNzY291bnQrKykpCiAgICAgIGZpCiAgICBkb25lCiAgZG9uZQoKICBsb2dnZXIgIlJlY292ZXJ5OiBSZS1hZmZpbmVkICRzdWNjZXNzY291bnQgcGlkcyBzdWNjZXNzZnVsbHkiCiAgaWYgW1sgJGZhaWxjb3VudCAtZ3QgMCBdXTsgdGhlbgogICAgbG9nZ2VyICJSZWNvdmVyeTogRmFpbGVkIHRvIHJlLWFmZmluZSAkZmFpbGNvdW50IHByb2Nlc3NlcyIKICAgIHJldHVybiAxCiAgZmkKfQoKc2V0VW5yZXN0cmljdGVkKCkgewogIGxvZ2dlciAiUmVjb3Zlcnk6IFNldHRpbmcgY3JpdGljYWwgc3lzdGVtIHByb2Nlc3NlcyB0byBoYXZlIHVucmVzdHJpY3RlZCBDUFUgYWNjZXNzIgogIHJlc2V0QWZmaW5pdHkgIiQodW5yZXN0cmljdGVkQ3B1c2V0KSIKfQoKc2V0UmVzdHJpY3RlZCgpIHsKICBsb2dnZXIgIlJlY292ZXJ5OiBSZXNldHRpbmcgY3JpdGljYWwgc3lzdGVtIHByb2Nlc3NlcyBiYWNrIHRvIG5vcm1hbGx5IHJlc3RyaWN0ZWQgYWNjZXNzIgogIHJlc2V0QWZmaW5pdHkgIiQocmVzdHJpY3RlZENwdXNldCkiCn0KCmN1cnJlbnRBZmZpbml0eSgpIHsKICBsb2NhbCBwaWQ9IiQxIgogIHRhc2tzZXQgLXBjICRwaWQgfCBhd2sgLUYnOiAnICd7cHJpbnQgJDJ9Jwp9Cgp3aXRoaW4oKSB7CiAgbG9jYWwgbGFzdD0kMSBjdXJyZW50PSQyIHRocmVzaG9sZD0kMwogIGxvY2FsIGRlbHRhPTAgcGNoYW5nZQogIGRlbHRhPSQoKCBjdXJyZW50IC0gbGFzdCApKQogIGlmIFtbICRjdXJyZW50IC1lcSAkbGFzdCBdXTsgdGhlbgogICAgcGNoYW5nZT0wCiAgZWxpZiBbWyAkbGFzdCAtZXEgMCBdXTsgdGhlbgogICAgcGNoYW5nZT0xMDAwMDAwCiAgZWxzZQogICAgcGNoYW5nZT0kKCggKCAkZGVsdGEgKiAxMDApIC8gbGFzdCApKQogIGZpCiAgZWNobyAtbiAibGFzdDokbGFzdCBjdXJyZW50OiRjdXJyZW50IGRlbHRhOiRkZWx0YSBwY2hhbmdlOiR7cGNoYW5nZX0lOiAiCiAgbG9jYWwgYWJzb2x1dGUgbGltaXQKICBjYXNlICR0aHJlc2hvbGQgaW4KICAgIColKQogICAgICBhYnNvbHV0ZT0ke3BjaGFuZ2UjIy19ICMgYWJzb2x1dGUgdmFsdWUKICAgICAgbGltaXQ9JHt0aHJlc2hvbGQlJSV9CiAgICAgIDs7CiAgICAqKQogICAgICBhYnNvbHV0ZT0ke2RlbHRhIyMtfSAjIGFic29sdXRlIHZhbHVlCiAgICAgIGxpbWl0PSR0aHJlc2hvbGQKICAgICAgOzsKICBlc2FjCiAgaWYgW1sgJGFic29sdXRlIC1sZSAkbGltaXQgXV07IHRoZW4KICAgIGVjaG8gIndpdGhpbiAoKy8tKSR0aHJlc2hvbGQiCiAgICByZXR1cm4gMAogIGVsc2UKICAgIGVjaG8gIm91dHNpZGUgKCsvLSkkdGhyZXNob2xkIgogICAgcmV0dXJuIDEKICBmaQp9CgpzdGVhZHlzdGF0ZSgpIHsKICBsb2NhbCBsYXN0PSQxIGN1cnJlbnQ9JDIKICBpZiBbWyAkbGFzdCAtbHQgJFNURUFEWV9TVEFURV9NSU5JTVVNIF1dOyB0aGVuCiAgICBlY2hvICJsYXN0OiRsYXN0IGN1cnJlbnQ6JGN1cnJlbnQgV2FpdGluZyB0byByZWFjaCAkU1RFQURZX1NUQVRFX01JTklNVU0gYmVmb3JlIGNoZWNraW5nIGZvciBzdGVhZHktc3RhdGUiCiAgICByZXR1cm4gMQogIGZpCiAgd2l0aGluICRsYXN0ICRjdXJyZW50ICRTVEVBRFlfU1RBVEVfVEhSRVNIT0xECn0KCndhaXRGb3JSZWFkeSgpIHsKICBsb2dnZXIgIlJlY292ZXJ5OiBXYWl0aW5nICR7TUFYSU1VTV9XQUlUX1RJTUV9cyBmb3IgdGhlIGluaXRpYWxpemF0aW9uIHRvIGNvbXBsZXRlIgogIGxvY2FsIGxhc3RTeXN0ZW1kQ3B1c2V0PSIkKGN1cnJlbnRBZmZpbml0eSAxKSIKICBsb2NhbCBsYXN0RGVzaXJlZENwdXNldD0iJCh1bnJlc3RyaWN0ZWRDcHVzZXQpIgogIGxvY2FsIHQ9MCBzPTEwCiAgbG9jYWwgbGFzdENjb3VudD0wIGNjb3VudD0wIHN0ZWFkeVN0YXRlVGltZT0wCiAgd2hpbGUgW1sgJHQgLWx0ICRNQVhJTVVNX1dBSVRfVElNRSBdXTsgZG8KICAgIHNsZWVwICRzCiAgICAoKHQgKz0gcykpCiAgICAjIFJlLWNoZWNrIHRoZSBjdXJyZW50IGFmZmluaXR5IG9mIHN5c3RlbWQsIGluIGNhc2Ugc29tZSBvdGhlciBwcm9jZXNzIGhhcyBjaGFuZ2VkIGl0CiAgICBsb2NhbCBzeXN0ZW1kQ3B1c2V0PSIkKGN1cnJlbnRBZmZpbml0eSAxKSIKICAgICMgUmUtY2hlY2sgdGhlIHVucmVzdHJpY3RlZCBDcHVzZXQsIGFzIHRoZSBhbGxvd2VkIHNldCBvZiB1bnJlc2VydmVkIGNvcmVzIG1heSBjaGFuZ2UgYXMgcG9kcyBhcmUgYXNzaWduZWQgdG8gY29yZXMKICAgIGxvY2FsIGRlc2lyZWRDcHVzZXQ9IiQodW5yZXN0cmljdGVkQ3B1c2V0KSIKICAgIGlmIFtbICRzeXN0ZW1kQ3B1c2V0ICE9ICRsYXN0U3lzdGVtZENwdXNldCB8fCAkbGFzdERlc2lyZWRDcHVzZXQgIT0gJGRlc2lyZWRDcHVzZXQgXV07IHRoZW4KICAgICAgcmVzZXRBZmZpbml0eSAiJGRlc2lyZWRDcHVzZXQiCiAgICAgIGxhc3RTeXN0ZW1kQ3B1c2V0PSIkKGN1cnJlbnRBZmZpbml0eSAxKSIKICAgICAgbGFzdERlc2lyZWRDcHVzZXQ9IiRkZXNpcmVkQ3B1c2V0IgogICAgZmkKCiAgICAjIERldGVjdCBzdGVhZHktc3RhdGUgcG9kIGNvdW50CiAgICBjY291bnQ9JChjcmljdGwgcHMgfCB3YyAtbCkKICAgIGlmIHN0ZWFkeXN0YXRlICRsYXN0Q2NvdW50ICRjY291bnQ7IHRoZW4KICAgICAgKChzdGVhZHlTdGF0ZVRpbWUgKz0gcykpCiAgICAgIGVjaG8gIlN0ZWFkeS1zdGF0ZSBmb3IgJHtzdGVhZHlTdGF0ZVRpbWV9cy8ke1NURUFEWV9TVEFURV9XSU5ET1d9cyIKICAgICAgaWYgW1sgJHN0ZWFkeVN0YXRlVGltZSAtZ2UgJFNURUFEWV9TVEFURV9XSU5ET1cgXV07IHRoZW4KICAgICAgICBsb2dnZXIgIlJlY292ZXJ5OiBTdGVhZHktc3RhdGUgKCsvLSAkU1RFQURZX1NUQVRFX1RIUkVTSE9MRCkgZm9yICR7U1RFQURZX1NUQVRFX1dJTkRPV31zOiBEb25lIgogICAgICAgIHJldHVybiAwCiAgICAgIGZpCiAgICBlbHNlCiAgICAgIGlmIFtbICRzdGVhZHlTdGF0ZVRpbWUgLWd0IDAgXV07IHRoZW4KICAgICAgICBlY2hvICJSZXNldHRpbmcgc3RlYWR5LXN0YXRlIHRpbWVyIgogICAgICAgIHN0ZWFkeVN0YXRlVGltZT0wCiAgICAgIGZpCiAgICBmaQogICAgbGFzdENjb3VudD0kY2NvdW50CiAgZG9uZQogIGxvZ2dlciAiUmVjb3Zlcnk6IFJlY292ZXJ5IENvbXBsZXRlIFRpbWVvdXQiCn0KCm1haW4oKSB7CiAgaWYgISB1bnJlc3RyaWN0ZWRDcHVzZXQgPiYvZGV2L251bGw7IHRoZW4KICAgIGxvZ2dlciAiUmVjb3Zlcnk6IE5vIHVucmVzdHJpY3RlZCBDcHVzZXQgY291bGQgYmUgZGV0ZWN0ZWQiCiAgICByZXR1cm4gMQogIGZpCgogIGlmICEgcmVzdHJpY3RlZENwdXNldCA+Ji9kZXYvbnVsbDsgdGhlbgogICAgbG9nZ2VyICJSZWNvdmVyeTogTm8gcmVzdHJpY3RlZCBDcHVzZXQgaGFzIGJlZW4gY29uZmlndXJlZC4gIFdlIGFyZSBhbHJlYWR5IHJ1bm5pbmcgdW5yZXN0cmljdGVkLiIKICAgIHJldHVybiAwCiAgZmkKCiAgIyBFbnN1cmUgd2UgcmVzZXQgdGhlIENQVSBhZmZpbml0eSB3aGVuIHdlIGV4aXQgdGhpcyBzY3JpcHQgZm9yIGFueSByZWFzb24KICAjIFRoaXMgd2F5IGVpdGhlciBhZnRlciB0aGUgdGltZXIgZXhwaXJlcyBvciBhZnRlciB0aGUgcHJvY2VzcyBpcyBpbnRlcnJ1cHRlZAogICMgdmlhIF5DIG9yIFNJR1RFUk0sIHdlIHJldHVybiB0aGluZ3MgYmFjayB0byB0aGUgd2F5IHRoZXkgc2hvdWxkIGJlLgogIHRyYXAgc2V0UmVzdHJpY3RlZCBFWElUCgogIGxvZ2dlciAiUmVjb3Zlcnk6IFJlY292ZXJ5IE1vZGUgU3RhcnRpbmciCiAgc2V0VW5yZXN0cmljdGVkCiAgd2FpdEZvclJlYWR5Cn0KCmlmIFtbICIke0JBU0hfU09VUkNFWzBdfSIgPSAiJHswfSIgXV07IHRoZW4KICBtYWluICIke0B9IgogIGV4aXQgJD8KZmkK mode: 493 path: /usr/local/bin/accelerated-container-startup.sh systemd: units: - contents: | [Unit] Description=Unlocks more CPUs for critical system processes during container startup [Service] Type=simple ExecStart=/usr/local/bin/accelerated-container-startup.sh # Maximum wait time is 600s = 10m: Environment=MAXIMUM_WAIT_TIME=600 # Steady-state threshold = 2% # Allowed values: # 4 - absolute pod count (+/-) # 4% - percent change (+/-) # -1 - disable the steady-state check # Note: '%' must be escaped as '%%' in systemd unit files Environment=STEADY_STATE_THRESHOLD=2%% # Steady-state window = 120s # If the running pod count stays within the given threshold for this time # period, return CPU utilization to normal before the maximum wait time has # expires Environment=STEADY_STATE_WINDOW=120 # Steady-state minimum = 40 # Increasing this will skip any steady-state checks until the count rises above # this number to avoid false positives if there are some periods where the # count doesn't increase but we know we can't be at steady-state yet. Environment=STEADY_STATE_MINIMUM=40 [Install] WantedBy=multi-user.target enabled: true name: accelerated-container-startup.service - contents: | [Unit] Description=Unlocks more CPUs for critical system processes during container shutdown DefaultDependencies=no [Service] Type=simple ExecStart=/usr/local/bin/accelerated-container-startup.sh # Maximum wait time is 600s = 10m: Environment=MAXIMUM_WAIT_TIME=600 # Steady-state threshold # Allowed values: # 4 - absolute pod count (+/-) # 4% - percent change (+/-) # -1 - disable the steady-state check # Note: '%' must be escaped as '%%' in systemd unit files Environment=STEADY_STATE_THRESHOLD=-1 # Steady-state window = 60s # If the running pod count stays within the given threshold for this time # period, return CPU utilization to normal before the maximum wait time has # expires Environment=STEADY_STATE_WINDOW=60 [Install] WantedBy=shutdown.target reboot.target halt.target enabled: true name: accelerated-container-shutdown.service
17.6.6.5. 使用 kdump 自动内核崩溃转储
当内核崩溃时,kdump
Linux 内核功能会创建一个内核崩溃转储。kdump
功能使用以下 MachineConfig
CR 启用。
推荐的 MachineConfig
CR 从 control plane kdump 日志中删除 ice 驱动程序 (05-kdump-config-master.yaml
)
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 05-kdump-config-master spec: config: ignition: version: 3.2.0 systemd: units: - enabled: true name: kdump-remove-ice-module.service contents: | [Unit] Description=Remove ice module when doing kdump Before=kdump.service [Service] Type=oneshot RemainAfterExit=true ExecStart=/usr/local/bin/kdump-remove-ice-module.sh [Install] WantedBy=multi-user.target storage: files: - contents: source: data:text/plain;charset=utf-8;base64,IyEvdXNyL2Jpbi9lbnYgYmFzaAoKIyBUaGlzIHNjcmlwdCByZW1vdmVzIHRoZSBpY2UgbW9kdWxlIGZyb20ga2R1bXAgdG8gcHJldmVudCBrZHVtcCBmYWlsdXJlcyBvbiBjZXJ0YWluIHNlcnZlcnMuCiMgVGhpcyBpcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBSSEVMUExBTi0xMzgyMzYgYW5kIGNhbiBiZSByZW1vdmVkIHdoZW4gdGhhdCBpc3N1ZSBpcwojIGZpeGVkLgoKc2V0IC14CgpTRUQ9Ii91c3IvYmluL3NlZCIKR1JFUD0iL3Vzci9iaW4vZ3JlcCIKCiMgb3ZlcnJpZGUgZm9yIHRlc3RpbmcgcHVycG9zZXMKS0RVTVBfQ09ORj0iJHsxOi0vZXRjL3N5c2NvbmZpZy9rZHVtcH0iClJFTU9WRV9JQ0VfU1RSPSJtb2R1bGVfYmxhY2tsaXN0PWljZSIKCiMgZXhpdCBpZiBmaWxlIGRvZXNuJ3QgZXhpc3QKWyAhIC1mICR7S0RVTVBfQ09ORn0gXSAmJiBleGl0IDAKCiMgZXhpdCBpZiBmaWxlIGFscmVhZHkgdXBkYXRlZAoke0dSRVB9IC1GcSAke1JFTU9WRV9JQ0VfU1RSfSAke0tEVU1QX0NPTkZ9ICYmIGV4aXQgMAoKIyBUYXJnZXQgbGluZSBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgojIEtEVU1QX0NPTU1BTkRMSU5FX0FQUEVORD0iaXJxcG9sbCBucl9jcHVzPTEgLi4uIGhlc3RfZGlzYWJsZSIKIyBVc2Ugc2VkIHRvIG1hdGNoIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgcXVvdGVzIGFuZCBhcHBlbmQgdGhlIFJFTU9WRV9JQ0VfU1RSIHRvIGl0CiR7U0VEfSAtaSAncy9eS0RVTVBfQ09NTUFORExJTkVfQVBQRU5EPSJbXiJdKi8mICcke1JFTU9WRV9JQ0VfU1RSfScvJyAke0tEVU1QX0NPTkZ9IHx8IGV4aXQgMAo= mode: 448 path: /usr/local/bin/kdump-remove-ice-module.sh
推荐的 control plane 节点 kdump 配置 (06-kdump-master.yaml
)
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: master name: 06-kdump-enable-master spec: config: ignition: version: 3.2.0 systemd: units: - enabled: true name: kdump.service kernelArguments: - crashkernel=512M
推荐的 MachineConfig
CR 从 worker 节点 kdump 日志中删除 ice 驱动程序 (05-kdump-config-worker.yaml
)
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 05-kdump-config-worker spec: config: ignition: version: 3.2.0 systemd: units: - enabled: true name: kdump-remove-ice-module.service contents: | [Unit] Description=Remove ice module when doing kdump Before=kdump.service [Service] Type=oneshot RemainAfterExit=true ExecStart=/usr/local/bin/kdump-remove-ice-module.sh [Install] WantedBy=multi-user.target storage: files: - contents: source: data:text/plain;charset=utf-8;base64,IyEvdXNyL2Jpbi9lbnYgYmFzaAoKIyBUaGlzIHNjcmlwdCByZW1vdmVzIHRoZSBpY2UgbW9kdWxlIGZyb20ga2R1bXAgdG8gcHJldmVudCBrZHVtcCBmYWlsdXJlcyBvbiBjZXJ0YWluIHNlcnZlcnMuCiMgVGhpcyBpcyBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciBSSEVMUExBTi0xMzgyMzYgYW5kIGNhbiBiZSByZW1vdmVkIHdoZW4gdGhhdCBpc3N1ZSBpcwojIGZpeGVkLgoKc2V0IC14CgpTRUQ9Ii91c3IvYmluL3NlZCIKR1JFUD0iL3Vzci9iaW4vZ3JlcCIKCiMgb3ZlcnJpZGUgZm9yIHRlc3RpbmcgcHVycG9zZXMKS0RVTVBfQ09ORj0iJHsxOi0vZXRjL3N5c2NvbmZpZy9rZHVtcH0iClJFTU9WRV9JQ0VfU1RSPSJtb2R1bGVfYmxhY2tsaXN0PWljZSIKCiMgZXhpdCBpZiBmaWxlIGRvZXNuJ3QgZXhpc3QKWyAhIC1mICR7S0RVTVBfQ09ORn0gXSAmJiBleGl0IDAKCiMgZXhpdCBpZiBmaWxlIGFscmVhZHkgdXBkYXRlZAoke0dSRVB9IC1GcSAke1JFTU9WRV9JQ0VfU1RSfSAke0tEVU1QX0NPTkZ9ICYmIGV4aXQgMAoKIyBUYXJnZXQgbGluZSBsb29rcyBzb21ldGhpbmcgbGlrZSB0aGlzOgojIEtEVU1QX0NPTU1BTkRMSU5FX0FQUEVORD0iaXJxcG9sbCBucl9jcHVzPTEgLi4uIGhlc3RfZGlzYWJsZSIKIyBVc2Ugc2VkIHRvIG1hdGNoIGV2ZXJ5dGhpbmcgYmV0d2VlbiB0aGUgcXVvdGVzIGFuZCBhcHBlbmQgdGhlIFJFTU9WRV9JQ0VfU1RSIHRvIGl0CiR7U0VEfSAtaSAncy9eS0RVTVBfQ09NTUFORExJTkVfQVBQRU5EPSJbXiJdKi8mICcke1JFTU9WRV9JQ0VfU1RSfScvJyAke0tEVU1QX0NPTkZ9IHx8IGV4aXQgMAo= mode: 448 path: /usr/local/bin/kdump-remove-ice-module.sh
推荐的 kdump worker 节点配置 (06-kdump-worker.yaml
)
apiVersion: machineconfiguration.openshift.io/v1 kind: MachineConfig metadata: labels: machineconfiguration.openshift.io/role: worker name: 06-kdump-enable-worker spec: config: ignition: version: 3.2.0 systemd: units: - enabled: true name: kdump.service kernelArguments: - crashkernel=512M
17.6.7. 推荐的安装后集群配置
当集群安装完成后,ZTP 管道会应用运行 DU 工作负载所需的以下自定义资源 (CR)。
在 {ztp} v4.10 及更早版本中,您可以使用 MachineConfig
CR 配置 UEFI 安全引导。{ztp} v4.11 及之后的版本不再需要。在 v4.11 中,您可以通过更新用于安装集群的 SiteConfig
CR 中的 spec.clusters.nodes.bootMode
字段来为单节点 OpenShift 集群配置 UEFI 安全引导。如需更多信息,请参阅使用 SiteConfig 和 {ztp} 部署受管集群。
17.6.7.1. Operator 命名空间和 Operator 组
运行 DU 工作负载的单节点 OpenShift 集群需要以下 OperatorGroup
和 Namespace
自定义资源 (CR):
- Local Storage Operator
- Logging Operator
- PTP Operator
- Cluster Network Operator
以下 YAML 总结了这些 CR:
推荐的 Operator 命名空间和 OperatorGroup 配置
apiVersion: v1 kind: Namespace metadata: annotations: workload.openshift.io/allowed: management name: openshift-local-storage --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: openshift-local-storage namespace: openshift-local-storage spec: targetNamespaces: - openshift-local-storage --- apiVersion: v1 kind: Namespace metadata: annotations: workload.openshift.io/allowed: management name: openshift-logging --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: cluster-logging namespace: openshift-logging spec: targetNamespaces: - openshift-logging --- apiVersion: v1 kind: Namespace metadata: annotations: workload.openshift.io/allowed: management labels: openshift.io/cluster-monitoring: "true" name: openshift-ptp --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: ptp-operators namespace: openshift-ptp spec: targetNamespaces: - openshift-ptp --- apiVersion: v1 kind: Namespace metadata: annotations: workload.openshift.io/allowed: management name: openshift-sriov-network-operator --- apiVersion: operators.coreos.com/v1 kind: OperatorGroup metadata: name: sriov-network-operators namespace: openshift-sriov-network-operator spec: targetNamespaces: - openshift-sriov-network-operator
17.6.7.2. Operator 订阅
运行 DU 工作负载的单节点 OpenShift 集群需要以下 Subscription
CR。订阅提供下载以下 Operator 的位置:
- Local Storage Operator
- Logging Operator
- PTP Operator
- Cluster Network Operator
推荐的 Operator 订阅
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: cluster-logging namespace: openshift-logging spec: channel: "stable" 1 name: cluster-logging source: redhat-operators sourceNamespace: openshift-marketplace installPlanApproval: Manual 2 --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: local-storage-operator namespace: openshift-local-storage spec: channel: "stable" installPlanApproval: Automatic name: local-storage-operator source: redhat-operators sourceNamespace: openshift-marketplace installPlanApproval: Manual --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: ptp-operator-subscription namespace: openshift-ptp spec: channel: "stable" name: ptp-operator source: redhat-operators sourceNamespace: openshift-marketplace installPlanApproval: Manual --- apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: sriov-network-operator-subscription namespace: openshift-sriov-network-operator spec: channel: "stable" name: sriov-network-operator source: redhat-operators sourceNamespace: openshift-marketplace installPlanApproval: Manual
17.6.7.3. 集群日志记录和日志转发
运行 DU 工作负载的单节点 OpenShift 集群需要日志记录和日志转发以进行调试。以下示例 YAML 演示了所需的 ClusterLogging
和 ClusterLogForwarder
CR。
推荐的集群日志记录和日志转发配置
apiVersion: logging.openshift.io/v1 kind: ClusterLogging 1 metadata: name: instance namespace: openshift-logging spec: collection: logs: fluentd: {} type: fluentd curation: type: "curator" curator: schedule: "30 3 * * *" managementState: Managed --- apiVersion: logging.openshift.io/v1 kind: ClusterLogForwarder 2 metadata: name: instance namespace: openshift-logging spec: inputs: - infrastructure: {} name: infra-logs outputs: - name: kafka-open type: kafka url: tcp://10.46.55.190:9092/test 3 pipelines: - inputRefs: - audit name: audit-logs outputRefs: - kafka-open - inputRefs: - infrastructure name: infrastructure-logs outputRefs: - kafka-open
17.6.7.4. 性能配置集
运行 DU 工作负载的单节点 OpenShift 集群需要 Node Tuning Operator 性能配置集才能使用实时主机功能和服务。
在早期版本的 OpenShift Container Platform 中,Performance Addon Operator 用来实现自动性能优化,以便为 OpenShift 应用程序实现低延迟性能。在 OpenShift Container Platform 4.11 及更新的版本中,这个功能是 Node Tuning Operator 的一部分。
以下示例 PerformanceProfile
CR 演示了所需的集群配置。
推荐的性能配置集配置
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: openshift-node-performance-profile 1 spec: additionalKernelArgs: - "rcupdate.rcu_normal_after_boot=0" - "efi=runtime" 2 cpu: isolated: 2-51,54-103 3 reserved: 0-1,52-53 4 hugepages: defaultHugepagesSize: 1G pages: - count: 32 5 size: 1G 6 node: 0 7 machineConfigPoolSelector: pools.operator.machineconfiguration.openshift.io/master: "" nodeSelector: node-role.kubernetes.io/master: "" numa: topologyPolicy: "restricted" realTimeKernel: enabled: true 8
- 1
- 确保
name
的值与Tuned PerformancePatch.yaml
的spec.profile.data
字段中指定的值和validatorCR/informDuValidator.yaml
的status.configuration.source.name
字段匹配。 - 2
- 为集群主机配置 UEFI 安全引导。
- 3
- 设置隔离的 CPU。确保所有 Hyper-Threading 对都匹配。重要
保留和隔离的 CPU 池不得重叠,并且必须一起跨越所有可用的内核。未考虑导致系统中未定义的 CPU 内核。
- 4
- 设置保留的 CPU。启用工作负载分区时,系统进程、内核线程和系统容器线程仅限于这些 CPU。所有不是隔离的 CPU 都应保留。
- 5
- 设置巨页数量。
- 6
- 设置巨页大小。
- 7
- 将
node
设置为分配了hugepages
的 NUMA 节点。 - 8
- 将
enabled
设置为true
以安装实时 Linux 内核。
17.6.7.5. PTP
单节点 OpenShift 集群使用 Precision Time Protocol (PTP) 进行网络时间同步。以下示例 PtpConfig
CR 演示了所需的 PTP slave 配置。
推荐的 PTP 配置
apiVersion: ptp.openshift.io/v1
kind: PtpConfig
metadata:
name: du-ptp-slave
namespace: openshift-ptp
spec:
profile:
- interface: ens5f0 1
name: slave
phc2sysOpts: -a -r -n 24
ptp4lConf: |
[global]
#
# Default Data Set
#
twoStepFlag 1
slaveOnly 0
priority1 128
priority2 128
domainNumber 24
#utc_offset 37
clockClass 248
clockAccuracy 0xFE
offsetScaledLogVariance 0xFFFF
free_running 0
freq_est_interval 1
dscp_event 0
dscp_general 0
dataset_comparison ieee1588
G.8275.defaultDS.localPriority 128
#
# Port Data Set
#
logAnnounceInterval -3
logSyncInterval -4
logMinDelayReqInterval -4
logMinPdelayReqInterval -4
announceReceiptTimeout 3
syncReceiptTimeout 0
delayAsymmetry 0
fault_reset_interval 4
neighborPropDelayThresh 20000000
masterOnly 0
G.8275.portDS.localPriority 128
#
# Run time options
#
assume_two_step 0
logging_level 6
path_trace_enabled 0
follow_up_info 0
hybrid_e2e 0
inhibit_multicast_service 0
net_sync_monitor 0
tc_spanning_tree 0
tx_timestamp_timeout 1
unicast_listen 0
unicast_master_table 0
unicast_req_duration 3600
use_syslog 1
verbose 0
summary_interval 0
kernel_leap 1
check_fup_sync 0
#
# Servo Options
#
pi_proportional_const 0.0
pi_integral_const 0.0
pi_proportional_scale 0.0
pi_proportional_exponent -0.3
pi_proportional_norm_max 0.7
pi_integral_scale 0.0
pi_integral_exponent 0.4
pi_integral_norm_max 0.3
step_threshold 2.0
first_step_threshold 0.00002
max_frequency 900000000
clock_servo pi
sanity_freq_limit 200000000
ntpshm_segment 0
#
# Transport options
#
transportSpecific 0x0
ptp_dst_mac 01:1B:19:00:00:00
p2p_dst_mac 01:80:C2:00:00:0E
udp_ttl 1
udp6_scope 0x0E
uds_address /var/run/ptp4l
#
# Default interface options
#
clock_type OC
network_transport L2
delay_mechanism E2E
time_stamping hardware
tsproc_mode filter
delay_filter moving_median
delay_filter_length 10
egressLatency 0
ingressLatency 0
boundary_clock_jbod 0
#
# Clock description
#
productDescription ;;
revisionData ;;
manufacturerIdentity 00:00:00
userDescription ;
timeSource 0xA0
ptp4lOpts: -2 -s --summary_interval -4
recommend:
- match:
- nodeLabel: node-role.kubernetes.io/master
priority: 4
profile: slave
- 1
- 设置用于接收 PTP 时钟信号的接口。
17.6.7.6. 扩展的 Tuned 配置集
运行 DU 工作负载的单节点 OpenShift 集群需要额外的高性能工作负载所需的性能调优配置。以下 Tuned
CR 示例扩展了 Tuned
配置集:
推荐的扩展 Tuned 配置集配置
apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: name: performance-patch namespace: openshift-cluster-node-tuning-operator spec: profile: - data: | [main] summary=Configuration changes profile inherited from performance created tuned include=openshift-node-performance-openshift-node-performance-profile [bootloader] cmdline_crash=nohz_full=2-51,54-103 [sysctl] kernel.timer_migration=1 [scheduler] group.ice-ptp=0:f:10:*:ice-ptp.* [service] service.stalld=start,enable service.chronyd=stop,disable name: performance-patch recommend: - machineConfigLabels: machineconfiguration.openshift.io/role: master priority: 19 profile: performance-patch
17.6.7.7. SR-IOV
单根 I/O 虚拟化 (SR-IOV) 通常用于启用前端和中间网络。以下 YAML 示例为单节点 OpenShift 集群配置 SR-IOV。
推荐的 SR-IOV 配置
apiVersion: sriovnetwork.openshift.io/v1 kind: SriovOperatorConfig metadata: name: default namespace: openshift-sriov-network-operator spec: configDaemonNodeSelector: node-role.kubernetes.io/master: "" disableDrain: true enableInjector: true enableOperatorWebhook: true --- apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: sriov-nw-du-mh namespace: openshift-sriov-network-operator spec: networkNamespace: openshift-sriov-network-operator resourceName: du_mh vlan: 150 1 --- apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriov-nnp-du-mh namespace: openshift-sriov-network-operator spec: deviceType: vfio-pci 2 isRdma: false nicSelector: pfNames: - ens7f0 3 nodeSelector: node-role.kubernetes.io/master: "" numVfs: 8 4 priority: 10 resourceName: du_mh --- apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetwork metadata: name: sriov-nw-du-fh namespace: openshift-sriov-network-operator spec: networkNamespace: openshift-sriov-network-operator resourceName: du_fh vlan: 140 5 --- apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodePolicy metadata: name: sriov-nnp-du-fh namespace: openshift-sriov-network-operator spec: deviceType: netdevice 6 isRdma: true nicSelector: pfNames: - ens5f0 7 nodeSelector: node-role.kubernetes.io/master: "" numVfs: 8 8 priority: 10 resourceName: du_fh
17.6.7.8. Console Operator
console-operator 在集群中安装并维护 web 控制台。当节点被集中管理时,不需要 Operator,并为应用程序工作负载腾出空间。以下 Console
自定义资源 (CR) 示例禁用控制台。
推荐的控制台配置
apiVersion: operator.openshift.io/v1 kind: Console metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "false" include.release.openshift.io/self-managed-high-availability: "false" include.release.openshift.io/single-node-developer: "false" release.openshift.io/create-only: "true" name: cluster spec: logLevel: Normal managementState: Removed operatorLogLevel: Normal
17.6.7.9. Alertmanager
运行 DU 工作负载的单节点 OpenShift 集群需要减少 OpenShift Container Platform 监控组件所消耗的 CPU 资源。以下 ConfigMap
自定义资源(CR)禁用 Alertmanager。
推荐的集群监控配置
apiVersion: v1 kind: ConfigMap metadata: name: cluster-monitoring-config namespace: openshift-monitoring data: config.yaml: | alertmanagerMain: enabled: false prometheusK8s: retention: 24h
17.6.7.10. Operator Lifecycle Manager
运行分布式单元工作负载的单节点 OpenShift 集群需要对 CPU 资源进行一致的访问。Operator Lifecycle Manager (OLM) 会定期从 Operator 收集性能数据,从而增加 CPU 利用率。以下 ConfigMap
自定义资源 (CR) 禁用 OLM 的 Operator 性能数据收集。
推荐的集群 OLM 配置 (ReduceOLMFootprint.yaml
)
apiVersion: v1 kind: ConfigMap metadata: name: collect-profiles-config namespace: openshift-operator-lifecycle-manager data: pprof-config.yaml: | disabled: True
17.6.7.11. 网络诊断
运行 DU 工作负载的单节点 OpenShift 集群需要较少的 pod 网络连接检查,以减少这些 pod 创建的额外负载。以下自定义资源 (CR) 禁用这些检查。
推荐的网络诊断配置
apiVersion: operator.openshift.io/v1 kind: Network metadata: name: cluster spec: disableNetworkDiagnostics: true
其他资源
17.7. 为 vDU 应用程序工作负载验证单节点 OpenShift 集群调整
在部署虚拟分布式单元 (vDU) 应用程序前,您需要调整并配置集群主机固件和各种其他集群配置设置。使用以下信息来验证集群配置以支持 vDU 工作负载。
其他资源
- 有关为 vDU 应用程序部署调整的单节点 OpenShift 集群的更多信息,请参阅在单节点 OpenShift 中部署 vDU 的参考配置。
17.7.1. vDU 集群主机的建议固件配置
使用下表为在 OpenShift Container Platform 4.12 上运行的 vDU 应用程序配置集群主机固件的基础。
下表是 vDU 集群主机固件配置的一般建议。具体固件设置将取决于您的要求和特定的硬件平台。固件的自动设置不会被零接触置备管道处理。
固件设置 | 配置 | 描述 |
---|---|---|
HyperTransport (HT) | Enabled | HyperTransport (HT) 总线是由 AMD 开发的总线技术。HT 提供主机内存中组件与其他系统外围之间的高速链接。 |
UEFI | Enabled | 为 vDU 主机启用从 UEFI 引导。 |
CPU Power 和性能策略 | 性能 | 设置 CPU 电源和性能策略,以优化系统以提高能源效率。 |
非核心频率扩展 | Disabled | 禁用 Uncore Frequency 扩展,以防止单独设置 CPU 的非内核部分和频率。 |
Uncore Frequency | 最大值 | 将 CPU 的非内核部分(如缓存和内存控制器)设置为操作最多可能的频率。 |
性能限制 | Disabled | 禁用性能 P-limit 以防止处理器的 Uncore 频率协调。 |
增强的 Intel® SpeedStep Tech | Enabled | 启用增强的 Intel SpeedStep,以便系统动态调整处理器消耗和降低主机中功耗和 heat 生产的核心频率。 |
Intel® Turbo Boost Technology | Enabled | 为基于 Intel 的 CPU 启用 Turbo Boost Technology,允许处理器内核比底层操作频率更快运行(如果它们低于 power、current 和 temperature 规格限制)。 |
Intel 配置的 TDP | Enabled | 为 CPU 启用 Thermal Design Power (TDP) |
可配置 TDP 级别 | 2 级 | TDP 级别设置特定性能评级所需的 CPU 功耗。TDP 级别 2 以功耗为代价以实现最稳定的性能水平。 |
节能 Turbo | Disabled | 禁用 Energy Efficient Turbo,以防止处理器使用基于能源效率的策略。 |
硬件 P-State | Enabled 或 Disabled |
启用 OS 控制的 P-States 以允许节能配置。禁用 |
软件包 C-State | C0/C1 状态 | 使用 C0 或 C1 状态将处理器设置为完全活动状态 (C0) 或停止在软件中运行的 CPU 内部时钟 (C1)。 |
C1E | Disabled | CPU Enhanced Halt (C1E) 是 Intel 芯片中的节能功能。禁用 C1E 可防止操作系统在不活跃时向 CPU 发送 halt 命令。 |
处理器 C6 | Disabled | C6 节能程序是 CPU 功能,可自动禁用空闲 CPU 内核和缓存。禁用 C6 可提高系统性能。 |
子 NUMA 集群 | Disabled | 子 NUMA 集群将处理器内核、缓存和内存划分为多个 NUMA 域。禁用这个选项可以提高对延迟敏感工作负载的性能。 |
在主机的固件中启用全局 SR-IOV 和 VT-d 设置。这些设置与裸机环境相关。
启用 C-states
和 OS 控制的 P-States
来允许每个 pod 电源管理。
17.7.2. 推荐的集群配置来运行 vDU 应用程序
运行虚拟化分布式单元 (vDU) 应用程序的集群需要高度调整和优化的配置。以下信息描述了在 OpenShift Container Platform 4.12 集群中支持 vDU 工作负载的各种元素。
17.7.2.1. 推荐的集群 MachineConfig CR
检查您从 ztp-site-generate
容器中提取的 MachineConfig
自定义资源 (CR) 是否已在集群中应用。CR 可以在提取的 out/source-crs/extra-manifest/
文件夹中找到。
ztp-site-generate
容器中的以下 MachineConfig
CR 配置集群主机:
CR 文件名 | 描述 |
---|---|
|
配置集群的工作负载分区。安装集群时应用此 |
|
加载 SCTP 内核模块。这些 |
| 配置容器挂载命名空间和 Kubelet 配置。 |
| 配置集群的加速启动。 |
|
为集群配置 |
17.7.2.2. 推荐的集群 Operator
运行虚拟化分布式单元 (vDU) 应用程序的集群需要以下 Operator,它是基准参考配置的一部分:
- Node Tuning Operator (NTO).与 Performance Addon Operator 一起提供的 NTO 软件包功能,现在是 NTO 的一部分。
- PTP Operator
- Cluster Network Operator
- Red Hat OpenShift Logging Operator
- Local Storage Operator
17.7.2.3. 推荐的集群内核配置
始终使用集群中最新支持的实时内核版本。确保在集群中应用以下配置:
确保在集群性能配置集中设置以下
additionalKernelArgs
:spec: additionalKernelArgs: - "rcupdate.rcu_normal_after_boot=0" - "efi=runtime"
确保
Tuned
CR 中的performance-patch
配置集配置与相关PerformanceProfile
CR 中设置的隔离
CPU 的正确 CPU 隔离集,例如:spec: profile: - name: performance-patch # The 'include' line must match the associated PerformanceProfile name # And the cmdline_crash CPU set must match the 'isolated' set in the associated PerformanceProfile data: | [main] summary=Configuration changes profile inherited from performance created tuned include=openshift-node-performance-openshift-node-performance-profile [bootloader] cmdline_crash=nohz_full=2-51,54-103 1 [sysctl] kernel.timer_migration=1 [scheduler] group.ice-ptp=0:f:10:*:ice-ptp.* [service] service.stalld=start,enable service.chronyd=stop,disable
- 1
- 列出的 CPU 依赖于主机硬件配置,特别是系统和 CPU 拓扑中的可用 CPU 数量。
17.7.2.4. 检查实时内核版本
在 OpenShift Container Platform 集群中,始终使用最新版本的 realtime 内核。如果您不确定集群中正在使用的内核版本,您可以将当前的 realtime 内核版本与发行版本进行比较。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您以具有
cluster-admin
权限的用户身份登录。 -
已安装
podman
。
流程
运行以下命令来获取集群版本:
$ OCP_VERSION=$(oc get clusterversion version -o jsonpath='{.status.desired.version}{"\n"}')
获取发行镜像 SHA 号:
$ DTK_IMAGE=$(oc adm release info --image-for=driver-toolkit quay.io/openshift-release-dev/ocp-release:$OCP_VERSION-x86_64)
运行发行镜像容器,并提取与集群当前发行版本一起打包的内核版本:
$ podman run --rm $DTK_IMAGE rpm -qa | grep 'kernel-rt-core-' | sed 's#kernel-rt-core-##'
输出示例
4.18.0-305.49.1.rt7.121.el8_4.x86_64
这是版本附带的默认 realtime 内核版本。
注意realtime 内核由内核版本中的字符串
.rt
表示。
验证
检查为集群当前发行版本列出的内核版本是否与集群中运行的实际实时内核匹配。运行以下命令检查运行的 realtime 内核版本:
打开到集群节点的远程 shell 连接:
$ oc debug node/<node_name>
检查 realtime 内核版本:
sh-4.4# uname -r
输出示例
4.18.0-305.49.1.rt7.121.el8_4.x86_64
17.7.3. 检查是否应用推荐的集群配置
您可以检查集群是否正在运行正确的配置。以下流程描述了如何检查在 OpenShift Container Platform 4.12 集群中部署 DU 应用程序的各种配置。
先决条件
- 您已部署了集群,并根据 vDU 工作负载对其进行调整。
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。
流程
检查默认 OperatorHub 源是否已禁用。运行以下命令:
$ oc get operatorhub cluster -o yaml
输出示例
spec: disableAllDefaultSources: true
运行以下命令,检查所有所需的
CatalogSource
资源是否标注了工作负载分区 (PreferredDuringScheduling
):$ oc get catalogsource -A -o jsonpath='{range .items[*]}{.metadata.name}{" -- "}{.metadata.annotations.target\.workload\.openshift\.io/management}{"\n"}{end}'
输出示例
certified-operators -- {"effect": "PreferredDuringScheduling"} community-operators -- {"effect": "PreferredDuringScheduling"} ran-operators 1 redhat-marketplace -- {"effect": "PreferredDuringScheduling"} redhat-operators -- {"effect": "PreferredDuringScheduling"}
- 1
- 未注解的
CatalogSource
资源也会返回。在本例中,ran-operators
CatalogSource
资源没有被注解,它没有PreferredDuringScheduling
注解。
注意在正确配置的 vDU 集群中,只会列出注解的一个目录源。
检查是否为工作负载分区注解了所有适用的 OpenShift Container Platform Operator 命名空间。这包括 OpenShift Container Platform 核心安装的所有 Operator,以及参考 DU 调整配置中包含的附加 Operator 集合。运行以下命令:
$ oc get namespaces -A -o jsonpath='{range .items[*]}{.metadata.name}{" -- "}{.metadata.annotations.workload\.openshift\.io/allowed}{"\n"}{end}'
输出示例
default -- openshift-apiserver -- management openshift-apiserver-operator -- management openshift-authentication -- management openshift-authentication-operator -- management
重要对于工作负载分区,不得为其他 Operator 进行注解。在上一命令的输出中,应当列出额外的 Operator,而无需
--
分隔符右侧的任何值。检查
ClusterLogging
配置是否正确。运行以下命令:验证是否配置了适当的输入和输出日志:
$ oc get -n openshift-logging ClusterLogForwarder instance -o yaml
输出示例
apiVersion: logging.openshift.io/v1 kind: ClusterLogForwarder metadata: creationTimestamp: "2022-07-19T21:51:41Z" generation: 1 name: instance namespace: openshift-logging resourceVersion: "1030342" uid: 8c1a842d-80c5-447a-9150-40350bdf40f0 spec: inputs: - infrastructure: {} name: infra-logs outputs: - name: kafka-open type: kafka url: tcp://10.46.55.190:9092/test pipelines: - inputRefs: - audit name: audit-logs outputRefs: - kafka-open - inputRefs: - infrastructure name: infrastructure-logs outputRefs: - kafka-open ...
检查策展调度是否适合您的应用程序:
$ oc get -n openshift-logging clusterloggings.logging.openshift.io instance -o yaml
输出示例
apiVersion: logging.openshift.io/v1 kind: ClusterLogging metadata: creationTimestamp: "2022-07-07T18:22:56Z" generation: 1 name: instance namespace: openshift-logging resourceVersion: "235796" uid: ef67b9b8-0e65-4a10-88ff-ec06922ea796 spec: collection: logs: fluentd: {} type: fluentd curation: curator: schedule: 30 3 * * * type: curator managementState: Managed ...
运行以下命令,检查 Web 控制台是否已禁用 (
managementState: Removed
):$ oc get consoles.operator.openshift.io cluster -o jsonpath="{ .spec.managementState }"
输出示例
Removed
运行以下命令,检查集群节点中禁用了
chronyd
:$ oc debug node/<node_name>
检查节点上的
chronyd
状态:sh-4.4# chroot /host
sh-4.4# systemctl status chronyd
输出示例
● chronyd.service - NTP client/server Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:chronyd(8) man:chrony.conf(5)
使用连接到
linuxptp-daemon
容器和 PTP Management Client (pmc
) 工具,检查 PTP 接口是否已成功同步到主时钟:运行以下命令,使用
linuxptp-daemon
pod 的名称设置$PTP_POD_NAME
变量:$ PTP_POD_NAME=$(oc get pods -n openshift-ptp -l app=linuxptp-daemon -o name)
运行以下命令来检查 PTP 设备的同步状态:
$ oc -n openshift-ptp rsh -c linuxptp-daemon-container ${PTP_POD_NAME} pmc -u -f /var/run/ptp4l.0.config -b 0 'GET PORT_DATA_SET'
输出示例
sending: GET PORT_DATA_SET 3cecef.fffe.7a7020-1 seq 0 RESPONSE MANAGEMENT PORT_DATA_SET portIdentity 3cecef.fffe.7a7020-1 portState SLAVE logMinDelayReqInterval -4 peerMeanPathDelay 0 logAnnounceInterval 1 announceReceiptTimeout 3 logSyncInterval 0 delayMechanism 1 logMinPdelayReqInterval 0 versionNumber 2 3cecef.fffe.7a7020-2 seq 0 RESPONSE MANAGEMENT PORT_DATA_SET portIdentity 3cecef.fffe.7a7020-2 portState LISTENING logMinDelayReqInterval 0 peerMeanPathDelay 0 logAnnounceInterval 1 announceReceiptTimeout 3 logSyncInterval 0 delayMechanism 1 logMinPdelayReqInterval 0 versionNumber 2
运行以下
pmc
命令来检查 PTP 时钟状态:$ oc -n openshift-ptp rsh -c linuxptp-daemon-container ${PTP_POD_NAME} pmc -u -f /var/run/ptp4l.0.config -b 0 'GET TIME_STATUS_NP'
输出示例
sending: GET TIME_STATUS_NP 3cecef.fffe.7a7020-0 seq 0 RESPONSE MANAGEMENT TIME_STATUS_NP master_offset 10 1 ingress_time 1657275432697400530 cumulativeScaledRateOffset +0.000000000 scaledLastGmPhaseChange 0 gmTimeBaseIndicator 0 lastGmPhaseChange 0x0000'0000000000000000.0000 gmPresent true 2 gmIdentity 3c2c30.ffff.670e00
检查在
linuxptp-daemon-container
日志中有与/var/run/ptp4l.0.config
中的值对应的master offset
:$ oc logs $PTP_POD_NAME -n openshift-ptp -c linuxptp-daemon-container
输出示例
phc2sys[56020.341]: [ptp4l.1.config] CLOCK_REALTIME phc offset -1731092 s2 freq -1546242 delay 497 ptp4l[56020.390]: [ptp4l.1.config] master offset -2 s2 freq -5863 path delay 541 ptp4l[56020.390]: [ptp4l.0.config] master offset -8 s2 freq -10699 path delay 533
运行以下命令检查 SR-IOV 配置是否正确:
检查
SriovOperatorConfig
资源中的disableDrain
值是否已设置为true
:$ oc get sriovoperatorconfig -n openshift-sriov-network-operator default -o jsonpath="{.spec.disableDrain}{'\n'}"
输出示例
true
运行以下命令,检查
SriovNetworkNodeState
同步状态是否为Succeeded
:$ oc get SriovNetworkNodeStates -n openshift-sriov-network-operator -o jsonpath="{.items[*].status.syncStatus}{'\n'}"
输出示例
Succeeded
验证为 SR-IOV 配置的每个接口下的虚拟功能(
Vfs
)预期数量和配置是否存在,并在.status.interfaces
字段中是正确的。例如:$ oc get SriovNetworkNodeStates -n openshift-sriov-network-operator -o yaml
输出示例
apiVersion: v1 items: - apiVersion: sriovnetwork.openshift.io/v1 kind: SriovNetworkNodeState ... status: interfaces: ... - Vfs: - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.0 vendor: "8086" vfID: 0 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.1 vendor: "8086" vfID: 1 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.2 vendor: "8086" vfID: 2 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.3 vendor: "8086" vfID: 3 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.4 vendor: "8086" vfID: 4 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.5 vendor: "8086" vfID: 5 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.6 vendor: "8086" vfID: 6 - deviceID: 154c driver: vfio-pci pciAddress: 0000:3b:0a.7 vendor: "8086" vfID: 7
检查集群性能配置集是否正确。
cpu
和hugepages
部分将根据您的硬件配置而有所不同。运行以下命令:$ oc get PerformanceProfile openshift-node-performance-profile -o yaml
输出示例
apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: creationTimestamp: "2022-07-19T21:51:31Z" finalizers: - foreground-deletion generation: 1 name: openshift-node-performance-profile resourceVersion: "33558" uid: 217958c0-9122-4c62-9d4d-fdc27c31118c spec: additionalKernelArgs: - idle=poll - rcupdate.rcu_normal_after_boot=0 - efi=runtime cpu: isolated: 2-51,54-103 reserved: 0-1,52-53 hugepages: defaultHugepagesSize: 1G pages: - count: 32 size: 1G machineConfigPoolSelector: pools.operator.machineconfiguration.openshift.io/master: "" net: userLevelNetworking: true nodeSelector: node-role.kubernetes.io/master: "" numa: topologyPolicy: restricted realTimeKernel: enabled: true status: conditions: - lastHeartbeatTime: "2022-07-19T21:51:31Z" lastTransitionTime: "2022-07-19T21:51:31Z" status: "True" type: Available - lastHeartbeatTime: "2022-07-19T21:51:31Z" lastTransitionTime: "2022-07-19T21:51:31Z" status: "True" type: Upgradeable - lastHeartbeatTime: "2022-07-19T21:51:31Z" lastTransitionTime: "2022-07-19T21:51:31Z" status: "False" type: Progressing - lastHeartbeatTime: "2022-07-19T21:51:31Z" lastTransitionTime: "2022-07-19T21:51:31Z" status: "False" type: Degraded runtimeClass: performance-openshift-node-performance-profile tuned: openshift-cluster-node-tuning-operator/openshift-node-performance-openshift-node-performance-profile
注意CPU 设置取决于服务器上可用的内核数,应当与工作负载分区设置保持一致。
巨页
配置取决于服务器和应用程序。运行以下命令,检查
PerformanceProfile
是否已成功应用到集群:$ oc get performanceprofile openshift-node-performance-profile -o jsonpath="{range .status.conditions[*]}{ @.type }{' -- '}{@.status}{'\n'}{end}"
输出示例
Available -- True Upgradeable -- True Progressing -- False Degraded -- False
运行以下命令检查
Tuned
性能补丁设置:$ oc get tuneds.tuned.openshift.io -n openshift-cluster-node-tuning-operator performance-patch -o yaml
输出示例
apiVersion: tuned.openshift.io/v1 kind: Tuned metadata: creationTimestamp: "2022-07-18T10:33:52Z" generation: 1 name: performance-patch namespace: openshift-cluster-node-tuning-operator resourceVersion: "34024" uid: f9799811-f744-4179-bf00-32d4436c08fd spec: profile: - data: | [main] summary=Configuration changes profile inherited from performance created tuned include=openshift-node-performance-openshift-node-performance-profile [bootloader] cmdline_crash=nohz_full=2-23,26-47 1 [sysctl] kernel.timer_migration=1 [scheduler] group.ice-ptp=0:f:10:*:ice-ptp.* [service] service.stalld=start,enable service.chronyd=stop,disable name: performance-patch recommend: - machineConfigLabels: machineconfiguration.openshift.io/role: master priority: 19 profile: performance-patch
- 1
cmdline=nohz_full=
中的 cpu 列表将根据您的硬件配置而有所不同。
运行以下命令,检查是否禁用了集群网络诊断:
$ oc get networks.operator.openshift.io cluster -o jsonpath='{.spec.disableNetworkDiagnostics}'
输出示例
true
检查
Kubelet
housekeeping 间隔是否调整为较慢的速度。这是在containerMountNS
机器配置中设置的。运行以下命令:$ oc describe machineconfig container-mount-namespace-and-kubelet-conf-master | grep OPENSHIFT_MAX_HOUSEKEEPING_INTERVAL_DURATION
输出示例
Environment="OPENSHIFT_MAX_HOUSEKEEPING_INTERVAL_DURATION=60s"
运行以下命令,检查 Grafana 和
alertManagerMain
是否已禁用,Prometheus 保留周期是否已设置为 24h:$ oc get configmap cluster-monitoring-config -n openshift-monitoring -o jsonpath="{ .data.config\.yaml }"
输出示例
grafana: enabled: false alertmanagerMain: enabled: false prometheusK8s: retention: 24h
使用以下命令验证集群中没有找到 Grafana 和
alertManagerMain
路由:$ oc get route -n openshift-monitoring alertmanager-main
$ oc get route -n openshift-monitoring grafana
这两个查询都应返回
Error from server(NotFound)
消息。
运行以下命令,检查是否已为每个
PerformanceProfile
、Tuned
性能补丁、工作负载分区和内核命令行参数分配至少 4 个保留
CPU:$ oc get performanceprofile -o jsonpath="{ .items[0].spec.cpu.reserved }"
输出示例
0-3
注意根据您的工作负载要求,您可能需要分配额外的保留 CPU。
17.8. 带有 SiteConfig 资源的高级受管集群配置
您可以使用 SiteConfig
自定义资源 (CR) 在安装时在受管集群中部署自定义功能和配置。
17.8.1. 在 ZTP GitOps 管道中自定义额外的安装清单
您可以定义一组额外的清单,以包含在零接触置备(ZTP) GitOps 管道的安装阶段。这些清单链接到 siteConfig
自定义资源(CR),并在安装过程中应用到集群。在安装时包括 MachineConfig
CR 可提高安装过程的效率。
先决条件
- 创建一个 Git 存储库,在其中管理自定义站点配置数据。该存储库必须可从 hub 集群访问,并定义为 Argo CD 应用程序的源仓库。
流程
- 创建 ZTP 管道用于自定义集群安装的一组额外清单 CR。
在自定义
/siteconfig
目录中,为您的额外清单创建一个/extra-manifest
文件夹。以下示例演示了一个/siteconfig
示例,带有/extra-manifest
文件夹:siteconfig ├── site1-sno-du.yaml ├── site2-standard-du.yaml └── extra-manifest └── 01-example-machine-config.yaml
-
将自定义额外清单 CR 添加到
siteconfig/extra-manifest
目录。 在
SiteConfig
CR 的extraManifestPath
字段中输入目录名称,例如:clusters: - clusterName: "example-sno" networkType: "OVNKubernetes" extraManifestPath: extra-manifest
-
保存
SiteConfig
CR 和/extra-manifest
CR,并将它们推送到站点配置存储库。
ZTP 管道在集群置备过程中将 /extra-manifest
目录中的 CR 附加到默认额外清单集合中。
17.8.2. 使用 siteConfig 过滤器过滤自定义资源
通过使用过滤器,您可以轻松地自定义 SiteConfig
自定义资源 (CR) 来包含或排除其他 CR,以便在零 touch 置备 (ZTP) GitOps 管道的安装阶段使用。
您可以为 SiteConfig
CR 指定一个 inclusionDefault
值(include
或 exclude
),以及您要包含或排除的特定 extraManifest
RAN CR 列表。将 inclusionDefault
设置为 include
可使 ZTP 管道在安装过程中应用 /source-crs/extra-manifest
中的所有文件。将 includeDefault
设置为 exclude
的作用相反。
您可以从 /source-crs/extra-manifest
文件夹中排除默认会被包括的 CR。以下示例配置了自定义单节点 OpenShift SiteConfig
CR,以在安装时排除 /source-crs/extra-manifest/03-sctp-machine-config-worker.yaml
CR。
另外还介绍了一些额外的可选过滤场景。
先决条件
- 配置了 hub 集群来生成所需的安装和策略 CR。
- 您创建了 Git 存储库,用于管理自定义站点配置数据。该存储库必须可从 hub 集群访问,并定义为 Argo CD 应用程序的源仓库。
流程
要防止 ZTP 管道应用
03-sctp-machine-config-worker.yaml
CR 文件,在SiteConfig
CR 中应用以下 YAML:apiVersion: ran.openshift.io/v1 kind: SiteConfig metadata: name: "site1-sno-du" namespace: "site1-sno-du" spec: baseDomain: "example.com" pullSecretRef: name: "assisted-deployment-pull-secret" clusterImageSetNameRef: "openshift-4.12" sshPublicKey: "<ssh_public_key>" clusters: - clusterName: "site1-sno-du" extraManifests: filter: exclude: - 03-sctp-machine-config-worker.yaml
ZTP 管道在安装过程中跳过
03-sctp-machine-config-worker.yaml
CR。应用/source-crs/extra-manifest
中的所有其他 CR。保存
SiteConfig
CR,并将更改推送到站点配置存储库。ZTP 管道会监控和调整它根据
SiteConfig
过滤器指令所应用的 CR。可选: 要防止 ZTP 管道在集群中应用所有
/source-crs/extra-manifest
CR,请在SiteConfig
CR 中应用以下 YAML:- clusterName: "site1-sno-du" extraManifests: filter: inclusionDefault: exclude
可选: 要排除所有
/source-crs/extra-manifest
RAN CR,并在安装过程中包括自定义 CR 文件,编辑自定义SiteConfig
CR 来设置自定义清单文件夹和include
文件,例如:clusters: - clusterName: "site1-sno-du" extraManifestPath: "<custom_manifest_folder>" 1 extraManifests: filter: inclusionDefault: exclude 2 include: - custom-sctp-machine-config-worker.yaml
以下示例演示了自定义文件夹结构:
siteconfig ├── site1-sno-du.yaml └── user-custom-manifest └── custom-sctp-machine-config-worker.yaml
17.9. 使用 PolicyGenTemplate 资源进行高级受管集群配置
您可以使用 PolicyGenTemplate
CR 在受管集群中部署自定义功能。
17.9.1. 为集群部署额外的更改
如果需要在基本 GitOps ZTP 管道配置之外更改集群配置,则有三个选项:
- 在 ZTP 管道完成后应用附加配置
- 当 GitOps ZTP 管道部署完成后,部署的集群就可以用于应用程序工作负载。此时,您可以安装其他 Operator 并应用具体具体要求的配置。确保额外的配置不会影响平台或分配的 CPU 预算的性能。
- 在 ZTP 库中添加内容
- 使用 GitOps ZTP 管道部署的基本源自定义资源 (CR) 可以根据需要使用自定义内容增强。
- 为集群安装创建额外的清单
- 在安装过程中应用额外的清单,并使安装过程更高效。
提供额外的源 CR 或修改现有源 CR 可能会影响 OpenShift Container Platform 的性能或 CPU 配置集。
17.9.2. 使用 PolicyGenTemplate CR 覆盖源 CR 内容
PolicyGenTemplate
自定义资源 (CR) 允许您覆盖与 ztp-site-generate
容器中提供的 GitOps 插件提供的基本源 CR 之上的额外配置详情。您可以将 PolicyGenTemplate
CR 视为基础 CR 的逻辑合并或补丁。使用 PolicyGenTemplate
CR 更新基本 CR 的单个字段,或覆盖基本 CR 的整个内容。您可以更新不在基本 CR 中的值和插入字段。
以下示例步骤描述了如何根据 group-du-sno-ranGen.yaml
文件中的 PolicyGenTemplate
CR 为参考配置更新生成的 PerformanceProfile
CR 中的字段。根据要求,使用流程修改 PolicyGenTemplate
的其他部分。
先决条件
- 创建一个 Git 存储库,在其中管理自定义站点配置数据。存储库必须可从 hub 集群访问,并定义为 Argo CD 的源存储库。
流程
查看基准源 CR 以查找现有内容。您可以通过从零接触置备(ZTP)容器提取,来查看参考
PolicyGenTemplate
CR 中列出的源 CR。创建
/out
文件夹:$ mkdir -p ./out
提取源 CR:
$ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12.1 extract /home/ztp --tar | tar x -C ./out
查看
./out/source-crs/PerformanceProfile.yaml
中的基线PerformanceProfile
CR:apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: $name annotations: ran.openshift.io/ztp-deploy-wave: "10" spec: additionalKernelArgs: - "idle=poll" - "rcupdate.rcu_normal_after_boot=0" cpu: isolated: $isolated reserved: $reserved hugepages: defaultHugepagesSize: $defaultHugepagesSize pages: - size: $size count: $count node: $node machineConfigPoolSelector: pools.operator.machineconfiguration.openshift.io/$mcp: "" net: userLevelNetworking: true nodeSelector: node-role.kubernetes.io/$mcp: '' numa: topologyPolicy: "restricted" realTimeKernel: enabled: true
注意如果
PolicyGenTemplate
CR 中未提供,则包含$…
的任何字段都会从生成的 CR 中删除。在
group-du-sno-ranGen.yaml
参考文件中为PerformanceProfile
更新PolicyGenTemplate
条目。以下示例PolicyGenTemplate
CR 小节提供了适当的 CPU 规格,设置hugepages
配置,并添加一个新的字段,将globallyDisableIrqLoadBalancing
设置为 false。- fileName: PerformanceProfile.yaml policyName: "config-policy" metadata: name: openshift-node-performance-profile spec: cpu: # These must be tailored for the specific hardware platform isolated: "2-19,22-39" reserved: "0-1,20-21" hugepages: defaultHugepagesSize: 1G pages: - size: 1G count: 10 globallyDisableIrqLoadBalancing: false
-
提交 Git 中的
PolicyGenTemplate
更改,然后推送到由 GitOps ZTP argo CD 应用程序监控的 Git 存储库。
输出示例
ZTP 应用程序生成包含生成的 PerformanceProfile
CR 的 RHACM 策略。该 CR 的内容通过将 PolicyGenTemplate
中的 PerformanceProfile
条目的 metadata
和 spec
内容合并到源 CR 中。生成的 CR 包含以下内容:
--- apiVersion: performance.openshift.io/v2 kind: PerformanceProfile metadata: name: openshift-node-performance-profile spec: additionalKernelArgs: - idle=poll - rcupdate.rcu_normal_after_boot=0 cpu: isolated: 2-19,22-39 reserved: 0-1,20-21 globallyDisableIrqLoadBalancing: false hugepages: defaultHugepagesSize: 1G pages: - count: 10 size: 1G machineConfigPoolSelector: pools.operator.machineconfiguration.openshift.io/master: "" net: userLevelNetworking: true nodeSelector: node-role.kubernetes.io/master: "" numa: topologyPolicy: restricted realTimeKernel: enabled: true
在从 ztp-site-generate
容器中提取的 /source-crs
文件夹中,$
语法用于模板替换。相反,如果 policyGen
工具看到字符串的 $
前缀,并且您不会在相关 PolicyGenTemplate
CR 中为该字段指定值,则会完全从输出 CR 省略该字段。
一个例外是 /source-crs
YAML 文件中的 $mcp
变量,该文件被替换为来自 PolicyGenTemplate
CR 的 mcp
的指定的值。例如,在 example/policygentemplates/group-du-standard-ranGen.yaml
中,mcp
的值为 worker
:
spec: bindingRules: group-du-standard: "" mcp: "worker"
policyGen
工具将输出 CR 中的 $mcp
实例替换为 worker
。
17.9.3. 在 GitOps ZTP 管道中添加自定义内容
执行以下步骤在 ZTP 管道中添加新内容。
流程
-
在目录中创建一个名为
source-crs
的子目录,其中包含PolicyGenTemplate
自定义资源(CR)的kustomization.yaml
文件。 将自定义 CR 添加到
source-crs
子目录中,如下例所示:example └── policygentemplates ├── dev.yaml ├── kustomization.yaml ├── mec-edge-sno1.yaml ├── sno.yaml └── source-crs 1 ├── PaoCatalogSource.yaml ├── PaoSubscription.yaml ├── custom-crs | ├── apiserver-config.yaml | └── disable-nic-lldp.yaml └── elasticsearch ├── ElasticsearchNS.yaml └── ElasticsearchOperatorGroup.yaml
- 1
source-crs
子目录必须与kustomization.yaml
文件位于同一个目录中。
重要要使用您自己的资源,请确保自定义 CR 名称与 ZTP 容器中提供的默认源 CR 不同。
更新所需的
PolicyGenTemplate
CR,使其包含对source-crs/custom-crs
和source-crs/elasticsearch
目录中添加的内容的引用。例如:apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "group-dev" namespace: "ztp-clusters" spec: bindingRules: dev: "true" mcp: "master" sourceFiles: # These policies/CRs come from the internal container Image #Cluster Logging - fileName: ClusterLogNS.yaml remediationAction: inform policyName: "group-dev-cluster-log-ns" - fileName: ClusterLogOperGroup.yaml remediationAction: inform policyName: "group-dev-cluster-log-operator-group" - fileName: ClusterLogSubscription.yaml remediationAction: inform policyName: "group-dev-cluster-log-sub" #Local Storage Operator - fileName: StorageNS.yaml remediationAction: inform policyName: "group-dev-lso-ns" - fileName: StorageOperGroup.yaml remediationAction: inform policyName: "group-dev-lso-operator-group" - fileName: StorageSubscription.yaml remediationAction: inform policyName: "group-dev-lso-sub" #These are custom local polices that come from the source-crs directory in the git repo # Performance Addon Operator - fileName: PaoSubscriptionNS.yaml remediationAction: inform policyName: "group-dev-pao-ns" - fileName: PaoSubscriptionCatalogSource.yaml remediationAction: inform policyName: "group-dev-pao-cat-source" spec: image: <image_URL_here> - fileName: PaoSubscription.yaml remediationAction: inform policyName: "group-dev-pao-sub" #Elasticsearch Operator - fileName: elasticsearch/ElasticsearchNS.yaml 1 remediationAction: inform policyName: "group-dev-elasticsearch-ns" - fileName: elasticsearch/ElasticsearchOperatorGroup.yaml remediationAction: inform policyName: "group-dev-elasticsearch-operator-group" #Custom Resources - fileName: custom-crs/apiserver-config.yaml 2 remediationAction: inform policyName: "group-dev-apiserver-config" - fileName: custom-crs/disable-nic-lldp.yaml remediationAction: inform policyName: "group-dev-disable-nic-lldp"
-
提交 Git 中的
PolicyGenTemplate
更改,然后推送到由 GitOps ZTP Argo CD 策略应用程序监控的 Git 存储库。 更新
ClusterGroupUpgrade
CR,使其包含更改的PolicyGenTemplate
,并将它保存为cgu-test.yaml
。以下示例显示了生成的cgu-test.yaml
文件。apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: custom-source-cr namespace: ztp-clusters spec: managedPolicies: - group-dev-config-policy enable: true clusters: - cluster1 remediationStrategy: maxConcurrency: 2 timeout: 240
运行以下命令来应用更新的
ClusterGroupUpgrade
CR:$ oc apply -f cgu-test.yaml
验证
运行以下命令检查更新是否成功:
$ oc get cgu -A
输出示例
NAMESPACE NAME AGE STATE DETAILS ztp-clusters custom-source-cr 6s InProgress Remediating non-compliant policies ztp-install cluster1 19h Completed All clusters are compliant with all the managed policies
17.9.4. 为 PolicyGenTemplate CR 配置策略合规性评估超时
使用在 hub 集群上安装的 Red Hat Advanced Cluster Management (RHACM) 来监控和报告您的受管集群是否合规。RHACM 使用策略模板来应用预定义的策略控制器和策略。策略控制器是 Kubernetes 自定义资源定义(CRD)实例。
您可以使用 PolicyGenTemplate
自定义资源 (CR) 覆盖默认策略评估间隔。您可以配置持续时间设置,以定义 ConfigurationPolicy
CR 在 RHACM 重新评估集群策略前处于策略合规或不合规的时长。
零接触置备 (ZTP) 策略生成器使用预定义的策略评估间隔生成 ConfigurationPolicy
CR 策略。noncompliant
状态的默认值为 10 秒。compliant
状态的默认值为 10 分钟。要禁用评估间隔,将值设为 never
。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 - 您已创建了管理自定义站点配置数据的 Git 存储库。
流程
要为
PolicyGenTemplate
CR 中的所有策略配置评估间隔,请将evaluationInterval
添加到spec
字段中,然后设置适当的compliant
和noncompliant
的值。例如:spec: evaluationInterval: compliant: 30m noncompliant: 20s
要在
PolicyGenTemplate
CR 中为spec.sourceFiles
对象配置评估间隔,请将evaluationInterval
添加到sourceFiles
字段中,例如:spec: sourceFiles: - fileName: SriovSubscription.yaml policyName: "sriov-sub-policy" evaluationInterval: compliant: never noncompliant: 10s
-
在 Git 存储库中提交
PolicyGenTemplate
CR 文件并推送您的更改。
验证
检查管理的 spoke 集群策略是否以预期间隔监控。
-
在受管集群中以具有
cluster-admin
权限的用户身份登录。 获取在
open-cluster-management-agent-addon
命名空间中运行的 pod。运行以下命令:$ oc get pods -n open-cluster-management-agent-addon
输出示例
NAME READY STATUS RESTARTS AGE config-policy-controller-858b894c68-v4xdb 1/1 Running 22 (5d8h ago) 10d
检查应用的策略是以
config-policy-controller
pod 的日志中预期间隔评估:$ oc logs -n open-cluster-management-agent-addon config-policy-controller-858b894c68-v4xdb
输出示例
2022-05-10T15:10:25.280Z info configuration-policy-controller controllers/configurationpolicy_controller.go:166 Skipping the policy evaluation due to the policy not reaching the evaluation interval {"policy": "compute-1-config-policy-config"} 2022-05-10T15:10:25.280Z info configuration-policy-controller controllers/configurationpolicy_controller.go:166 Skipping the policy evaluation due to the policy not reaching the evaluation interval {"policy": "compute-1-common-compute-1-catalog-policy-config"}
17.9.5. 使用验证器通知策略信号 ZTP 集群部署完成
创建一个验证器通知策略,在零接触置备(ZTP)安装和配置完成部署集群时信号。此策略可用于部署单节点 OpenShift 集群、三节点集群和标准集群。
流程
创建包含源文件
validatorCR/informDuValidator.yaml
的独立PolicyGenTemplate
自定义资源 (CR)。每个集群类型只需要一个独立PolicyGenTemplate
CR。例如,此 CR 为单节点 OpenShift 集群应用验证器通知策略:Example single-node cluster validator inform policy CR (group-du-sno-validator-ranGen.yaml)
apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "group-du-sno-validator" 1 namespace: "ztp-group" 2 spec: bindingRules: group-du-sno: "" 3 bindingExcludedRules: ztp-done: "" 4 mcp: "master" 5 sourceFiles: - fileName: validatorCRs/informDuValidator.yaml remediationAction: inform 6 policyName: "du-policy" 7
- 1
PolicyGenTemplates
对象的名称。此名称也用作在请求的namespace
中创建的placementBinding
、placementRule
和policy
的一部分。- 2
- 这个值应该与组
PolicyGenTemplates
中使用的命名空间
匹配。 - 3
bindingRules
中定义的group-du-*
标签必须存在于SiteConfig
文件中。- 4
bindingExcludedRules
中定义的标签必须是'ztp-done:'。ztp-done
标签用于与 Topology Aware Lifecycle Manager 协调。- 5
mcp
定义在源文件validatorCR/informDuValidator.yaml
中使用的MachineConfigPool
对象。它应该是单一节点的master
,以及用于标准集群部署的三节点集群部署和worker
。- 6
- 可选。默认值是
inform
。 - 7
- 这个值被用作生成的 RHACM 策略的名称的一部分。单一节点示例生成的验证器策略是
group-du-sno-validator-du-policy
。
-
在 Git 存储库中提交
PolicyGenTemplate
CR 文件并推送更改。
17.9.6. 使用 PolicyGenTemplate CR 配置 PTP 事件
您可以使用 GitOps ZTP 管道来配置使用 HTTP 或 AMQP 传输的 PTP 事件。
HTTP 传输是 PTP 和裸机事件的默认传输。在可能的情况下,使用 HTTP 传输而不是 AMQP 用于 PTP 和裸机事件。AMQ Interconnect 于 2024 年 6 月 30 日结束生命周期(EOL)。AMQ Interconnect 的延长生命周期支持 (ELS) 于 2029 年 11 月 29 日结束。如需更多信息,请参阅 Red Hat AMQ Interconnect 支持状态。
17.9.6.1. 配置使用 HTTP 传输的 PTP 事件
您可以配置使用 GitOps Zero Touch Provisioning (ZTP)管道部署的受管集群中使用 HTTP 传输的 PTP 事件。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 您已创建了管理自定义站点配置数据的 Git 存储库。
流程
根据您的具体要求,将以下
PolicyGenTemplate
应用到group-du-3node-ranGen.yaml
、group-du-sno-ranGen.yaml
或group-du-standard-ranGen.yaml
文件:在
.sourceFiles
中,添加PtpOperatorConfig
CR 文件来配置传输主机:- fileName: PtpOperatorConfigForEvent.yaml policyName: "config-policy" spec: daemonNodeSelector: {} ptpEventConfig: enableEventPublisher: true transportHost: http://ptp-event-publisher-service-NODE_NAME.openshift-ptp.svc.cluster.local:9043
注意在 OpenShift Container Platform 4.12 或更高版本中,在使用带有 PTP 事件的 HTTP 传输时,您不需要在
PtpOperatorConfig
资源中设置transportHost
字段。为 PTP 时钟类型和接口配置
linuxptp
和phc2sys
。例如,将以下小节添加到.sourceFiles
中:- fileName: PtpConfigSlave.yaml 1 policyName: "config-policy" metadata: name: "du-ptp-slave" spec: profile: - name: "slave" interface: "ens5f1" 2 ptp4lOpts: "-2 -s --summary_interval -4" 3 phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16" 4 ptpClockThreshold: 5 holdOverTimeout: 30 #secs maxOffsetThreshold: 100 #nano secs minOffsetThreshold: -100 #nano secs
- 1
- 可以是
PtpConfigMaster.yaml
、PtpConfigSlave.yaml
或PtpConfigSlaveCvl.yaml
之一,具体取决于您的要求。PtpConfigSlaveCvl.yaml
为 Intel E810 Columbiaville NIC 配置linuxptp
服务。对于基于group-du-sno-ranGen.yaml
或group-du-3node-ranGen.yaml
的配置,请使用PtpConfigSlave.yaml
。 - 2
- 特定于设备的接口名称。
- 3
- 您必须将
--summary_interval -4
值附加到.spec.sourceFiles.spec.profile
中的ptp4lOpts
中,以启用 PTP fast 事件。 - 4
- 所需的
phc2sysOpts
值。-m
将消息输出到stdout
。linuxptp-daemon
DaemonSet
解析日志并生成 Prometheus 指标。 - 5
- 可选。如果
ptpClockThreshold
小节不存在,则默认值用于ptpClockThreshold
字段。小节显示默认的ptpClockThreshold
值。ptpClockThreshold
值配置 PTP master 时钟在触发 PTP 事件前的时长。holdOverTimeout
是在 PTP master clock 断开连接时,PTP 时钟事件状态更改为FREERUN
前的时间值(以秒为单位)。maxOffsetThreshold
和minOffsetThreshold
设置以纳秒为单位,它们与CLOCK_REALTIME
(phc2sys
) 或 master 偏移 (ptp4l
) 的值进行比较。当ptp4l
或phc2sys
偏移值超出这个范围时,PTP 时钟状态被设置为FREERUN
。当偏移值在这个范围内时,PTP 时钟状态被设置为LOCKED
。
- 将任何其他必要的更改和文件与自定义站点存储库合并。
- 将更改推送到站点配置存储库,以使用 GitOps ZTP 将 PTP 快速事件部署到新站点。
17.9.6.2. 配置使用 AMQP 传输的 PTP 事件
您可以在使用 GitOps Zero Touch Provisioning (ZTP) 管道部署的受管集群中配置使用 AMQP 传输的 PTP 事件。
HTTP 传输是 PTP 和裸机事件的默认传输。在可能的情况下,使用 HTTP 传输而不是 AMQP 用于 PTP 和裸机事件。AMQ Interconnect 于 2024 年 6 月 30 日结束生命周期(EOL)。AMQ Interconnect 的延长生命周期支持 (ELS) 于 2029 年 11 月 29 日结束。如需更多信息,请参阅 Red Hat AMQ Interconnect 支持状态。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 您已创建了管理自定义站点配置数据的 Git 存储库。
流程
将以下 YAML 添加到
common-ranGen.yaml
文件中的.spec.sourceFiles
中,以配置 AMQP Operator:#AMQ interconnect operator for fast events - fileName: AmqSubscriptionNS.yaml policyName: "subscriptions-policy" - fileName: AmqSubscriptionOperGroup.yaml policyName: "subscriptions-policy" - fileName: AmqSubscription.yaml policyName: "subscriptions-policy"
根据您的具体要求,将以下
PolicyGenTemplate
应用到group-du-3node-ranGen.yaml
、group-du-sno-ranGen.yaml
或group-du-standard-ranGen.yaml
文件:在
.sourceFiles
中,添加PtpOperatorConfig
CR 文件,该文件将 AMQ 传输主机配置为config-policy
:- fileName: PtpOperatorConfigForEvent.yaml policyName: "config-policy" spec: daemonNodeSelector: {} ptpEventConfig: enableEventPublisher: true transportHost: "amqp://amq-router.amq-router.svc.cluster.local"
为 PTP 时钟类型和接口配置
linuxptp
和phc2sys
。例如,将以下小节添加到.sourceFiles
中:- fileName: PtpConfigSlave.yaml 1 policyName: "config-policy" metadata: name: "du-ptp-slave" spec: profile: - name: "slave" interface: "ens5f1" 2 ptp4lOpts: "-2 -s --summary_interval -4" 3 phc2sysOpts: "-a -r -m -n 24 -N 8 -R 16" 4 ptpClockThreshold: 5 holdOverTimeout: 30 #secs maxOffsetThreshold: 100 #nano secs minOffsetThreshold: -100 #nano secs
- 1
- 可以是
PtpConfigMaster.yaml
、PtpConfigSlave.yaml
或PtpConfigSlaveCvl.yaml
,具体取决于您的要求。PtpConfigSlaveCvl.yaml
为 Intel E810 Columbiaville NIC 配置linuxptp
服务。对于基于group-du-sno-ranGen.yaml
或group-du-3node-ranGen.yaml
的配置,请使用PtpConfigSlave.yaml
。 - 2
- 特定于设备的接口名称。
- 3
- 您必须将
--summary_interval -4
值附加到.spec.sourceFiles.spec.profile
中的ptp4lOpts
中,以启用 PTP fast 事件。 - 4
- 所需的
phc2sysOpts
值。-m
将消息输出到stdout
。linuxptp-daemon
DaemonSet
解析日志并生成 Prometheus 指标。 - 5
- 可选。如果
ptpClockThreshold
小节不存在,则默认值用于ptpClockThreshold
字段。小节显示默认的ptpClockThreshold
值。ptpClockThreshold
值配置 PTP master 时钟在触发 PTP 事件前的时长。holdOverTimeout
是在 PTP master clock 断开连接时,PTP 时钟事件状态更改为FREERUN
前的时间值(以秒为单位)。maxOffsetThreshold
和minOffsetThreshold
设置以纳秒为单位,它们与CLOCK_REALTIME
(phc2sys
) 或 master 偏移 (ptp4l
) 的值进行比较。当ptp4l
或phc2sys
偏移值超出这个范围时,PTP 时钟状态被设置为FREERUN
。当偏移值在这个范围内时,PTP 时钟状态被设置为LOCKED
。
将以下
PolicyGenTemplate
更改应用到您的特定站点 YAML 文件,如example-sno-site.yaml
:在
.sourceFiles
中,添加Interconnect
CR 文件,该文件将 AMQ 路由器配置为config-policy
:- fileName: AmqInstance.yaml policyName: "config-policy"
- 将任何其他必要的更改和文件与自定义站点存储库合并。
- 将更改推送到站点配置存储库,以使用 GitOps ZTP 将 PTP 快速事件部署到新站点。
其他资源
17.9.7. 使用 PolicyGenTemplate CR 配置裸机事件
您可以使用 GitOps ZTP 管道来配置使用 HTTP 或 AMQP 传输的裸机事件。
HTTP 传输是 PTP 和裸机事件的默认传输。在可能的情况下,使用 HTTP 传输而不是 AMQP 用于 PTP 和裸机事件。AMQ Interconnect 于 2024 年 6 月 30 日结束生命周期(EOL)。AMQ Interconnect 的延长生命周期支持 (ELS) 于 2029 年 11 月 29 日结束。如需更多信息,请参阅 Red Hat AMQ Interconnect 支持状态。
17.9.7.1. 配置使用 HTTP 传输的裸机事件
您可以配置使用 GitOps Zero Touch Provisioning (ZTP)管道部署的受管集群中使用 HTTP 传输的裸机事件。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 您已创建了管理自定义站点配置数据的 Git 存储库。
流程
通过在
common-ranGen.yaml
文件中的spec.sourceFiles
中添加以下 YAML 来配置 Bare Metal Event Relay Operator:# Bare Metal Event Relay operator - fileName: BareMetalEventRelaySubscriptionNS.yaml policyName: "subscriptions-policy" - fileName: BareMetalEventRelaySubscriptionOperGroup.yaml policyName: "subscriptions-policy" - fileName: BareMetalEventRelaySubscription.yaml policyName: "subscriptions-policy"
将
HardwareEvent
CR 添加到特定组配置文件中的spec.sourceFiles
,例如在group-du-sno-ranGen.yaml
文件中:- fileName: HardwareEvent.yaml 1 policyName: "config-policy" spec: nodeSelector: {} transportHost: "http://hw-event-publisher-service.openshift-bare-metal-events.svc.cluster.local:9043" logLevel: "info"
- 1
- 每个基板管理控制器 (BMC) 只需要一个
HardwareEvent
CR。
注意在 OpenShift Container Platform 4.12 或更高版本中,当将 HTTP 传输用于裸机事件时,您不需要在
HardwareEvent
自定义资源 (CR) 中设置transportHost
字段。- 将任何其他必要的更改和文件与自定义站点存储库合并。
- 将更改推送到站点配置存储库,以使用 GitOps ZTP 将裸机事件部署到新站点。
运行以下命令来创建 Redfish Secret:
$ oc -n openshift-bare-metal-events create secret generic redfish-basic-auth \ --from-literal=username=<bmc_username> --from-literal=password=<bmc_password> \ --from-literal=hostaddr="<bmc_host_ip_addr>"
17.9.7.2. 配置使用 AMQP 传输的裸机事件
您可以在使用 GitOps Zero Touch Provisioning (ZTP) 管道部署的受管集群中配置使用 AMQP 传输的裸机事件。
HTTP 传输是 PTP 和裸机事件的默认传输。在可能的情况下,使用 HTTP 传输而不是 AMQP 用于 PTP 和裸机事件。AMQ Interconnect 于 2024 年 6 月 30 日结束生命周期(EOL)。AMQ Interconnect 的延长生命周期支持 (ELS) 于 2029 年 11 月 29 日结束。如需更多信息,请参阅 Red Hat AMQ Interconnect 支持状态。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
您已以具有
cluster-admin
权限的用户身份登录。 - 您已创建了管理自定义站点配置数据的 Git 存储库。
流程
要配置 AMQ Interconnect Operator 和 Bare Metal Event Relay Operator,请将以下 YAML 添加到
common-ranGen.yaml
文件中的spec.sourceFiles
中:# AMQ interconnect operator for fast events - fileName: AmqSubscriptionNS.yaml policyName: "subscriptions-policy" - fileName: AmqSubscriptionOperGroup.yaml policyName: "subscriptions-policy" - fileName: AmqSubscription.yaml policyName: "subscriptions-policy" # Bare Metal Event Rely operator - fileName: BareMetalEventRelaySubscriptionNS.yaml policyName: "subscriptions-policy" - fileName: BareMetalEventRelaySubscriptionOperGroup.yaml policyName: "subscriptions-policy" - fileName: BareMetalEventRelaySubscription.yaml policyName: "subscriptions-policy"
将
Interconnect
CR 添加到站点配置文件中的.spec.sourceFiles
中,例如example-sno-site.yaml
文件:- fileName: AmqInstance.yaml policyName: "config-policy"
将
HardwareEvent
CR 添加到特定组配置文件中的spec.sourceFiles
,例如在group-du-sno-ranGen.yaml
文件中:- fileName: HardwareEvent.yaml policyName: "config-policy" spec: nodeSelector: {} transportHost: "amqp://<amq_interconnect_name>.<amq_interconnect_namespace>.svc.cluster.local" 1 logLevel: "info"
- 1
transportHost
URL 由现有的 AMQ Interconnect CR名称
和命名空间
组成。例如,在transportHost: "amq-router.amq-router.svc.cluster.local"
中,AMQ Interconnectname
和namespace
都被设置为amq-router
。
注意每个基板管理控制器 (BMC) 仅需要一个
HardwareEvent
资源。-
在 Git 中提交
PolicyGenTemplate
更改,然后将更改推送到您的站点配置存储库,以使用 GitOps ZTP 将裸机事件监控部署到新站点。 运行以下命令来创建 Redfish Secret:
$ oc -n openshift-bare-metal-events create secret generic redfish-basic-auth \ --from-literal=username=<bmc_username> --from-literal=password=<bmc_password> \ --from-literal=hostaddr="<bmc_host_ip_addr>"
17.9.8. 配置 Image Registry Operator 以进行镜像的本地缓存
OpenShift Container Platform 使用本地 registry 管理镜像缓存。在边缘计算用例中,集群通常会受到带宽限制,与集中式镜像 registry 通信时,这可能会导致长时间镜像下载时间。
在初始部署期间,长时间下载时间不可避免。随着时间的推移,CRI-O 会在出现意外关闭时擦除 /var/lib/containers/storage
目录的风险。要解决长镜像下载时间,您可以使用 GitOps ZTP 在远程受管集群上创建本地镜像 registry。当集群部署在网络边缘时,这非常有用。
在使用 GitOps ZTP 设置本地镜像 registry 前,您需要在用于安装远程受管集群的 SiteConfig
CR 中配置磁盘分区。安装后,您可以使用 PolicyGenTemplate
CR 配置本地镜像 registry。然后,ZTP 管道创建持久性卷 (PV) 和持久性卷声明 (PVC) CR,并修补 imageregistry
配置。
本地镜像 registry 只能用于用户应用程序镜像,不能用于 OpenShift Container Platform 或 Operator Lifecycle Manager operator 镜像。
17.9.8.1. 使用 SiteConfig 配置磁盘分区
使用 SiteConfig
CR 和 GitOps ZTP 为受管集群配置磁盘分区。SiteConfig
CR 中的磁盘分区详情必须与底层磁盘匹配。
对设备使用持久性命名以避免每次重启时切换 /dev/sda
和 /dev/sdb
等设备名称。您可以使用 rootDeviceHints
选择可引导设备,然后使用同一设备进行进一步分区。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 - 您已创建了 Git 存储库,在其中管理自定义站点配置数据以用于 GitOps Zero Touch Provisioning (ZTP)。
流程
将以下 YAML 添加至用于安装受管集群的
SiteConfig
CR 中描述主机磁盘分区:nodes: rootDeviceHints: wwn: "0x62cea7f05c98c2002708a0a22ff480ea" diskPartition: - device: /dev/disk/by-id/wwn-0x62cea7f05c98c2002708a0a22ff480ea 1 partitions: - mount_point: /var/imageregistry size: 102500 2 start: 344844 3
-
保存
SiteConfig
CR 并将其推送到站点配置存储库。
ZTP 管道使用 SiteConfig
CR 置备集群并配置磁盘分区。
17.9.8.2. 使用 PolicyGenTemplate CR 配置镜像 registry
使用 PolicyGenTemplate
(PGT) CR 应用配置镜像 registry 所需的 CR 并对 imageregistry
配置进行补丁。
先决条件
- 您已在受管集群中配置了磁盘分区。
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 - 您已创建了 Git 存储库,在其中管理自定义站点配置数据以用于 GitOps Zero Touch Provisioning (ZTP)。
流程
在适当的
PolicyGenTemplate
CR 中配置存储类、持久性卷声明、持久性卷和镜像 registry 配置。例如,要配置单个站点,请将以下 YAML 添加到文件example-sno-site.yaml
中:sourceFiles: # storage class - fileName: StorageClass.yaml policyName: "sc-for-image-registry" metadata: name: image-registry-sc annotations: ran.openshift.io/ztp-deploy-wave: "100" 1 # persistent volume claim - fileName: StoragePVC.yaml policyName: "pvc-for-image-registry" metadata: name: image-registry-pvc namespace: openshift-image-registry annotations: ran.openshift.io/ztp-deploy-wave: "100" spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi storageClassName: image-registry-sc volumeMode: Filesystem # persistent volume - fileName: ImageRegistryPV.yaml 2 policyName: "pv-for-image-registry" metadata: annotations: ran.openshift.io/ztp-deploy-wave: "100" - fileName: ImageRegistryConfig.yaml policyName: "config-for-image-registry" complianceType: musthave metadata: annotations: ran.openshift.io/ztp-deploy-wave: "100" spec: storage: pvc: claim: "image-registry-pvc"
重要不要为
- fileName: ImageRegistryConfig.yaml
配置设置complianceType: mustonlyhave
。这可能导致 registry pod 部署失败。-
提交 Git 中的
PolicyGenTemplate
更改,然后推送到由 GitOps ZTP Argo CD 应用程序监控的 Git 存储库。
验证
使用以下步骤排除受管集群中本地镜像 registry 的错误:
在登录到受管集群时,验证是否成功登录到 registry。运行以下命令:
导出受管集群名称:
$ cluster=<managed_cluster_name>
获取受管集群
kubeconfig
详情:$ oc get secret -n $cluster $cluster-admin-password -o jsonpath='{.data.password}' | base64 -d > kubeadmin-password-$cluster
下载并导出集群
kubeconfig
:$ oc get secret -n $cluster $cluster-admin-kubeconfig -o jsonpath='{.data.kubeconfig}' | base64 -d > kubeconfig-$cluster && export KUBECONFIG=./kubeconfig-$cluster
- 验证从受管集群访问镜像 registry。请参阅"访问 registry"。
检查
imageregistry.operator.openshift.io
组实例的Config
CRD 是否没有报告错误。登录到受管集群时运行以下命令:$ oc get image.config.openshift.io cluster -o yaml
输出示例
apiVersion: config.openshift.io/v1 kind: Image metadata: annotations: include.release.openshift.io/ibm-cloud-managed: "true" include.release.openshift.io/self-managed-high-availability: "true" include.release.openshift.io/single-node-developer: "true" release.openshift.io/create-only: "true" creationTimestamp: "2021-10-08T19:02:39Z" generation: 5 name: cluster resourceVersion: "688678648" uid: 0406521b-39c0-4cda-ba75-873697da75a4 spec: additionalTrustedCA: name: acm-ice
检查受管集群上的
PersistentVolumeClaim
是否填充了数据。登录到受管集群时运行以下命令:$ oc get pv image-registry-sc
检查
registry*
pod 是否正在运行,并位于openshift-image-registry
命名空间下。$ oc get pods -n openshift-image-registry | grep registry*
输出示例
cluster-image-registry-operator-68f5c9c589-42cfg 1/1 Running 0 8d image-registry-5f8987879-6nx6h 1/1 Running 0 8d
检查受管集群中的磁盘分区是否正确:
为受管集群打开默认 shell:
$ oc debug node/sno-1.example.com
运行
lsblk
以检查主机磁盘分区:sh-4.4# lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT sda 8:0 0 446.6G 0 disk |-sda1 8:1 0 1M 0 part |-sda2 8:2 0 127M 0 part |-sda3 8:3 0 384M 0 part /boot |-sda4 8:4 0 336.3G 0 part /sysroot `-sda5 8:5 0 100.1G 0 part /var/imageregistry 1 sdb 8:16 0 446.6G 0 disk sr0 11:0 1 104M 0 rom
- 1
/var/imageregistry
表示磁盘已被正确分区。
其他资源
17.9.9. 在 PolicyGenTemplate CR 中使用 hub 模板
Topology Aware Lifecycle Manager 支持在 GitOps ZTP 的配置策略中支持部分 Red Hat Advanced Cluster Management (RHACM) hub 集群模板功能。
hub-side 集群模板允许您定义可动态自定义到目标集群的配置策略。这可减少为具有辅助配置但具有不同值的很多集群创建单独的策略的需求。
策略模板仅限于与定义策略的命名空间相同的命名空间。这意味着,您必须在创建策略的同一命名空间中创建 hub 模板中引用的对象。
以下支持的 hub 模板功能可用于 TALM 的 GitOps ZTP:
fromConfigmap
返回命名的ConfigMap
资源中提供的 data 键的值。注意ConfigMap
CR 有一个 1 MiB 大小限制。ConfigMap
CR 的有效大小被last-applied-configuration
注解进一步限制。要避免last-applied-configuration
限制,请在模板ConfigMap
中添加以下注解:argocd.argoproj.io/sync-options: Replace=true
-
base64enc
返回输入字符串的 base64 编码值 -
base64dec
返回 base64 编码的输入字符串的解码值 -
indent
返回输入字符串,并带有添加的缩进空格 -
autoindent
返回输入字符串,并根据父模板中使用的空间添加空格 -
toInt
casts 并返回输入值的整数值 -
toBool
将输入字符串转换为布尔值,并返回布尔值
各种 开源社区功能 也可用于 GitOps ZTP。
17.9.9.1. hub 模板示例
以下代码示例是有效的 hub 模板。每个模板都会从 default
命名空间的 ConfigMap
CR 返回的其名称为 test-config
的值。
使用键
common-key
返回值:{{hub fromConfigMap "default" "test-config" "common-key" hub}}
使用
.ManagedClusterName
字段的串联值和字符串-name
返回一个字符串:{{hub fromConfigMap "default" "test-config" (printf "%s-name" .ManagedClusterName) hub}}
casts 并从
.ManagedClusterName
字段的串联值和字符串-name
返回布尔值:{{hub fromConfigMap "default" "test-config" (printf "%s-name" .ManagedClusterName) | toBool hub}}
casts 并从
.ManagedClusterName
字段的串联值和字符串-name
返回整数值:{{hub (printf "%s-name" .ManagedClusterName) | fromConfigMap "default" "test-config" | toInt hub}}
17.9.9.2. 使用 hub 集群模板在站点 PolicyGenTemplate CR 中指定主机 NIC
您可以在单个 ConfigMap
CR 中管理主机 NIC,并使用 hub 集群模板在应用到集群主机的生成的策略中填充自定义 NIC 值。在站点 PolicyGenTemplate
(PGT) CR 中使用 hub 集群模板意味着您不需要为每个站点创建多个站点 PGT CR。
以下示例演示了如何使用单个 ConfigMap
CR 管理集群主机 NIC,并使用单个 PolicyGenTemplate
站点 CR 作为策略应用到集群。
当您使用 fromConfigmap
功能时,printf
变量仅适用于模板资源 data
键字段。您不能将其与 name
和 namespace
字段一起使用。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 - 您已创建了管理自定义站点配置数据的 Git 存储库。存储库必须可从 hub 集群访问,并定义为 GitOps ZTP ArgoCD 应用程序的源存储库。
流程
创建描述一组主机的 NIC 的
ConfigMap
资源。例如:apiVersion: v1 kind: ConfigMap metadata: name: sriovdata namespace: ztp-site annotations: argocd.argoproj.io/sync-options: Replace=true 1 data: example-sno-du_fh-numVfs: "8" example-sno-du_fh-pf: ens1f0 example-sno-du_fh-priority: "10" example-sno-du_fh-vlan: "140" example-sno-du_mh-numVfs: "8" example-sno-du_mh-pf: ens3f0 example-sno-du_mh-priority: "10" example-sno-du_mh-vlan: "150"
- 1
- 只有在
ConfigMap
大于 1 MiB 时,才需要argocd.argoproj.io/sync-options
注解。
注意ConfigMap
必须位于同一命名空间中,其策略带有 hub 模板替换的策略。-
在 Git 中提交
ConfigMap
CR,然后推送到由 Argo CD 应用程序监控的 Git 存储库。 创建一个使用模板从
ConfigMap
对象拉取所需数据的 site PGT CR。例如:apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "site" namespace: "ztp-site" spec: remediationAction: inform bindingRules: group-du-sno: "" mcp: "master" sourceFiles: - fileName: SriovNetwork.yaml policyName: "config-policy" metadata: name: "sriov-nw-du-fh" spec: resourceName: du_fh vlan: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-vlan" .ManagedClusterName) | toInt hub}}' - fileName: SriovNetworkNodePolicy.yaml policyName: "config-policy" metadata: name: "sriov-nnp-du-fh" spec: deviceType: netdevice isRdma: true nicSelector: pfNames: - '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-pf" .ManagedClusterName) | autoindent hub}}' numVfs: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-numVfs" .ManagedClusterName) | toInt hub}}' priority: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_fh-priority" .ManagedClusterName) | toInt hub}}' resourceName: du_fh - fileName: SriovNetwork.yaml policyName: "config-policy" metadata: name: "sriov-nw-du-mh" spec: resourceName: du_mh vlan: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-vlan" .ManagedClusterName) | toInt hub}}' - fileName: SriovNetworkNodePolicy.yaml policyName: "config-policy" metadata: name: "sriov-nnp-du-mh" spec: deviceType: vfio-pci isRdma: false nicSelector: pfNames: - '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-pf" .ManagedClusterName) hub}}' numVfs: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-numVfs" .ManagedClusterName) | toInt hub}}' priority: '{{hub fromConfigMap "ztp-site" "sriovdata" (printf "%s-du_mh-priority" .ManagedClusterName) | toInt hub}}' resourceName: du_mh
在 Git 中提交站点
PolicyGenTemplate
CR,并推送到由 ArgoCD 应用程序监控的 Git 存储库。注意对引用的
ConfigMap
CR 的后续更改不会自动同步到应用的策略。您需要手动同步新的ConfigMap
更改来更新现有的 PolicyGenTemplate CR。请参阅 "Syncing new ConfigMap changes to existing PolicyGenTemplate CR"。
17.9.9.3. 使用 hub 集群模板在组 PolicyGenTemplate CR 中指定 VLAN ID
您可以在单个 ConfigMap
CR 中为受管集群管理 VLAN ID,并使用 hub 集群模板在应用到集群的生成的策略中填充 VLAN ID。
以下示例演示了如何在单个 ConfigMap
CR 中管理 VLAN ID,并使用单个 PolicyGenTemplate
组 CR 在单个集群策略中应用它们。
使用 fromConfigmap
功能时,printf
变量仅适用于模板资源 data
键字段。您不能将其与 name
和 namespace
字段一起使用。
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 - 您已创建了管理自定义站点配置数据的 Git 存储库。该存储库必须可从 hub 集群访问,并定义为 Argo CD 应用程序的源仓库。
流程
创建描述一组集群主机的 VLAN ID 的
ConfigMap
CR。例如:apiVersion: v1 kind: ConfigMap metadata: name: site-data namespace: ztp-group annotations: argocd.argoproj.io/sync-options: Replace=true 1 data: site-1-vlan: "101" site-2-vlan: "234"
- 1
- 只有在
ConfigMap
大于 1 MiB 时,才需要argocd.argoproj.io/sync-options
注解。
注意ConfigMap
必须位于同一命名空间中,其策略带有 hub 模板替换的策略。-
在 Git 中提交
ConfigMap
CR,然后推送到由 Argo CD 应用程序监控的 Git 存储库。 创建一个组 PGT CR,它使用 hub 模板从
ConfigMap
对象拉取所需的 VLAN ID。例如,将以下 YAML 片断添加到组 PGT CR 中:- fileName: SriovNetwork.yaml policyName: "config-policy" metadata: name: "sriov-nw-du-mh" annotations: ran.openshift.io/ztp-deploy-wave: "10" spec: resourceName: du_mh vlan: '{{hub fromConfigMap "" "site-data" (printf "%s-vlan" .ManagedClusterName) | toInt hub}}'
在 Git 中提交组
PolicyGenTemplate
CR,然后推送到由 Argo CD 应用程序监控的 Git 存储库。注意对引用的
ConfigMap
CR 的后续更改不会自动同步到应用的策略。您需要手动同步新的ConfigMap
更改来更新现有的 PolicyGenTemplate CR。请参阅 "Syncing new ConfigMap changes to existing PolicyGenTemplate CR"。
17.9.9.4. 将新 ConfigMap 更改同步到现有的 PolicyGenTemplate CR
先决条件
-
已安装 OpenShift CLI(
oc
)。 -
已以具有
cluster-admin
权限的用户身份登录到 hub 集群。 -
您已创建了
PolicyGenTemplate
CR,它使用 hub 集群模板从ConfigMap
CR 中拉取信息。
流程
-
更新
ConfigMap
CR 的内容,并应用 hub 集群中的更改。 要将更新的
ConfigMap
CR 的内容同步到部署的策略中,请执行以下操作之一:选项 1:删除现有策略。ArgoCD 使用
PolicyGenTemplate
CR 立即重新创建已删除的策略。例如,运行以下命令:$ oc delete policy <policy_name> -n <policy_namespace>
选项 2:在每次更新 ConfigMap 时,每次更新
ConfigMap
时,将特殊注解policy.open-cluster-management.io/trigger-update
应用到策略。例如:$ oc annotate policy <policy_name> -n <policy_namespace> policy.open-cluster-management.io/trigger-update="1"
注意您必须应用更新的策略才能使更改生效。如需更多信息,请参阅重新处理的特殊注解。
可选:如果存在,删除包含策略的
ClusterGroupUpdate
CR。例如:$ oc delete clustergroupupgrade <cgu_name> -n <cgu_namespace>
创建新的
ClusterGroupUpdate
CR,其中包含要应用更新的ConfigMap
更改的策略。例如,将以下 YAML 添加到文件cgr-example.yaml
中:apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: <cgr_name> namespace: <policy_namespace> spec: managedPolicies: - <managed_policy> enable: true clusters: - <managed_cluster_1> - <managed_cluster_2> remediationStrategy: maxConcurrency: 2 timeout: 240
应用更新的策略:
$ oc apply -f cgr-example.yaml
17.10. 使用 Topology Aware Lifecycle Manager 更新受管集群
您可以使用 Topology Aware Lifecycle Manager (TALM) 来管理多个集群的软件生命周期。TALM 使用 Red Hat Advanced Cluster Management(RHACM)策略在目标集群中进行更改。
17.10.1. 关于 Topology Aware Lifecycle Manager 配置
Topology Aware Lifecycle Manager(TALM)管理一个或多个 OpenShift Container Platform 集群的部署 Red Hat Advanced Cluster Management(RHACM)策略。通过在大型集群网络中使用 TALM,可以使用有限制的批处理,在集群中逐步实施相关的策略。这有助于最大程度降低更新时可能造成的服务中断。使用 TALM,您可以控制以下操作:
- 更新的时间
- RHACM 管理的集群数量
- 将策略应用到的受管集群的子集
- 集群的更新顺序
- 在集群中修复的一组策略
- 在集群中修复的策略顺序
- Canary 集群的分配
对于单节点 OpenShift,Topology Aware Lifecycle Manager (TALM) 提供以下功能:
- 在升级前创建部署的备份
- 有限带宽的集群预缓存镜像
TALM 支持编排 OpenShift Container Platform y-stream 和 z-stream 更新,以及 y-streams 和 z-streams 上的 day-two 操作。
17.10.2. 关于用于 Topology Aware Lifecycle Manager 的受管策略
Topology Aware Lifecycle Manager(TALM)使用 RHACM 策略进行集群更新。
TALM 可以用来管理任何策略 CR 的推出,其中 remediationAction
字段被设置为 inform
。支持的用例包括:
- 手动创建用户策略 CR
-
从
PolicyGenTemplate
自定义资源定义 (CRD) 自动生成的策略
对于使用手动批准更新 Operator 订阅的策略,TALM 提供了额外的功能来批准更新的 Operator 的安装。
有关受管策略的更多信息,请参阅 RHACM 文档中的策略概述。
如需有关 PolicyGenTemplate
CRD 的更多信息,请参阅"使用策略和 PolicyGenTemplate 资源配置受管集群"中的"About the PolicyGenTemplate CRD"部分。
17.10.3. 使用 Web 控制台安装 Topology Aware Lifecycle Manager
您可以使用 OpenShift Container Platform Web 控制台安装 Topology Aware Lifecycle Manager。
先决条件
- 安装最新版本的 RHACM Operator。
- 使用断开连接的 regitry 设置 hub 集群。
-
以具有
cluster-admin
特权的用户身份登录。
流程
- 在 OpenShift Container Platform Web 控制台中导航至 Operators → OperatorHub。
- 从可用的 Operator 列表中选择 Topology Aware Lifecycle Manager,然后点 Install。
- 保持默认的选择 Installation mode ["All namespaces on the cluster (default)"] 和 Installed Namespace ("openshift-operators") 以确保 Operator 已正确安装。
- 点 Install。
验证
确认安装成功:
- 进入到 Operators → Installed Operators 页面。
-
检查 Operator 是否在
All Namespaces
命名空间中,其状态为Succeeded
。
如果 Operator 没有成功安装:
-
导航到 Operators → Installed Operators 页面,并检查
Status
列中是否有任何错误或故障。 -
进入到 Workloads → Pods 页面,检查
cluster-group-upgrades-controller-manager
pod 中报告问题的容器日志。
17.10.4. 使用 CLI 安装 Topology Aware Lifecycle Manager
您可以使用 OpenShift CLI(oc
)安装 Topology Aware Lifecycle Manager(TALM)。
先决条件
-
安装 OpenShift CLI (
oc
) 。 - 安装最新版本的 RHACM Operator。
- 使用断开连接的 registry 设置 hub 集群。
-
以具有
cluster-admin
特权的用户身份登录。
流程
创建一个
Subscription
CR:定义
Subscription
CR 并保存 YAML 文件,如talm-subscription.yaml
:apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: openshift-topology-aware-lifecycle-manager-subscription namespace: openshift-operators spec: channel: "stable" name: topology-aware-lifecycle-manager source: redhat-operators sourceNamespace: openshift-marketplace
运行以下命令来创建
Subscription
CR:$ oc create -f talm-subscription.yaml
验证
检查 CSV 资源来验证安装是否成功:
$ oc get csv -n openshift-operators
输出示例
NAME DISPLAY VERSION REPLACES PHASE topology-aware-lifecycle-manager.4.12.x Topology Aware Lifecycle Manager 4.12.x Succeeded
验证 TALM 是否正在运行:
$ oc get deploy -n openshift-operators
输出示例
NAMESPACE NAME READY UP-TO-DATE AVAILABLE AGE openshift-operators cluster-group-upgrades-controller-manager 1/1 1 1 14s
17.10.5. 关于 ClusterGroupUpgrade CR
Topology Aware Lifecycle Manager(TALM)为一组集群从 ClusterGroupUpgrade
CR 构建补救计划。您可以在 ClusterGroupUpgrade
CR 中定义以下规格:
- 组中的集群
-
阻塞
ClusterGroupUpgrade
CR - 适用的受管策略列表
- 并发更新数
- 适用的 Canary 更新
- 更新前和更新之后执行的操作
- 更新数据
您可以使用 ClusterGroupUpgrade
CR 中的 enable
字段控制更新的开始时间。例如,如果您调度的维护窗口为 4 小时,您可以准备 ClusterGroupUpgrade
CR,并将 enable
字段设置为 false
。
您可以通过配置 spec.remediationStrategy.timeout
设置来设置超时,如下所示:
spec remediationStrategy: maxConcurrency: 1 timeout: 240
您可以使用 batchTimeoutAction
来确定更新是否有集群发生的情况。您可以指定 continue
跳过失败的集群,并继续升级其他集群,或 abort
以停止所有集群的策略补救。超时后,TALM 删除所有 enforce
策略,以确保对集群不进行进一步的更新。
要应用更改,您可以将 enabled
字段设置为 true
。
如需更多信息,请参阅"将更新策略应用到受管集群"部分。
当 TALM 通过对指定集群进行补救时,ClusterGroupUpgrade
CR 可以为多个条件报告 true 或 false 状态。
当 TALM 完成集群更新后,集群不会在同一 ClusterGroupUpgrade
CR 控制下再次更新。在以下情况下,必须创建新的 ClusterGroupUpgrade
CR:
- 当您需要再次更新集群时
-
当集群在更新后变为与
inform
策略不符合时
17.10.5.1. 选择集群
TALM 构建补救计划并根据以下字段选择集群:
-
clusterLabelSelector
字段指定您要更新的集群标签。这由来自k8s.io/apimachinery/pkg/apis/meta/v1
的标准标签选择器的列表组成。列表中的每个选择器都使用标签值对或标签表达式。来自每个选择器的匹配会添加到集群的最终列表中,以及来自clusterSelector
字段和cluster
字段的匹配项。 -
clusters
字段指定要更新的集群列表。 -
canaries
字段指定集群进行 Canary 更新。 -
maxConcurrency
字段指定批处理中要更新的集群数量。
您可以使用 clusters
、clusterLabelSelector
和 clusterSelector
字段来创建组合的集群列表。
补救计划从 canaries
字段中列出的集群开始。每个 canary 集群组成一个集群批处理。
Sample ClusterGroupUpgrade
CR,带有 the enabled field
设置为 false
apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: creationTimestamp: '2022-11-18T16:27:15Z' finalizers: - ran.openshift.io/cleanup-finalizer generation: 1 name: talm-cgu namespace: talm-namespace resourceVersion: '40451823' uid: cca245a5-4bca-45fa-89c0-aa6af81a596c Spec: actions: afterCompletion: deleteObjects: true beforeEnable: {} backup: false clusters: 1 - spoke1 enable: false 2 managedPolicies: 3 - talm-policy preCaching: false remediationStrategy: 4 canaries: 5 - spoke1 maxConcurrency: 2 6 timeout: 240 clusterLabelSelectors: 7 - matchExpressions: - key: label1 operator: In values: - value1a - value1b batchTimeoutAction: 8 status: 9 computedMaxConcurrency: 2 conditions: - lastTransitionTime: '2022-11-18T16:27:15Z' message: All selected clusters are valid reason: ClusterSelectionCompleted status: 'True' type: ClustersSelected 10 - lastTransitionTime: '2022-11-18T16:27:15Z' message: Completed validation reason: ValidationCompleted status: 'True' type: Validated 11 - lastTransitionTime: '2022-11-18T16:37:16Z' message: Not enabled reason: NotEnabled status: 'False' type: Progressing managedPoliciesForUpgrade: - name: talm-policy namespace: talm-namespace managedPoliciesNs: talm-policy: talm-namespace remediationPlan: - - spoke1 - - spoke2 - spoke3 status:
- 1
- 定义要更新的集群列表。
- 2
enable
字段设置为false
。- 3
- 列出要修复的用户定义的策略集合。
- 4
- 定义集群更新的具体信息。
- 5
- 定义可用于 canary 更新的集群。
- 6
- 定义批处理中的最大并发更新数。补救批处理数量是 canary 集群的数量,加上除 Canary 集群外的集群数量除以 maxConcurrency 值。已兼容所有受管策略的集群不包括在补救计划中。
- 7
- 显示选择集群的参数。
- 8
- 控制批处理超时时会发生什么。可能的值有
abort
或continue
。如果未指定,则默认为continue
。 - 9
- 显示更新状态的信息。
- 10
ClustersSelected
条件显示所有选择的集群有效。- 11
Validated
条件显示所有选择的集群都已验证。
在更新 canary 集群的过程中任何错误都会停止更新过程。
当成功创建补救计划时,您可以将 enable
字段设置为 true
,TALM 会开始使用指定的受管策略更新不合规的集群。
只有 ClusterGroupUpgrade
CR 的 enable
字段设置为 false
时,才能更改 spec
字段。
17.10.5.2. 验证
TALM 检查所有指定的受管策略是否可用并正确,并使用 Validated
条件来报告状态和原因:
true
验证已完成。
false
策略缺失或无效,或者指定了无效的平台镜像。
17.10.5.3. 预缓存
集群可能具有有限的带宽来访问容器镜像 registry,这可能会在更新完成前造成超时。在单节点 OpenShift 集群中,您可以使用预缓存来避免这种情况。当创建 ClusterGroupUpgrade
CR 时,容器镜像预缓存会启动,并将 preCaching
字段设置为 true
。
TALM 使用 PrecacheSpecValid
条件来报告状态信息,如下所示:
true
预缓存规格有效且一致。
false
预缓存规格不完整。
TALM 使用 PrecachingSucceeded
条件来报告状态信息,如下所示:
true
TALM 已完成预缓存过程。如果任何集群的预缓存失败,则该集群的更新会失败,但会继续执行所有其他集群。如果任何集群预缓存失败,您会接收到一个通知信息。
false
预缓存仍在为一个或多个集群处理,或者所有集群都失败。
如需更多信息,请参阅"使用容器镜像预缓存功能"部分。
17.10.5.4. 创建备份
对于单节点 OpenShift,TALM 可以在更新前创建部署的备份。如果更新失败,您可以恢复之前的版本并将集群恢复到工作状态,而无需重新置备应用程序。要使用备份功能,您首先创建一个 ClusterGroupUpgrade
CR,并将 backup
字段设置为 true
。为确保备份内容为最新版本,在 ClusterGroupUpgrade
CR 中的 enable
字段设置为 true
之前,不会进行备份。
TALM 使用 BackupSucceeded
条件来报告状态,如下所示:
true
备份对于所有集群都完成,或备份运行已完成但对一个或多个集群失败。如果任何集群的备份失败,则该集群的更新会失败,但会继续执行所有其他集群。
false
备份仍在为一个或多个集群处理,或者所有集群都失败。
如需更多信息,请参阅"在升级前创建集群资源备份"部分。
17.10.5.5. 更新集群
TALM 按照补救计划强制实施策略。在当前批处理的所有集群与所有受管策略兼容后,对后续批处理的策略强制启动。如果批处理超时,TALM 会进入下一个批处理。批处理的超时值是 spec.timeout
字段除以补救计划中的批处理数量。
TALM 使用 Progressing
条件来报告状态以及如下原因:
true
TALM 是补救不合规的策略。
false
更新没有进行。可能的原因包括:
- 所有集群都符合所有受管策略。
- 当策略补救用时过长时,更新会超时。
- 阻塞系统中丢失或尚未完成的 CR。
-
ClusterGroupUpgrade
CR 不会被启用。 - 备份仍在进行中。
受管策略会按照 ClusterGroupUpgrade
CR 中的 managedPolicies
字段中列出的顺序进行应用。一个受管策略被应用于指定的集群。当集群符合当前策略时,会应用下一个受管策略。
处于 Progressing
状态的 ClusterGroupUpgrade
CR 示例
apiVersion: ran.openshift.io/v1alpha1
kind: ClusterGroupUpgrade
metadata:
creationTimestamp: '2022-11-18T16:27:15Z'
finalizers:
- ran.openshift.io/cleanup-finalizer
generation: 1
name: talm-cgu
namespace: talm-namespace
resourceVersion: '40451823'
uid: cca245a5-4bca-45fa-89c0-aa6af81a596c
Spec:
actions:
afterCompletion:
deleteObjects: true
beforeEnable: {}
backup: false
clusters:
- spoke1
enable: true
managedPolicies:
- talm-policy
preCaching: true
remediationStrategy:
canaries:
- spoke1
maxConcurrency: 2
timeout: 240
clusterLabelSelectors:
- matchExpressions:
- key: label1
operator: In
values:
- value1a
- value1b
batchTimeoutAction:
status:
clusters:
- name: spoke1
state: complete
computedMaxConcurrency: 2
conditions:
- lastTransitionTime: '2022-11-18T16:27:15Z'
message: All selected clusters are valid
reason: ClusterSelectionCompleted
status: 'True'
type: ClustersSelected
- lastTransitionTime: '2022-11-18T16:27:15Z'
message: Completed validation
reason: ValidationCompleted
status: 'True'
type: Validated
- lastTransitionTime: '2022-11-18T16:37:16Z'
message: Remediating non-compliant policies
reason: InProgress
status: 'True'
type: Progressing 1
managedPoliciesForUpgrade:
- name: talm-policy
namespace: talm-namespace
managedPoliciesNs:
talm-policy: talm-namespace
remediationPlan:
- - spoke1
- - spoke2
- spoke3
status:
currentBatch: 2
currentBatchRemediationProgress:
spoke2:
state: Completed
spoke3:
policyIndex: 0
state: InProgress
currentBatchStartedAt: '2022-11-18T16:27:16Z'
startedAt: '2022-11-18T16:27:15Z'
- 1
Progressing
字段显示 TALM 处于补救策略的过程。
17.10.5.6. 更新状态
TALM 使用 Succeeded
条件来报告状态和如下原因:
true
所有集群都符合指定的受管策略。
false
因为没有集群可用于补救,策略补救会失败,或者因为以下原因之一策略补救用时过长:
- 在当前批处理包含 Canary 更新时,批处理中的集群不会遵循批处理超时中的所有受管策略。
-
集群不符合
remediationStrategy
字段中指定的timeout
值的受管策略。
处于 Succeeded
状态的 ClusterGroupUpgrade
CR 示例
apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-upgrade-complete namespace: default spec: clusters: - spoke1 - spoke4 enable: true managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy remediationStrategy: maxConcurrency: 1 timeout: 240 status: 1 clusters: - name: spoke1 state: complete - name: spoke4 state: complete conditions: - message: All selected clusters are valid reason: ClusterSelectionCompleted status: "True" type: ClustersSelected - message: Completed validation reason: ValidationCompleted status: "True" type: Validated - message: All clusters are compliant with all the managed policies reason: Completed status: "False" type: Progressing 2 - message: All clusters are compliant with all the managed policies reason: Completed status: "True" type: Succeeded 3 managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy2-common-pao-sub-policy namespace: default remediationPlan: - - spoke1 - - spoke4 status: completedAt: '2022-11-18T16:27:16Z' startedAt: '2022-11-18T16:27:15Z'
timedout
状态的 Sample ClusterGroupUpgrade
CR
apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: creationTimestamp: '2022-11-18T16:27:15Z' finalizers: - ran.openshift.io/cleanup-finalizer generation: 1 name: talm-cgu namespace: talm-namespace resourceVersion: '40451823' uid: cca245a5-4bca-45fa-89c0-aa6af81a596c spec: actions: afterCompletion: deleteObjects: true beforeEnable: {} backup: false clusters: - spoke1 - spoke2 enable: true managedPolicies: - talm-policy preCaching: false remediationStrategy: maxConcurrency: 2 timeout: 240 status: clusters: - name: spoke1 state: complete - currentPolicy: 1 name: talm-policy status: NonCompliant name: spoke2 state: timedout computedMaxConcurrency: 2 conditions: - lastTransitionTime: '2022-11-18T16:27:15Z' message: All selected clusters are valid reason: ClusterSelectionCompleted status: 'True' type: ClustersSelected - lastTransitionTime: '2022-11-18T16:27:15Z' message: Completed validation reason: ValidationCompleted status: 'True' type: Validated - lastTransitionTime: '2022-11-18T16:37:16Z' message: Policy remediation took too long reason: TimedOut status: 'False' type: Progressing - lastTransitionTime: '2022-11-18T16:37:16Z' message: Policy remediation took too long reason: TimedOut status: 'False' type: Succeeded 2 managedPoliciesForUpgrade: - name: talm-policy namespace: talm-namespace managedPoliciesNs: talm-policy: talm-namespace remediationPlan: - - spoke1 - spoke2 status: startedAt: '2022-11-18T16:27:15Z' completedAt: '2022-11-18T20:27:15Z'
17.10.5.7. 阻塞 ClusterGroupUpgrade CR
您可以创建多个 ClusterGroupUpgrade
CR,并控制应用程序的顺序。
例如,如果您创建了 ClusterGroupUpgrade
CR C,它会阻塞 ClusterGroupUpgrade
CR A 的启动,那么 ClusterGroupUpgrade
CR A 将无法启动,直到 ClusterGroupUpgrade
CR C 变为 UpgradeComplete
状态。
一个 ClusterGroupUpgrade
CR 可以有多个阻塞 CR。在这种情况下,所有块 CR 都必须在升级当前 CR 升级前完成。
先决条件
- 安装 Topology Aware Lifecycle Manager(TALM)。
- 置备一个或多个受管集群。
-
以具有
cluster-admin
特权的用户身份登录。 - 在 hub 集群中创建 RHACM 策略。
流程
将
ClusterGroupUpgrade
CR 的内容保存到cgu-a.yaml
、cgu-b.yaml
和cgu-c.yaml
文件中。apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-a namespace: default spec: blockingCRs: 1 - name: cgu-c namespace: default clusters: - spoke1 - spoke2 - spoke3 enable: false managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy remediationStrategy: canaries: - spoke1 maxConcurrency: 2 timeout: 240 status: conditions: - message: The ClusterGroupUpgrade CR is not enabled reason: UpgradeNotStarted status: "False" type: Ready copiedPolicies: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy2-common-pao-sub-policy namespace: default - name: policy3-common-ptp-sub-policy namespace: default placementBindings: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy placementRules: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy remediationPlan: - - spoke1 - - spoke2
- 1
- 定义阻塞 CR。
cgu-a
更新无法启动,直到cgu-c
完成后。
apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-b namespace: default spec: blockingCRs: 1 - name: cgu-a namespace: default clusters: - spoke4 - spoke5 enable: false managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy - policy4-common-sriov-sub-policy remediationStrategy: maxConcurrency: 1 timeout: 240 status: conditions: - message: The ClusterGroupUpgrade CR is not enabled reason: UpgradeNotStarted status: "False" type: Ready copiedPolicies: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy2-common-pao-sub-policy namespace: default - name: policy3-common-ptp-sub-policy namespace: default - name: policy4-common-sriov-sub-policy namespace: default placementBindings: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy placementRules: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy remediationPlan: - - spoke4 - - spoke5 status: {}
- 1
cgu-b
更新无法启动,直到cgu-a
完成后。
apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-c namespace: default spec: 1 clusters: - spoke6 enable: false managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy - policy4-common-sriov-sub-policy remediationStrategy: maxConcurrency: 1 timeout: 240 status: conditions: - message: The ClusterGroupUpgrade CR is not enabled reason: UpgradeNotStarted status: "False" type: Ready copiedPolicies: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy managedPoliciesCompliantBeforeUpgrade: - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy4-common-sriov-sub-policy namespace: default placementBindings: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy placementRules: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy remediationPlan: - - spoke6 status: {}
- 1
cgu-c
更新没有任何阻塞 CR。当enable
字段设为true
时,TALM 会启动cgu-c
更新。
通过为每个相关 CR 运行以下命令创建
ClusterGroupUpgrade
CR:$ oc apply -f <name>.yaml
通过为每个相关 CR 运行以下命令启动更新过程:
$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/<name> \ --type merge -p '{"spec":{"enable":true}}'
以下示例显示
enable
字段设为true
的ClusterGroupUpgrade
CR:带有阻塞 CR 的
cgu-a
示例apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-a namespace: default spec: blockingCRs: - name: cgu-c namespace: default clusters: - spoke1 - spoke2 - spoke3 enable: true managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy remediationStrategy: canaries: - spoke1 maxConcurrency: 2 timeout: 240 status: conditions: - message: 'The ClusterGroupUpgrade CR is blocked by other CRs that have not yet completed: [cgu-c]' 1 reason: UpgradeCannotStart status: "False" type: Ready copiedPolicies: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy2-common-pao-sub-policy namespace: default - name: policy3-common-ptp-sub-policy namespace: default placementBindings: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy placementRules: - cgu-a-policy1-common-cluster-version-policy - cgu-a-policy2-common-pao-sub-policy - cgu-a-policy3-common-ptp-sub-policy remediationPlan: - - spoke1 - - spoke2 status: {}
- 1
- 显示阻塞 CR 的列表。
带有阻塞 CR 的
cgu-b
示例apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-b namespace: default spec: blockingCRs: - name: cgu-a namespace: default clusters: - spoke4 - spoke5 enable: true managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy - policy4-common-sriov-sub-policy remediationStrategy: maxConcurrency: 1 timeout: 240 status: conditions: - message: 'The ClusterGroupUpgrade CR is blocked by other CRs that have not yet completed: [cgu-a]' 1 reason: UpgradeCannotStart status: "False" type: Ready copiedPolicies: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy2-common-pao-sub-policy namespace: default - name: policy3-common-ptp-sub-policy namespace: default - name: policy4-common-sriov-sub-policy namespace: default placementBindings: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy placementRules: - cgu-b-policy1-common-cluster-version-policy - cgu-b-policy2-common-pao-sub-policy - cgu-b-policy3-common-ptp-sub-policy - cgu-b-policy4-common-sriov-sub-policy remediationPlan: - - spoke4 - - spoke5 status: {}
- 1
- 显示阻塞 CR 的列表。
带有阻塞 CR 的
cgu-c
示例apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-c namespace: default spec: clusters: - spoke6 enable: true managedPolicies: - policy1-common-cluster-version-policy - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy - policy4-common-sriov-sub-policy remediationStrategy: maxConcurrency: 1 timeout: 240 status: conditions: - message: The ClusterGroupUpgrade CR has upgrade policies that are still non compliant 1 reason: UpgradeNotCompleted status: "False" type: Ready copiedPolicies: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy managedPoliciesCompliantBeforeUpgrade: - policy2-common-pao-sub-policy - policy3-common-ptp-sub-policy managedPoliciesForUpgrade: - name: policy1-common-cluster-version-policy namespace: default - name: policy4-common-sriov-sub-policy namespace: default placementBindings: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy placementRules: - cgu-c-policy1-common-cluster-version-policy - cgu-c-policy4-common-sriov-sub-policy remediationPlan: - - spoke6 status: currentBatch: 1 remediationPlanForBatch: spoke6: 0
- 1
cgu-c
更新没有任何阻塞 CR。
17.10.6. 更新受管集群上的策略
Topology Aware Lifecycle Manager(TALM)修复了在 ClusterGroupUpgrade
CR 中指定的集群的 inform
策略。TALM 通过生成受管 RHACM 策略的 enforce
副本来修复 inform
策略。每个复制的策略都有自己的对应的 RHACM 放置规则和 RHACM 放置绑定。
例如,TALM 将每个集群从当前批处理添加到与适用受管策略相对应的放置规则。如果集群已与策略兼容,TALM 会在兼容集群上跳过应用该策略。TALM 然后进入到将下一个策略应用到还没有合规的集群的步骤。TALM 在批处理中完成更新后,所有集群都会从与复制策略关联的放置规则中删除。然后,下一个批处理的更新会启动。
如果 spoke 集群没有向 RHACM 报告任何合规状态,则 hub 集群上的受管策略可能会缺少 TALM 需要的状态信息。TALM 通过以下方法处理这些情况:
-
如果缺少策略的
status.compliant
字段,TALM 忽略策略并添加日志条目。然后,TALM 继续查看策略的status.status
字段。 -
如果缺少策略的
status.status
,TALM 会生成错误。 -
如果策略的
status.status
字段中缺少集群的合规状态,TALM 会将该集群视为与该策略不兼容。
ClusterGroupUpgrade
CR 的 batchTimeoutAction
决定升级失败时是否有什么情况。您可以指定 continue
跳过失败的集群,并继续升级其他集群,或者指定 abort
以停止所有集群的策略补救。超时后,TALM 删除所有强制策略,以确保对集群不进行进一步的更新。
升级策略示例
apiVersion: policy.open-cluster-management.io/v1 kind: Policy metadata: name: ocp-4.4.12.4 namespace: platform-upgrade spec: disabled: false policy-templates: - objectDefinition: apiVersion: policy.open-cluster-management.io/v1 kind: ConfigurationPolicy metadata: name: upgrade spec: namespaceselector: exclude: - kube-* include: - '*' object-templates: - complianceType: musthave objectDefinition: apiVersion: config.openshift.io/v1 kind: ClusterVersion metadata: name: version spec: channel: stable-4.12 desiredUpdate: version: 4.4.12.4 upstream: https://api.openshift.com/api/upgrades_info/v1/graph status: history: - state: Completed version: 4.4.12.4 remediationAction: inform severity: low remediationAction: inform
有关 RHACM 策略的更多信息,请参阅策略概述。
其他资源
如需有关 PolicyGenTemplate
CRD 的更多信息,请参阅关于 PolicyGenTemplate CRD
17.10.6.1. 使用 TALM 为安装的受管集群配置 Operator 订阅
Topology Aware Lifecycle Manager (TALM) 只能在 Operator 的 Subscription
自定义资源(CR) 包含 status.state.AtLatestKnown
字段时批准 Operator 的安装计划。
流程
将
status.state.AtLatestKnown
字段添加到 Operator 的Subscription
CR 中:Subscription CR 示例
apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: cluster-logging namespace: openshift-logging annotations: ran.openshift.io/ztp-deploy-wave: "2" spec: channel: "stable" name: cluster-logging source: redhat-operators sourceNamespace: openshift-marketplace installPlanApproval: Manual status: state: AtLatestKnown 1
- 1
status.state: AtLatestKnown
字段用于 Operator 目录中可用的最新 Operator 版本。
注意当 registry 中有新版本的 Operator 时,相关的策略将变为不合规。
-
使用
ClusterGroupUpgrade
CR 将更改的Subscription
策略应用到受管集群。
17.10.6.2. 将更新策略应用到受管集群
您可以通过应用策略来更新受管集群。
先决条件
- 安装 Topology Aware Lifecycle Manager(TALM)。
- 置备一个或多个受管集群。
-
以具有
cluster-admin
特权的用户身份登录。 - 在 hub 集群中创建 RHACM 策略。
流程
将
ClusterGroupUpgrade
CR 的内容保存到cgu-1.yaml
文件中。apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-1 namespace: default spec: managedPolicies: 1 - policy1-common-cluster-version-policy - policy2-common-nto-sub-policy - policy3-common-ptp-sub-policy - policy4-common-sriov-sub-policy enable: false clusters: 2 - spoke1 - spoke2 - spoke5 - spoke6 remediationStrategy: maxConcurrency: 2 3 timeout: 240 4 batchTimeoutAction: 5
运行以下命令来创建
ClusterGroupUpgrade
CR:$ oc create -f cgu-1.yaml
运行以下命令,检查 hub 集群中是否已创建
ClusterGroupUpgrade
CR:$ oc get cgu --all-namespaces
输出示例
NAMESPACE NAME AGE STATE DETAILS default cgu-1 8m55 NotEnabled Not Enabled
运行以下命令检查更新的状态:
$ oc get cgu -n default cgu-1 -ojsonpath='{.status}' | jq
输出示例
{ "computedMaxConcurrency": 2, "conditions": [ { "lastTransitionTime": "2022-02-25T15:34:07Z", "message": "Not enabled", 1 "reason": "NotEnabled", "status": "False", "type": "Progressing" } ], "copiedPolicies": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "managedPoliciesContent": { "policy1-common-cluster-version-policy": "null", "policy2-common-nto-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"node-tuning-operator\",\"namespace\":\"openshift-cluster-node-tuning-operator\"}]", "policy3-common-ptp-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"ptp-operator-subscription\",\"namespace\":\"openshift-ptp\"}]", "policy4-common-sriov-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"sriov-network-operator-subscription\",\"namespace\":\"openshift-sriov-network-operator\"}]" }, "managedPoliciesForUpgrade": [ { "name": "policy1-common-cluster-version-policy", "namespace": "default" }, { "name": "policy2-common-nto-sub-policy", "namespace": "default" }, { "name": "policy3-common-ptp-sub-policy", "namespace": "default" }, { "name": "policy4-common-sriov-sub-policy", "namespace": "default" } ], "managedPoliciesNs": { "policy1-common-cluster-version-policy": "default", "policy2-common-nto-sub-policy": "default", "policy3-common-ptp-sub-policy": "default", "policy4-common-sriov-sub-policy": "default" }, "placementBindings": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "placementRules": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "precaching": { "spec": {} }, "remediationPlan": [ [ "spoke1", "spoke2" ], [ "spoke5", "spoke6" ] ], "status": {} }
- 1
ClusterGroupUpgrade
CR 中的spec.enable
字段设置为false
。
运行以下命令,检查策略的状态:
$ oc get policies -A
输出示例
NAMESPACE NAME REMEDIATION ACTION COMPLIANCE STATE AGE default cgu-policy1-common-cluster-version-policy enforce 17m 1 default cgu-policy2-common-nto-sub-policy enforce 17m default cgu-policy3-common-ptp-sub-policy enforce 17m default cgu-policy4-common-sriov-sub-policy enforce 17m default policy1-common-cluster-version-policy inform NonCompliant 15h default policy2-common-nto-sub-policy inform NonCompliant 15h default policy3-common-ptp-sub-policy inform NonCompliant 18m default policy4-common-sriov-sub-policy inform NonCompliant 18m
- 1
- 目前在集群中应用的策略的
spec.remediationAction
字段被设置为enforce
。在更新过程中,来自ClusterGroupUpgrade
CR 的inform
模式的受管策略会处于inform
模式。
运行以下命令,将
spec.enable
字段的值更改为true
:$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-1 \ --patch '{"spec":{"enable":true}}' --type=merge
验证
运行以下命令,再次检查更新的状态:
$ oc get cgu -n default cgu-1 -ojsonpath='{.status}' | jq
输出示例
{ "computedMaxConcurrency": 2, "conditions": [ 1 { "lastTransitionTime": "2022-02-25T15:33:07Z", "message": "All selected clusters are valid", "reason": "ClusterSelectionCompleted", "status": "True", "type": "ClustersSelected", "lastTransitionTime": "2022-02-25T15:33:07Z", "message": "Completed validation", "reason": "ValidationCompleted", "status": "True", "type": "Validated", "lastTransitionTime": "2022-02-25T15:34:07Z", "message": "Remediating non-compliant policies", "reason": "InProgress", "status": "True", "type": "Progressing" } ], "copiedPolicies": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "managedPoliciesContent": { "policy1-common-cluster-version-policy": "null", "policy2-common-nto-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"node-tuning-operator\",\"namespace\":\"openshift-cluster-node-tuning-operator\"}]", "policy3-common-ptp-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"ptp-operator-subscription\",\"namespace\":\"openshift-ptp\"}]", "policy4-common-sriov-sub-policy": "[{\"kind\":\"Subscription\",\"name\":\"sriov-network-operator-subscription\",\"namespace\":\"openshift-sriov-network-operator\"}]" }, "managedPoliciesForUpgrade": [ { "name": "policy1-common-cluster-version-policy", "namespace": "default" }, { "name": "policy2-common-nto-sub-policy", "namespace": "default" }, { "name": "policy3-common-ptp-sub-policy", "namespace": "default" }, { "name": "policy4-common-sriov-sub-policy", "namespace": "default" } ], "managedPoliciesNs": { "policy1-common-cluster-version-policy": "default", "policy2-common-nto-sub-policy": "default", "policy3-common-ptp-sub-policy": "default", "policy4-common-sriov-sub-policy": "default" }, "placementBindings": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "placementRules": [ "cgu-policy1-common-cluster-version-policy", "cgu-policy2-common-nto-sub-policy", "cgu-policy3-common-ptp-sub-policy", "cgu-policy4-common-sriov-sub-policy" ], "precaching": { "spec": {} }, "remediationPlan": [ [ "spoke1", "spoke2" ], [ "spoke5", "spoke6" ] ], "status": { "currentBatch": 1, "currentBatchStartedAt": "2022-02-25T15:54:16Z", "remediationPlanForBatch": { "spoke1": 0, "spoke2": 1 }, "startedAt": "2022-02-25T15:54:16Z" } }
- 1
- 反映当前批处理的更新进度。再次运行该命令以接收有关进度的更新信息。
如果策略包含 Operator 订阅,您可以在单节点集群中直接检查安装进度。
运行以下命令,导出用于检查安装的单节点集群的
KUBECONFIG
文件:$ export KUBECONFIG=<cluster_kubeconfig_absolute_path>
运行以下命令,检查单节点集群中存在的所有订阅,并在您要通过 ClusterGroupUpgrade CR 安装的策略中查找您要通过
ClusterGroupUpgrade
CR 安装的订阅:$ oc get subs -A | grep -i <subscription_name>
cluster-logging
策略的输出示例NAMESPACE NAME PACKAGE SOURCE CHANNEL openshift-logging cluster-logging cluster-logging redhat-operators stable
如果其中一个受管策略包含
ClusterVersion
CR,则根据 spoke 集群运行以下命令来检查当前批处理中的平台更新状态:$ oc get clusterversion
输出示例
NAME VERSION AVAILABLE PROGRESSING SINCE STATUS version 4.4.12.5 True True 43s Working towards 4.4.12.7: 71 of 735 done (9% complete)
运行以下命令检查 Operator 订阅:
$ oc get subs -n <operator-namespace> <operator-subscription> -ojsonpath="{.status}"
运行以下命令,检查与所需订阅关联的单节点集群中是否存在安装计划:
$ oc get installplan -n <subscription_namespace>
cluster-logging
Operator 的输出示例NAMESPACE NAME CSV APPROVAL APPROVED openshift-logging install-6khtw cluster-logging.5.3.3-4 Manual true 1
- 1
- 安装计划在 TALM 批准安装计划后将其
Approval
字段设置为Manual
,其Approved
字段会从false
改为true
。
注意当 TALM 修复包含订阅的策略时,它会自动批准附加到该订阅的任何安装计划。如果需要多个安装计划将 Operator 升级到最新的已知版本,TALM 可能会批准多个安装计划,通过一个或多个中间版本进行升级以进入最终版本。
运行以下命令,检查正在安装
ClusterGroupUpgrade
的策略的 Operator 的集群服务版本是否已进入Succeeded
阶段:$ oc get csv -n <operator_namespace>
OpenShift Logging Operator 的输出示例
NAME DISPLAY VERSION REPLACES PHASE cluster-logging.5.4.2 Red Hat OpenShift Logging 5.4.2 Succeeded
17.10.7. 在升级前创建集群资源备份
对于单节点 OpenShift,Topology Aware Lifecycle Manager (TALM) 可以在升级前创建部署备份。如果升级失败,您可以恢复之前的版本并将集群恢复到工作状态,而无需重新置备应用程序。
要使用备份功能,您首先创建一个 ClusterGroupUpgrade
CR,并将 backup
字段设置为 true
。为确保备份内容为最新版本,在 ClusterGroupUpgrade
CR 中的 enable
字段设置为 true
之前,不会进行备份。
TALM 使用 BackupSucceeded
条件来报告状态,如下所示:
true
备份对于所有集群都完成,或备份运行已完成但对一个或多个集群失败。如果任何集群的备份失败,则不会为该集群进行更新。
false
备份仍在为一个或多个集群处理,或者所有集群都失败。在 spoke 集群中运行的备份过程可以具有以下状态:
PreparingToStart
第一个协调通过正在进行。TALM 删除所有 spoke 备份命名空间和 hub 查看在升级尝试中创建的资源。
Starting
正在创建备份先决条件和备份作业。
Active
备份正在进行。
Succeeded
备份成功。
BackupTimeout
工件备份部分完成。
UnrecoverableError
备份以非零退出代码结尾。
如果集群备份失败,且进入 BackupTimeout
或 UnrecoverableError
状态,集群更新不会对集群进行。对其他集群的更新不会受到影响,并继续。
17.10.7.1. 使用备份创建 ClusterGroupUpgrade CR
您可以在单节点 OpenShift 集群上升级前创建部署备份。如果升级失败,您可以使用 Topology Aware Lifecycle Manager (TALM) 生成的 upgrade-recovery.sh
脚本将系统返回到其 preupgrade 状态。备份由以下项目组成:
- 集群备份
-
etcd
和静态 pod 清单的快照。 - 内容备份
-
文件夹备份,例如
/etc
、/usr/local
、/var/lib/kubelet
。 - 已更改的文件备份
-
由
machine-config
管理的任何文件都已更改。 - Deployment
-
固定
ostree
部署。 - 镜像(可选)
- 使用的任何容器镜像。
先决条件
- 安装 Topology Aware Lifecycle Manager(TALM)。
- 置备一个或多个受管集群。
-
以具有
cluster-admin
特权的用户身份登录。 - 安装 Red Hat Advanced Cluster Management (RHACM)。
强烈建议您创建一个恢复分区。以下是一个恢复分区的 SiteConfig
自定义资源 (CR) 示例,大小为 50 GB:
nodes: - hostName: "node-1.example.com" role: "master" rootDeviceHints: hctl: "0:2:0:0" deviceName: /dev/sda ........ ........ #Disk /dev/sda: 893.3 GiB, 959119884288 bytes, 1873281024 sectors diskPartition: - device: /dev/sda partitions: - mount_point: /var/recovery size: 51200 start: 800000
流程
在
clustergroupupgrades-group-du.yaml
文件中保存ClusterGroupUpgrade
CR 的内容,并backup
和enable
字段设置为true
:apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: du-upgrade-4918 namespace: ztp-group-du-sno spec: preCaching: true backup: true clusters: - cnfdb1 - cnfdb2 enable: true managedPolicies: - du-upgrade-platform-upgrade remediationStrategy: maxConcurrency: 2 timeout: 240
要启动更新,请运行以下命令来应用
ClusterGroupUpgrade
CR:$ oc apply -f clustergroupupgrades-group-du.yaml
验证
运行以下命令,检查 hub 集群中的升级状态:
$ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'
输出示例
{ "backup": { "clusters": [ "cnfdb2", "cnfdb1" ], "status": { "cnfdb1": "Succeeded", "cnfdb2": "Failed" 1 } }, "computedMaxConcurrency": 1, "conditions": [ { "lastTransitionTime": "2022-04-05T10:37:19Z", "message": "Backup failed for 1 cluster", 2 "reason": "PartiallyDone", 3 "status": "True", 4 "type": "Succeeded" } ], "precaching": { "spec": {} }, "status": {}
17.10.7.2. 在升级后恢复集群
如果集群的升级失败,您可以手动登录到集群,并使用备份使集群返回到其升级前的状态。有两个阶段:
- 回滚(Rollback)
- 如果尝试升级包括对平台操作系统部署的更改,则必须在运行恢复脚本前回滚到以前的版本。
回滚仅适用于从 TALM 和单节点 OpenShift 升级。这个过程不适用于从任何其他升级类型进行回滚。
- 恢复
- 恢复会关闭容器,并使用备份分区中的文件来重新启动容器并恢复集群。
先决条件
- 安装 Topology Aware Lifecycle Manager(TALM)。
- 置备一个或多个受管集群。
- 安装 Red Hat Advanced Cluster Management (RHACM)。
-
以具有
cluster-admin
特权的用户身份登录。 - 运行为备份而配置的升级。
流程
运行以下命令来删除之前创建的
ClusterGroupUpgrade
自定义资源 (CR):$ oc delete cgu/du-upgrade-4918 -n ztp-group-du-sno
- 登录到要恢复的集群。
运行以下命令,检查平台操作系统部署的状态:
$ ostree admin status
输出示例
[root@lab-test-spoke2-node-0 core]# ostree admin status * rhcos c038a8f08458bbed83a77ece033ad3c55597e3f64edad66ea12fda18cbdceaf9.0 Version: 49.84.202202230006-0 Pinned: yes 1 origin refspec: c038a8f08458bbed83a77ece033ad3c55597e3f64edad66ea12fda18cbdceaf9
- 1
- 当前部署已被固定。不需要平台操作系统部署回滚。
[root@lab-test-spoke2-node-0 core]# ostree admin status * rhcos f750ff26f2d5550930ccbe17af61af47daafc8018cd9944f2a3a6269af26b0fa.0 Version: 410.84.202204050541-0 origin refspec: f750ff26f2d5550930ccbe17af61af47daafc8018cd9944f2a3a6269af26b0fa rhcos ad8f159f9dc4ea7e773fd9604c9a16be0fe9b266ae800ac8470f63abc39b52ca.0 (rollback) 1 Version: 410.84.202203290245-0 Pinned: yes 2 origin refspec: ad8f159f9dc4ea7e773fd9604c9a16be0fe9b266ae800ac8470f63abc39b52ca
要触发平台操作系统部署的回滚,请运行以下命令:
$ rpm-ostree rollback -r
恢复的第一阶段会关闭容器,并将文件从备份分区恢复到目标目录。要开始恢复,请运行以下命令:
$ /var/recovery/upgrade-recovery.sh
提示时,运行以下命令重启集群:
$ systemctl reboot
重新引导后,运行以下命令重启恢复:
$ /var/recovery/upgrade-recovery.sh --resume
如果恢复工具失败,您可以使用 --restart
选项重试:
$ /var/recovery/upgrade-recovery.sh --restart
验证
运行以下命令检查恢复的状态:
$ oc get clusterversion,nodes,clusteroperator
输出示例
NAME VERSION AVAILABLE PROGRESSING SINCE STATUS clusterversion.config.openshift.io/version 4.4.12.23 True False 86d Cluster version is 4.4.12.23 1 NAME STATUS ROLES AGE VERSION node/lab-test-spoke1-node-0 Ready master,worker 86d v1.22.3+b93fd35 2 NAME VERSION AVAILABLE PROGRESSING DEGRADED SINCE MESSAGE clusteroperator.config.openshift.io/authentication 4.4.12.23 True False False 2d7h 3 clusteroperator.config.openshift.io/baremetal 4.4.12.23 True False False 86d ..............
17.10.8. 使用容器镜像预缓存功能
单节点 OpenShift 集群可能有限带宽来访问容器镜像 registry,这可能会在更新完成前造成超时。
TALM 不会设置更新的时间。您可以在通过手动应用程序或外部自动化进行更新时应用 ClusterGroupUpgrade
CR。
当 preCaching
字段在 ClusterGroupUpgrade
CR 中被设置为 true
时,容器镜像预缓存会启动。
TALM 使用 PrecacheSpecValid
条件来报告状态信息,如下所示:
true
预缓存规格有效且一致。
false
预缓存规格不完整。
TALM 使用 PrecachingSucceeded
条件来报告状态信息,如下所示:
true
TALM 已完成预缓存过程。如果任何集群的预缓存失败,则该集群的更新会失败,但会继续执行所有其他集群。如果任何集群预缓存失败,您会接收到一个通知信息。
false
预缓存仍在为一个或多个集群处理,或者所有集群都失败。
在成功预缓存后,您可以启动补救策略。当 enable
字段设置为 true
时,补救操作会启动。如果集群中存在预缓存失败,则对该集群的升级会失败。升级过程将继续用于成功预缓存的所有其他集群。
预缓存过程可以处于以下状态:
NotStarted
这是所有集群在第一次协调时会自动分配给
ClusterGroupUpgrade
CR 的初始状态。在这个状态中,TALM 会删除来自之前更新中所有 spoke 集群的预缓存命名空间和 hub 查看资源。然后,TALM 为 spoke 创建一个新的ManagedClusterView
资源,以便在PrecachePreparing
状态验证删除。PreparingToStart
清理之前不完整更新中的所有剩余的资源,资源正在进行中。
Starting
预缓存任务前提条件并创建了作业。
Active
该作业的状态为"Active"状态。
Succeeded
pre-cache(预缓存)作业成功。
PrecacheTimeout
工件预缓存是部分完成的。
UnrecoverableError
作业以非零退出代码结束。
17.10.8.1. 使用预缓存创建 ClusterGroupUpgrade CR
对于单节点 OpenShift,在更新启动前,预缓存功能允许在 spoke 集群上存在所需的容器镜像。
先决条件
- 安装 Topology Aware Lifecycle Manager(TALM)。
- 置备一个或多个受管集群。
-
以具有
cluster-admin
特权的用户身份登录。
流程
在
clustergroupupgrades-group-du.yaml
文件中将preCaching
字段设置为true
来保存ClusterGroupUpgrade
CR 的内容:apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: du-upgrade-4918 namespace: ztp-group-du-sno spec: preCaching: true 1 clusters: - cnfdb1 - cnfdb2 enable: false managedPolicies: - du-upgrade-platform-upgrade remediationStrategy: maxConcurrency: 2 timeout: 240
- 1
preCaching
字段设为true
,它允许 TALM 在开始更新前拉取容器镜像。
当您要启动预缓存时,请运行以下命令应用
ClusterGroupUpgrade
CR:$ oc apply -f clustergroupupgrades-group-du.yaml
验证
运行以下命令,检查 hub 集群中是否存在
ClusterGroupUpgrade
CR:$ oc get cgu -A
输出示例
NAMESPACE NAME AGE STATE DETAILS ztp-group-du-sno du-upgrade-4918 10s InProgress Precaching is required and not done 1
- 1
- CR 被创建。
运行以下命令,检查预缓存任务的状态:
$ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'
输出示例
{ "conditions": [ { "lastTransitionTime": "2022-01-27T19:07:24Z", "message": "Precaching is required and not done", "reason": "InProgress", "status": "False", "type": "PrecachingSucceeded" }, { "lastTransitionTime": "2022-01-27T19:07:34Z", "message": "Pre-caching spec is valid and consistent", "reason": "PrecacheSpecIsWellFormed", "status": "True", "type": "PrecacheSpecValid" } ], "precaching": { "clusters": [ "cnfdb1" 1 "cnfdb2" ], "spec": { "platformImage": "image.example.io"}, "status": { "cnfdb1": "Active" "cnfdb2": "Succeeded"} } }
- 1
- 显示已识别的集群列表。
在 spoke 集群中运行以下命令来检查预缓存作业的状态:
$ oc get jobs,pods -n openshift-talo-pre-cache
输出示例
NAME COMPLETIONS DURATION AGE job.batch/pre-cache 0/1 3m10s 3m10s NAME READY STATUS RESTARTS AGE pod/pre-cache--1-9bmlr 1/1 Running 0 3m10s
运行以下命令,检查
ClusterGroupUpgrade
CR 的状态:$ oc get cgu -n ztp-group-du-sno du-upgrade-4918 -o jsonpath='{.status}'
输出示例
"conditions": [ { "lastTransitionTime": "2022-01-27T19:30:41Z", "message": "The ClusterGroupUpgrade CR has all clusters compliant with all the managed policies", "reason": "UpgradeCompleted", "status": "True", "type": "Ready" }, { "lastTransitionTime": "2022-01-27T19:28:57Z", "message": "Precaching is completed", "reason": "PrecachingCompleted", "status": "True", "type": "PrecachingSucceeded" 1 }
- 1
- 预缓存任务已完成。
17.10.9. 对 Topology Aware Lifecycle Manager 进行故障排除
Topology Aware Lifecycle Manager(TALM)是一个 OpenShift Container Platform Operator,用于修复 RHACM 策略。出现问题时,使用 oc adm must-gather
命令来收集详情和日志,并采取调试问题的步骤。
有关相关主题的更多信息,请参阅以下文档:
17.10.9.1. 常规故障排除
您可以通过查看以下问题来确定问题的原因:
您要应用的配置是否被支持?
- RHACM 和 OpenShift Container Platform 版本是否兼容?
- TALM 和 RHACM 版本是否兼容?
以下哪个组件导致了此问题?
为确保 ClusterGroupUpgrade
配置可以正常工作,您可以执行以下操作:
-
创建
ClusterGroupUpgrade
CR,并将spec.enable
字段设置为false
。 - 等待状态更新,再完成故障排除问题。
-
如果所有内容都如预期,在
ClusterGroupUpgrade
CR 中将spec.enable
字段设置为true
。
在 ClusterUpgradeGroup
CR 中将 spec.enable
字段设置为 true
后,更新过程会启动,您无法再编辑 CR 的 spec
字段。
17.10.9.2. 无法修改 ClusterUpgradeGroup CR
- 问题
-
在启用更新后,您无法编辑
ClusterUpgradeGroup
CR。 - 解决方案
通过执行以下步骤来重启操作:
运行以下命令删除旧
ClusterGroupUpgrade
CR:$ oc delete cgu -n <ClusterGroupUpgradeCR_namespace> <ClusterGroupUpgradeCR_name>
检查并修复受管集群和策略的现有问题。
- 确保所有集群都是受管集群并可用。
-
确保所有策略都存在,并将
spec.remediationAction
字段设置为inform
。
使用正确的配置创建一个新的
ClusterGroupUpgrade
CR。$ oc apply -f <ClusterGroupUpgradeCR_YAML>
17.10.9.3. 受管策略
检查系统中的受管策略
- 问题
- 您需要检查系统中是否有正确的受管策略。
- 解决方案
运行以下命令:
$ oc get cgu lab-upgrade -ojsonpath='{.spec.managedPolicies}'
输出示例
["group-du-sno-validator-du-validator-policy", "policy2-common-nto-sub-policy", "policy3-common-ptp-sub-policy"]
检查 remediationAction 模式
- 问题
-
您要检查在受管策略的
spec
中是否将remediationAction
字段设置为inform
。 - 解决方案
运行以下命令:
$ oc get policies --all-namespaces
输出示例
NAMESPACE NAME REMEDIATION ACTION COMPLIANCE STATE AGE default policy1-common-cluster-version-policy inform NonCompliant 5d21h default policy2-common-nto-sub-policy inform Compliant 5d21h default policy3-common-ptp-sub-policy inform NonCompliant 5d21h default policy4-common-sriov-sub-policy inform NonCompliant 5d21h
检查策略合规状态
- 问题
- 您需要检查策略的合规性状态。
- 解决方案
运行以下命令:
$ oc get policies --all-namespaces
输出示例
NAMESPACE NAME REMEDIATION ACTION COMPLIANCE STATE AGE default policy1-common-cluster-version-policy inform NonCompliant 5d21h default policy2-common-nto-sub-policy inform Compliant 5d21h default policy3-common-ptp-sub-policy inform NonCompliant 5d21h default policy4-common-sriov-sub-policy inform NonCompliant 5d21h
17.10.9.4. Clusters
检查是否有受管集群
- 问题
-
您需要检查
ClusterGroupUpgrade
CR 中的集群是受管集群。 - 解决方案
运行以下命令:
$ oc get managedclusters
输出示例
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE local-cluster true https://api.hub.example.com:6443 True Unknown 13d spoke1 true https://api.spoke1.example.com:6443 True True 13d spoke3 true https://api.spoke3.example.com:6443 True True 27h
或者,检查 TALM manager 日志:
运行以下命令,获取 TALM Manager 的名称:
$ oc get pod -n openshift-operators
输出示例
NAME READY STATUS RESTARTS AGE cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp 2/2 Running 0 45m
运行以下命令检查 TALM manager 日志:
$ oc logs -n openshift-operators \ cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp -c manager
输出示例
ERROR controller-runtime.manager.controller.clustergroupupgrade Reconciler error {"reconciler group": "ran.openshift.io", "reconciler kind": "ClusterGroupUpgrade", "name": "lab-upgrade", "namespace": "default", "error": "Cluster spoke5555 is not a ManagedCluster"} 1 sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem
- 1
- 错误消息显示集群不是受管集群。
检查受管集群是否可用
- 问题
-
您需要检查
ClusterGroupUpgrade
CR 中指定的受管集群是否可用。 - 解决方案
运行以下命令:
$ oc get managedclusters
输出示例
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE local-cluster true https://api.hub.testlab.com:6443 True Unknown 13d spoke1 true https://api.spoke1.testlab.com:6443 True True 13d 1 spoke3 true https://api.spoke3.testlab.com:6443 True True 27h 2
检查 clusterLabelSelector
- 问题
-
您需要检查
ClusterGroupUpgrade
CR 中指定的clusterLabelSelector
字段是否至少与其中一个受管集群匹配。 - 解决方案
运行以下命令:
$ oc get managedcluster --selector=upgrade=true 1
- 1
- 要更新的集群标签是
upgrade:true
。
输出示例
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE spoke1 true https://api.spoke1.testlab.com:6443 True True 13d spoke3 true https://api.spoke3.testlab.com:6443 True True 27h
检查是否有 canary 集群
- 问题
您要检查集群列表中是否存在 Canary 集群。
ClusterGroupUpgrade
CR 示例spec: remediationStrategy: canaries: - spoke3 maxConcurrency: 2 timeout: 240 clusterLabelSelectors: - matchLabels: upgrade: true
- 解决方案
运行以下命令:
$ oc get cgu lab-upgrade -ojsonpath='{.spec.clusters}'
输出示例
["spoke1", "spoke3"]
运行以下命令,检查与
clusterLabelSelector
标签匹配的集群列表中是否存在 Canary 集群:$ oc get managedcluster --selector=upgrade=true
输出示例
NAME HUB ACCEPTED MANAGED CLUSTER URLS JOINED AVAILABLE AGE spoke1 true https://api.spoke1.testlab.com:6443 True True 13d spoke3 true https://api.spoke3.testlab.com:6443 True True 27h
集群可以存在于 spec.clusters
中,还可与 spec.clusterLabelSelector
标签匹配。
检查 spoke 集群上的预缓存状态
在 spoke 集群中运行以下命令来检查预缓存的状态:
$ oc get jobs,pods -n openshift-talo-pre-cache
17.10.9.5. 补救策略
检查 ClusterGroupUpgrade CR 中是否存在 remediationStrategy
- 问题
-
您需要检查
ClusterGroupUpgrade
CR 是否存在remediationStrategy
。 - 解决方案
运行以下命令:
$ oc get cgu lab-upgrade -ojsonpath='{.spec.remediationStrategy}'
输出示例
{"maxConcurrency":2, "timeout":240}
检查 ClusterGroupUpgrade CR 中是否指定了 maxConcurrency
- 问题
-
您需要检查是否在
ClusterGroupUpgrade
CR 中指定maxConcurrency
。 - 解决方案
运行以下命令:
$ oc get cgu lab-upgrade -ojsonpath='{.spec.remediationStrategy.maxConcurrency}'
输出示例
2
17.10.9.6. Topology Aware Lifecycle Manager
检查 ClusterGroupUpgrade CR 中的条件消息和状态
- 问题
-
您要检查
ClusterGroupUpgrade
CR 中的status.conditions
字段的值。 - 解决方案
运行以下命令:
$ oc get cgu lab-upgrade -ojsonpath='{.status.conditions}'
输出示例
{"lastTransitionTime":"2022-02-17T22:25:28Z", "message":"Missing managed policies:[policyList]", "reason":"NotAllManagedPoliciesExist", "status":"False", "type":"Validated"}
检查对应的复制策略
- 问题
-
您需要检查
status.managedPoliciesForUpgrade
的每个策略是否具有status.copiedPolicies
对应的策略。 - 解决方案
运行以下命令:
$ oc get cgu lab-upgrade -oyaml
输出示例
status: … copiedPolicies: - lab-upgrade-policy3-common-ptp-sub-policy managedPoliciesForUpgrade: - name: policy3-common-ptp-sub-policy namespace: default
检查 status.remediationPlan 是否已计算
- 问题
-
您需要检查
status.remediationPlan
是否被计算。 - 解决方案
运行以下命令:
$ oc get cgu lab-upgrade -ojsonpath='{.status.remediationPlan}'
输出示例
[["spoke2", "spoke3"]]
TALM manager 容器中的错误
- 问题
- 您要检查 TALM 的 manager 容器的日志。
- 解决方案
运行以下命令:
$ oc logs -n openshift-operators \ cluster-group-upgrades-controller-manager-75bcc7484d-8k8xp -c manager
输出示例
ERROR controller-runtime.manager.controller.clustergroupupgrade Reconciler error {"reconciler group": "ran.openshift.io", "reconciler kind": "ClusterGroupUpgrade", "name": "lab-upgrade", "namespace": "default", "error": "Cluster spoke5555 is not a ManagedCluster"} 1 sigs.k8s.io/controller-runtime/pkg/internal/controller.(*Controller).processNextWorkItem
- 1
- 显示错误。
在 ClusterGroupUpgrade
CR 完成后,集群可能不符合一些策略
- 问题
TALM 用来决定是否需要补救的策略合规状态,还没有为所有集群完全更新。这可能是因为:
- 在策略创建或更新后,CGU 很快就会运行。
-
策略的补救会影响
ClusterGroupUpgrade
CR 中后续策略的合规性。
- 解决方案
-
创建一个新的
ClusterGroupUpdate
CR,并使用相同的规格应用 ClusterGroupUpdate CR。
其他资源
- 有关故障排除的详情,请参阅 OpenShift Container Platform 故障排除 Operator 问题。
- 有关在 ZTP 工作流中使用 Topology Aware Lifecycle Manager 的更多信息,请参阅使用 Topology Aware Lifecycle Manager 更新受管策略。
-
如需有关
PolicyGenTemplate
CRD 的更多信息,请参阅关于 PolicyGenTemplate CRD
17.11. 使用 Topology Aware Lifecycle Manager 在断开连接的环境中更新受管集群
您可以使用 Topology Aware Lifecycle Manager (TALM) 来管理 OpenShift Container Platform 受管集群的软件生命周期。TALM 使用 Red Hat Advanced Cluster Management(RHACM)策略在目标集群中进行更改。
其他资源
- 有关 Topology Aware Lifecycle Manager 的更多信息,请参阅关于 Topology Aware Lifecycle Manager。
17.11.1. 在断开连接的环境中更新集群
您可以使用 GitOps ZTP 和 Topology Aware Lifecycle Manager (TALM) 为您部署的受管集群升级受管集群和 Operator。
17.11.1.1. 设置环境
TALM 可以同时执行平台和 Operator 更新。
您必须在镜像 registry 中镜像您要升级到的平台镜像和 Operator 镜像,然后才能使用 TALM 更新断开连接的集群。完成以下步骤以镜像镜像:
对于平台更新,您必须执行以下步骤:
镜像所需的 OpenShift Container Platform 镜像存储库。根据"镜像 OpenShift Container Platform 镜像存储库"流程在附加资源中链接,确保所需的平台镜像已被镜像。在
imageContentSources.yaml
文件中保存imageContentSources
部分的内容:输出示例
imageContentSources: - mirrors: - mirror-ocp-registry.ibmcloud.io.cpak:5000/openshift-release-dev/openshift4 source: quay.io/openshift-release-dev/ocp-release - mirrors: - mirror-ocp-registry.ibmcloud.io.cpak:5000/openshift-release-dev/openshift4 source: quay.io/openshift-release-dev/ocp-v4.0-art-dev
保存已镜像的所需平台镜像的镜像签名。对于平台更新,您必须将镜像签名添加到
PolicyGenTemplate
CR 中。要获取镜像签名,请执行以下步骤:运行以下命令指定所需的 OpenShift Container Platform 标签:
$ OCP_RELEASE_NUMBER=<release_version>
运行以下命令指定服务器的构架:
$ ARCHITECTURE=<server_architecture>
运行以下命令,从 Quay 获取发行版本镜像摘要
$ DIGEST="$(oc adm release info quay.io/openshift-release-dev/ocp-release:${OCP_RELEASE_NUMBER}-${ARCHITECTURE} | sed -n 's/Pull From: .*@//p')"
运行以下命令来设置摘要算法:
$ DIGEST_ALGO="${DIGEST%%:*}"
运行以下命令来设置摘要签名:
$ DIGEST_ENCODED="${DIGEST#*:}"
运行以下命令,从 mirror.openshift.com 网站获取镜像签名:
$ SIGNATURE_BASE64=$(curl -s "https://mirror.openshift.com/pub/openshift-v4/signatures/openshift/release/${DIGEST_ALGO}=${DIGEST_ENCODED}/signature-1" | base64 -w0 && echo)
运行以下命令,将镜像签名保存到
checksum-<OCP_RELEASE_NUMBER>.yaml
文件中:$ cat >checksum-${OCP_RELEASE_NUMBER}.yaml <<EOF ${DIGEST_ALGO}-${DIGEST_ENCODED}: ${SIGNATURE_BASE64} EOF
准备更新图表。您可以通过两个选项来准备更新图形:
使用 OpenShift Update Service。
有关如何在 hub 集群上设置图形的更多信息,请参阅为 OpenShift Update Service 部署 Operator 并构建图形数据 init 容器。
生成上游图形的本地副本。在可访问受管集群的断开连接的环境中的
http
或https
服务器上托管更新图表。要下载更新图表,请使用以下命令:$ curl -s https://api.openshift.com/api/upgrades_info/v1/graph?channel=stable-4.12 -o ~/upgrade-graph_stable-4.12
对于 Operator 更新,您必须执行以下任务:
- 镜像 Operator 目录。确保所需的 Operator 镜像按照"Mirroring Operator 目录以用于断开连接的集群"部分中的步骤进行镜像。
其他资源
- 有关如何更新 ZTP 的更多信息,请参阅升级 GitOps ZTP。
- 有关如何镜像 OpenShift Container Platform 镜像存储库的更多信息,请参 镜像 OpenShift Container Platform 镜像存储库。
- 有关如何为断开连接的集群镜像 Operator 目录的更多信息,请参阅 镜像 Operator 目录以用于断开连接的集群。
- 有关如何准备断开连接的环境并镜像所需的镜像存储库的更多信息,请参阅准备断开连接的环境。
- 有关更新频道和发行版本的更多信息,请参阅了解更新频道和发行版本。
17.11.1.2. 执行平台更新
您可以使用 TALM 执行平台更新。
先决条件
- 安装 Topology Aware Lifecycle Manager(TALM)。
- 将 ZTP 更新至最新版本。
- 使用 ZTP 置备一个或多个受管集群。
- 镜像所需的镜像存储库。
-
以具有
cluster-admin
特权的用户身份登录。 - 在 hub 集群中创建 RHACM 策略。
流程
为平台更新创建
PolicyGenTemplate
CR:将
PolicyGenTemplate
CR 的以下内容保存到du-upgrade.yaml
文件中。平台更新的
PolicyGenTemplate
示例apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "du-upgrade" namespace: "ztp-group-du-sno" spec: bindingRules: group-du-sno: "" mcp: "master" remediationAction: inform sourceFiles: - fileName: ImageSignature.yaml 1 policyName: "platform-upgrade-prep" binaryData: ${DIGEST_ALGO}-${DIGEST_ENCODED}: ${SIGNATURE_BASE64} 2 - fileName: DisconnectedICSP.yaml policyName: "platform-upgrade-prep" metadata: name: disconnected-internal-icsp-for-ocp spec: repositoryDigestMirrors: 3 - mirrors: - quay-intern.example.com/ocp4/openshift-release-dev source: quay.io/openshift-release-dev/ocp-release - mirrors: - quay-intern.example.com/ocp4/openshift-release-dev source: quay.io/openshift-release-dev/ocp-v4.0-art-dev - fileName: ClusterVersion.yaml 4 policyName: "platform-upgrade" metadata: name: version spec: channel: "stable-4.12" upstream: http://upgrade.example.com/images/upgrade-graph_stable-4.12 desiredUpdate: version: 4.12.4 status: history: - version: 4.12.4 state: "Completed"
- 1
ConfigMap
CR 包含要更新到的所需发行镜像的签名。- 2
- 显示所需 OpenShift Container Platform 发行版本的镜像签名。按照"设置环境"部分中的步骤,从您保存的
checksum-${OCP_RELEASE_NUMBER}.yaml
文件中获取签名。 - 3
- 显示包含所需 OpenShift Container Platform 镜像的镜像存储库。获取在"设置 environment"部分中的步骤时所保存的
imageContentSources.yaml
文件中的镜像。 - 4
- 显示触发更新的
ClusterVersion
CR。对于预缓存,channel
,upstream
, 和desiredVersion
项都是必需的。
PolicyGenTemplate
CR 会生成两个策略:-
du-upgrade-platform-upgrade-prep
策略为平台更新做准备。它为所需的发行版本镜像签名创建ConfigMap
CR,创建镜像的发行镜像存储库的镜像内容源,并使用所需的更新频道更新集群版本,以及在断开连接的环境中由 spoke 集群访问的更新图。 -
du-upgrade-platform-upgrade
策略用于执行平台升级。
对于
PolicyGenTemplate
CR,将du-upgrade.yaml
文件内容添加到kustomization.yaml
文件(在 ZTP Git 存储库中),并将更改推送到 Git 存储库。ArgoCD 从 Git 存储库拉取更改并在 hub 集群上生成策略。
运行以下命令检查创建的策略:
$ oc get policies -A | grep platform-upgrade
为平台更新创建
ClusterGroupUpdate
CR,将spec.enable
项设置为false
。将平台更新
ClusterGroupUpdate
CR 的内容,带有du-upgrade-platform-upgrade-prep
和du-upgrade-platform-upgrade
策略,以及目标集群保存到cgu-platform-upgrade.yml
文件,如以下示例所述:apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-platform-upgrade namespace: default spec: managedPolicies: - du-upgrade-platform-upgrade-prep - du-upgrade-platform-upgrade preCaching: false clusters: - spoke1 remediationStrategy: maxConcurrency: 1 enable: false
运行以下命令,将
ClusterGroupUpdate
CR 应用到 hub 集群:$ oc apply -f cgu-platform-upgrade.yml
可选:缓存平台更新的镜像。
运行以下命令,在
ClusterGroupUpdate
CR 中启用预缓存:$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-platform-upgrade \ --patch '{"spec":{"preCaching": true}}' --type=merge
监控更新过程,并等待预缓存完成。在 hub 集群中运行以下命令来检查预缓存的状态:
$ oc get cgu cgu-platform-upgrade -o jsonpath='{.status.precaching.status}'
启动平台更新:
运行以下命令启用
cgu-platform-upgrade
策略并禁用预缓存:$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-platform-upgrade \ --patch '{"spec":{"enable":true, "preCaching": false}}' --type=merge
监控进程。在完成后,运行以下命令来确保策略兼容:
$ oc get policies --all-namespaces
其他资源
- 有关在断开连接的环境中镜像镜像的更多信息,请参阅准备断开连接的环境。
17.11.1.3. 执行 Operator 更新
您可以使用 TALM 执行 Operator 更新。
先决条件
- 安装 Topology Aware Lifecycle Manager(TALM)。
- 将 ZTP 更新至最新版本。
- 使用 ZTP 置备一个或多个受管集群。
- 镜像捆绑包镜像、捆绑包镜像以及捆绑包镜像中引用的所有 Operator 镜像。
-
以具有
cluster-admin
特权的用户身份登录。 - 在 hub 集群中创建 RHACM 策略。
流程
为 Operator 更新更新
PolicyGenTemplate
CR。使用
du-upgrade.yaml
文件中的以下额外内容更新du-upgrade
PolicyGenTemplate
CR:apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "du-upgrade" namespace: "ztp-group-du-sno" spec: bindingRules: group-du-sno: "" mcp: "master" remediationAction: inform sourceFiles: - fileName: DefaultCatsrc.yaml remediationAction: inform policyName: "operator-catsrc-policy" metadata: name: redhat-operators spec: displayName: Red Hat Operators Catalog image: registry.example.com:5000/olm/redhat-operators:v4.12 1 updateStrategy: 2 registryPoll: interval: 1h
- 1
- 索引镜像 URL 包含所需的 Operator 镜像。如果索引镜像始终推送到相同的镜像名称和标签,则不需要此更改。
- 2
- 使用
registryPoll.interval
字段设置 Operator Lifecycle Manager(OLM)轮询新 Operator 版本的索引镜像。如果为 y-stream 和 z-stream Operator 更新而总是推送新的索引镜像标签,则不需要此更改。registryPoll.interval
字段可以设置为较短的间隔,以加快更新,但较短的间隔会增大计算负载。要影响这个问题,您可以在更新完成后将registryPoll.interval
恢复到默认值。
在这个版本中,生成一个策略
du-upgrade-operator-catsrc-policy
,以使用包含所需 Operator 镜像的新索引镜像更新redhat-operators
目录源。注意如果要使用 Operator 预缓存,并且有来自
redhat-operators
以外的其他目录源的 Operator,您必须执行以下任务:- 使用新的索引镜像或 registry 轮询间隔更新准备单独的目录源策略。
- 为来自不同目录源的所需 Operator 准备单独的订阅策略。
例如,所需的 SRIOV-FEC Operator 在
certified-operators
目录源中提供。要更新目录源和 Operator 订阅,请添加以下内容来生成两个策略:du-upgrade-fec-catsrc-policy
和du-upgrade-subscriptions-fec-policy
:apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "du-upgrade" namespace: "ztp-group-du-sno" spec: bindingRules: group-du-sno: "" mcp: "master" remediationAction: inform sourceFiles: … - fileName: DefaultCatsrc.yaml remediationAction: inform policyName: "fec-catsrc-policy" metadata: name: certified-operators spec: displayName: Intel SRIOV-FEC Operator image: registry.example.com:5000/olm/far-edge-sriov-fec:v4.10 updateStrategy: registryPoll: interval: 10m - fileName: AcceleratorsSubscription.yaml policyName: "subscriptions-fec-policy" spec: channel: "stable" source: certified-operators
如果存在,在常规
PolicyGenTemplate
CR 中删除指定的订阅频道。ZTP 镜像的默认订阅频道用于更新。注意通过 ZTP 4.12 应用的 Operator 的默认频道是
stable
,但performance-addon-operator
除外。从 OpenShift Container Platform 4.11 开始,performance-addon-operator
功能被移到node-tuning-operator
中。对于 4.10 发行版本,PAO 的默认频道是v4.10
。您还可以在常规PolicyGenTemplate
CR 中指定默认频道。将
PolicyGenTemplate
CR 更新推送到 ZTP Git 存储库。ArgoCD 从 Git 存储库拉取更改并在 hub 集群上生成策略。
运行以下命令检查创建的策略:
$ oc get policies -A | grep -E "catsrc-policy|subscription"
在启动 Operator 更新前,应用所需的目录源更新。
使用目录源策略将名为
operator-upgrade-prep
的ClusterGroupUpgrade
CR 的内容保存到cgu-operator-upgrade-prep.yml
文件中:apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-operator-upgrade-prep namespace: default spec: clusters: - spoke1 enable: true managedPolicies: - du-upgrade-operator-catsrc-policy remediationStrategy: maxConcurrency: 1
运行以下命令,将策略应用到 hub 集群:
$ oc apply -f cgu-operator-upgrade-prep.yml
监控更新过程。在完成后,运行以下命令来确保策略兼容:
$ oc get policies -A | grep -E "catsrc-policy"
为 Operator 更新创建
ClusterGroupUpgrade
CR,并将spec.enable
字段设置为false
。使用
du-upgrade-operator-catsrc-policy
策略和从常规PolicyGenTemplate
创建的订阅策略,将 Operator 更新ClusterGroupUpgrade
CR 的内容保存到cgu-operator-upgrade.yml
文件,如下例所示:apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-operator-upgrade namespace: default spec: managedPolicies: - du-upgrade-operator-catsrc-policy 1 - common-subscriptions-policy 2 preCaching: false clusters: - spoke1 remediationStrategy: maxConcurrency: 1 enable: false
注意一个
ClusterGroupUpgrade
CR 只能从ClusterGroupUpgrade
CR 中包含的一个目录源中预缓存订阅策略中定义的 Operator 镜像。如果所需的 Operator 来自不同目录源,如 SRIOV-FEC Operator 示例,则必须使用du-upgrade-fec-catsrc-policy
和du-upgrade-subscriptions-fec-policy
镜像(pre-FEC Operator 镜像)创建另一个ClusterGroupUpgrade
CR。运行以下命令,将
ClusterGroupUpgrade
CR 应用到 hub 集群:$ oc apply -f cgu-operator-upgrade.yml
可选:缓存 Operator 更新的镜像。
在启动镜像预缓存前,运行以下命令验证订阅策略在此时是否是
NonCompliant
:$ oc get policy common-subscriptions-policy -n <policy_namespace>
输出示例
NAME REMEDIATION ACTION COMPLIANCE STATE AGE common-subscriptions-policy inform NonCompliant 27d
运行以下命令,在
ClusterGroupUpgrade
CR 中启用预缓存:$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-operator-upgrade \ --patch '{"spec":{"preCaching": true}}' --type=merge
监控进程并等待预缓存完成。在受管集群中运行以下命令来检查预缓存的状态:
$ oc get cgu cgu-operator-upgrade -o jsonpath='{.status.precaching.status}'
运行以下命令,检查预缓存是否在启动更新前完成:
$ oc get cgu -n default cgu-operator-upgrade -ojsonpath='{.status.conditions}' | jq
输出示例
[ { "lastTransitionTime": "2022-03-08T20:49:08.000Z", "message": "The ClusterGroupUpgrade CR is not enabled", "reason": "UpgradeNotStarted", "status": "False", "type": "Ready" }, { "lastTransitionTime": "2022-03-08T20:55:30.000Z", "message": "Precaching is completed", "reason": "PrecachingCompleted", "status": "True", "type": "PrecachingDone" } ]
启动 Operator 更新。
运行以下命令,启用
cgu-operator-upgrade
ClusterGroupUpgrade
CR,并禁用预缓存来启动 Operator 更新:$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-operator-upgrade \ --patch '{"spec":{"enable":true, "preCaching": false}}' --type=merge
监控进程。在完成后,运行以下命令来确保策略兼容:
$ oc get policies --all-namespaces
其他资源
- 有关更新 GitOps ZTP 的更多信息,请参阅升级 GitOps ZTP。
- 由于过时的策略合规状态导致的 missed Operator 更新进行故障排除。
17.11.1.3.1. 由于过时的策略合规状态导致的 missed Operator 更新进行故障排除
在某些情况下,Topology Aware Lifecycle Manager (TALM)可能会因为过时的策略合规状态而丢失 Operator 更新。
在目录源更新后,Operator Lifecycle Manager (OLM)需要时间来更新订阅状态。当 TALM 决定是否需要补救时,订阅策略的状态可能会继续显示为合规。因此,订阅策略中指定的 Operator 不会升级。
要避免这种情况,请在 PolicyGenTemplate
中添加另一个目录源配置,并为需要更新的任何 Operator 在订阅中指定此配置。
流程
在
PolicyGenTemplate
资源中添加目录源配置:- fileName: DefaultCatsrc.yaml remediationAction: inform policyName: "operator-catsrc-policy" metadata: name: redhat-operators spec: displayName: Red Hat Operators Catalog image: registry.example.com:5000/olm/redhat-operators:v{product-version} updateStrategy: registryPoll: interval: 1h status: connectionState: lastObservedState: READY - fileName: DefaultCatsrc.yaml remediationAction: inform policyName: "operator-catsrc-policy" metadata: name: redhat-operators-v2 1 spec: displayName: Red Hat Operators Catalog v2 2 image: registry.example.com:5000/olredhat-operators:<version> 3 updateStrategy: registryPoll: interval: 1h status: connectionState: lastObservedState: READY
更新
Subscription
资源,以指向需要更新的 Operator 的新配置:apiVersion: operators.coreos.com/v1alpha1 kind: Subscription metadata: name: operator-subscription namespace: operator-namspace # ... spec: source: redhat-operators-v2 1 # ...
- 1
- 输入您在
PolicyGenTemplate
资源中定义的额外目录源配置的名称。
17.11.1.4. 一起执行平台和 Operator 更新
您可以同时执行平台和 Operator 更新。
先决条件
- 安装 Topology Aware Lifecycle Manager(TALM)。
- 将 ZTP 更新至最新版本。
- 使用 ZTP 置备一个或多个受管集群。
-
以具有
cluster-admin
特权的用户身份登录。 - 在 hub 集群中创建 RHACM 策略。
流程
-
按照 "forming a platform update" 和 "Performing an Operator update" 部分所述的步骤为更新创建
PolicyGenTemplate
CR。 为平台和 Operator 更新应用准备工作。
使用平台更新准备工作、目录源更新和目标集群的
ClusterGroupUpgrade
CR 将内容保存到cgu-platform-operator-upgrade-prep.yml
文件中,例如:apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-platform-operator-upgrade-prep namespace: default spec: managedPolicies: - du-upgrade-platform-upgrade-prep - du-upgrade-operator-catsrc-policy clusterSelector: - group-du-sno remediationStrategy: maxConcurrency: 10 enable: true
运行以下命令,将
cgu-platform-operator-upgrade-prep.yml
文件应用到 hub 集群:$ oc apply -f cgu-platform-operator-upgrade-prep.yml
监控进程。在完成后,运行以下命令来确保策略兼容:
$ oc get policies --all-namespaces
为平台创建
ClusterGroupUpdate
CR,并将spec.enable
字段设置为false
的 Operator 更新。将平台的内容和带有策略和目标集群的 Operator 更新
ClusterGroupUpdate
CR 保存为cgu-platform-operator-upgrade.yml
文件,如下例所示:apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: cgu-du-upgrade namespace: default spec: managedPolicies: - du-upgrade-platform-upgrade 1 - du-upgrade-operator-catsrc-policy 2 - common-subscriptions-policy 3 preCaching: true clusterSelector: - group-du-sno remediationStrategy: maxConcurrency: 1 enable: false
运行以下命令,将
cgu-platform-operator-upgrade.yml
文件应用到 hub 集群:$ oc apply -f cgu-platform-operator-upgrade.yml
可选:为平台和 Operator 更新缓存镜像。
运行以下命令,在
ClusterGroupUpgrade
CR 中启用预缓存:$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-du-upgrade \ --patch '{"spec":{"preCaching": true}}' --type=merge
监控更新过程,并等待预缓存完成。在受管集群中运行以下命令来检查预缓存的状态:
$ oc get jobs,pods -n openshift-talm-pre-cache
运行以下命令,检查预缓存是否在启动更新前完成:
$ oc get cgu cgu-du-upgrade -ojsonpath='{.status.conditions}'
启动平台和 Operator 更新。
运行以下命令,启用
cgu-du-upgrade
ClusterGroupUpgrade
CR 来启动平台和 Operator 更新:$ oc --namespace=default patch clustergroupupgrade.ran.openshift.io/cgu-du-upgrade \ --patch '{"spec":{"enable":true, "preCaching": false}}' --type=merge
监控进程。在完成后,运行以下命令来确保策略兼容:
$ oc get policies --all-namespaces
注意可通过将设置配置为
spec.enable: true
,从开始创建平台和 Operator 更新 CR。在这种情况下,更新会在预缓存完成后立即启动,且不需要手动启用 CR。预缓存和更新都创建额外的资源,如策略、放置规则、放置规则、受管集群操作和受管集群视图,以帮助完成这个过程。将
afterCompletion.deleteObjects
字段设置为true
在更新完成后删除所有这些资源。
17.11.1.5. 从部署的集群中删除 Performance Addon Operator 订阅
在早期版本的 OpenShift Container Platform 中,Performance Addon Operator 为应用程序提供了自动、低延迟的性能调整。在 OpenShift Container Platform 4.11 或更高版本中,这些功能是 Node Tuning Operator 的一部分。
不要在运行 OpenShift Container Platform 4.11 或更高版本的集群中安装 Performance Addon Operator。如果您升级到 OpenShift Container Platform 4.11 或更高版本,Node Tuning Operator 会自动删除 Performance Addon Operator。
您需要删除创建 Performance Addon Operator 订阅的任何策略,以防止重新安装 Operator。
参考 DU 配置集在 PolicyGenTemplate
CR common-ranGen.yaml
中包含 Performance Addon Operator。要从部署的受管集群中删除订阅,您必须更新 common-ranGen.yaml
。
如果在 OpenShift Container Platform 4.11 或更高版本上安装 Performance Addon Operator 4.10.3-5 或更高版本,Performance Addon Operator 会检测到集群版本并自动休眠,以避免与 Node Tuning Operator 正常工作。但是,为了确保获得最佳性能,请从 OpenShift Container Platform 4.11 集群中删除 Performance Addon Operator。
先决条件
- 创建一个 Git 存储库,在其中管理自定义站点配置数据。存储库必须可从 hub 集群访问,并定义为 Argo CD 的源存储库。
- 更新至 OpenShift Container Platform 4.11 或更高版本。
-
以具有
cluster-admin
特权的用户身份登录。
流程
在
common-ranGen.yaml
文件中,为 Performance Addon Operator 命名空间、Operator 组和订阅的complianceType
更改为mustnothave
。- fileName: PaoSubscriptionNS.yaml policyName: "subscriptions-policy" complianceType: mustnothave - fileName: PaoSubscriptionOperGroup.yaml policyName: "subscriptions-policy" complianceType: mustnothave - fileName: PaoSubscription.yaml policyName: "subscriptions-policy" complianceType: mustnothave
-
将更改与自定义站点存储库合并,并等待 ArgoCD 应用程序对 hub 集群同步更改。
common-subscriptions-policy
策略的状态更改为Non-Compliant
。 - 使用 Topology Aware Lifecycle Manager 将更改应用到您的目标集群。有关滚动配置更改的更多信息,请参阅“附加资源”部分。
监控进程。当目标集群的
common-subscriptions-policy
策略的状态为Compliant
时,Performance Addon Operator 已从集群中移除。运行以下命令,获取common-subscriptions-policy
的状态:$ oc get policy -n ztp-common common-subscriptions-policy
-
从
common-ranGen.yaml
文件中的.spec.sourceFiles
中删除 Performance Addon Operator 命名空间、Operator 组和订阅 CR。 - 将更改与自定义站点存储库合并,并等待 ArgoCD 应用程序对 hub 集群同步更改。策略保持合规。
其他资源
- 有关 TALM 预缓存工作流的更多信息,请参阅使用容器镜像预缓存功能。
17.11.2. 关于为 ZTP 自动创建的 ClusterGroupUpgrade CR
TALM 有一个名为 ManagedClusterForCGU
的控制器,它监控 hub 集群上的 ManagedCluster
CR 的 Ready
状态,并为 ZTP 创建 ClusterGroupUpgrade
CR(零接触置备)。
对于没有应用 "ztp-done" 标签的 Ready
状态中的任何受管集群,ManagedClusterForCGU
控制器会在 ztp-install
命名空间中创建一个带有在 ZTP 进程中创建的关联 RHACM 策略的 ClusterGroupUpgrade
CR。然后,TALM 会修复自动创建 ClusterGroupUpgrade
CR 中列出的一组配置策略,将配置 CR 推送到受管集群。
如果集群在集群变为 Ready
时没有绑定策略,则不会创建 ClusterGroupUpgrade
CR。
ZTP 自动创建的 ClusterGroupUpgrade
CR 示例
apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: generation: 1 name: spoke1 namespace: ztp-install ownerReferences: - apiVersion: cluster.open-cluster-management.io/v1 blockOwnerDeletion: true controller: true kind: ManagedCluster name: spoke1 uid: 98fdb9b2-51ee-4ee7-8f57-a84f7f35b9d5 resourceVersion: "46666836" uid: b8be9cd2-764f-4a62-87d6-6b767852c7da spec: actions: afterCompletion: addClusterLabels: ztp-done: "" 1 deleteClusterLabels: ztp-running: "" deleteObjects: true beforeEnable: addClusterLabels: ztp-running: "" 2 clusters: - spoke1 enable: true managedPolicies: - common-spoke1-config-policy - common-spoke1-subscriptions-policy - group-spoke1-config-policy - spoke1-config-policy - group-spoke1-validator-du-policy preCaching: false remediationStrategy: maxConcurrency: 1 timeout: 240
17.12. 更新 GitOps ZTP
您可以独立于 hub 集群、Red Hat Advanced Cluster Management (RHACM) 和受管 OpenShift Container Platform 集群更新 Gitops 零接触置备 (ZTP) 基础架构。
当新版本可用时,您可以更新 Red Hat OpenShift GitOps Operator。更新 GitOps ZTP 插件时,请查看参考配置中的更新文件,并确保更改满足您的要求。
17.12.1. GitOps ZTP 更新过程概述
您可以为运行较早版本的 GitOps ZTP 集群更新 GitOps 零接触置备 (ZTP)。更新过程可避免对受管集群的影响。
对策略设置的任何更改(包括添加推荐内容)都会生成要应用到受管集群并协调的更新策略。
在高级别上,更新 GitOps ZTP 基础架构的策略如下:
-
使用
ztp-done
标签标记所有现有集群。 - 停止 ArgoCD 应用程序。
- 安装新的 GitOps ZTP 工具。
- 更新 Git 存储库中的所需内容和可选更改。
- 更新并重启应用程序配置。
17.12.2. 准备升级
使用以下步骤为 GitOps 零接触置备(ZTP)升级准备您的站点。
流程
- 获取具有用于配置 Red Hat OpenShift GitOps 的自定义资源 (CR) 的 GitOps ZTP 容器的最新版本,以用于 GitOps ZTP。
使用以下命令提取
argocd/deployment
目录:$ mkdir -p ./update
$ podman run --log-driver=none --rm registry.redhat.io/openshift4/ztp-site-generate-rhel8:v4.12 extract /home/ztp --tar | tar x -C ./update
/update
目录包含以下子目录:-
update/extra-manifest
: 包含SiteConfig
CR 用来生成额外清单configMap
的源 CR 文件。 -
update/source-crs
:包含PolicyGenTemplate
CR 用于生成 Red Hat Advanced Cluster Management(RHACM)策略的源 CR 文件。 -
update/argocd/deployment
: 包含要在 hub 集群上应用的补丁和 YAML 文件,以便在此过程的下一步中使用。 -
update/argocd/example
包含代表推荐的配置的siteConfig
和PolicyGenTemplate
文件的示例。
-
更新
cluster-app.yaml
和policies-app.yaml
文件,以反映应用程序的名称以及 Git 仓库的 URL、分支和路径。如果升级包含导致过时的策略的更改,则应该在执行升级前删除过时的策略。
在
/update
文件夹和 Git 仓库(您管理团队站点 CR)中的配置和部署源 CR 之间的更改进行 diff 操作。应用所需的更改并将其推送到您的站点存储库。重要当您将 GitOps ZTP 更新至最新版本时,您必须将
update/argocd/deployment
目录中的更改应用到您的站点存储库。不要使用旧版本的argocd/deployment/
文件。
17.12.3. 标记现有集群
为确保现有集群由工具更新保持不变,请使用 ztp-done
标签标记所有现有的受管集群。
此流程仅在更新没有使用 Topology Aware Lifecycle Manager (TALM) 置备的集群时应用。使用 TALM 置备的集群会使用 ztp-done
自动标记。
流程
找到列出使用零接触置备(ZTP)部署的受管集群的标签选择器,如
local-cluster!=true
:$ oc get managedcluster -l 'local-cluster!=true'
确保生成的列表中包含使用 ZTP 部署的所有受管集群,然后使用该选择器添加
ztp-done
标签:$ oc label managedcluster -l 'local-cluster!=true' ztp-done=
17.12.4. 停止现有的 GitOps ZTP 应用程序
删除现有的应用程序可确保在有新版本工具可用前,不会推出对 Git 存储库中现有内容的任何更改。
使用 deployment
目录中的应用文件。如果您为应用程序使用自定义名称,则首先更新这些文件中的名称。
流程
在
clusters
应用程序上执行非级联删除以保留所有生成的资源:$ oc delete -f update/argocd/deployment/clusters-app.yaml
在
policies
应用程序上执行级联删除以删除所有之前的策略:$ oc patch -f policies-app.yaml -p '{"metadata": {"finalizers": ["resources-finalizer.argocd.argoproj.io"]}}' --type merge
$ oc delete -f update/argocd/deployment/policies-app.yaml
17.12.5. 对 Git 存储库进行所需的更改
当将 ztp-site-generate
容器从较早版本的 GitOps ZTP 升级到 v4.10 或更高版本时,Git 仓库的内容需要额外的要求。存储库中的现有内容必须更新,以反映这些更改。
对
PolicyGenTemplate
文件进行必要的更改:所有
PolicyGenTemplate
文件都必须在带有ztp
前缀的命名空间
中创建。这样可确保 GitOps 零接触置备(ZTP)应用程序可以管理由 GitOps ZTP 生成的策略 CR,而不与 Red Hat Advanced Cluster Management(RHACM)在内部管理策略冲突。将
kustomization.yaml
文件添加到存储库中:所有
siteConfig
和PolicyGenTemplate
CR 必须包含在其各自目录树下的kustomization.yaml
文件中。例如:├── policygentemplates │ ├── site1-ns.yaml │ ├── site1.yaml │ ├── site2-ns.yaml │ ├── site2.yaml │ ├── common-ns.yaml │ ├── common-ranGen.yaml │ ├── group-du-sno-ranGen-ns.yaml │ ├── group-du-sno-ranGen.yaml │ └── kustomization.yaml └── siteconfig ├── site1.yaml ├── site2.yaml └── kustomization.yaml
注意generator
部分中列出的文件只能包含 siteConfig
或PolicyGenTemplate
CR。如果现有 YAML 文件包含其他 CR,如Namespace
,则这些其他 CR 必须拉取到单独的文件中,并在resources
部分列出。PolicyGenTemplate
kustomization 文件必须包括generator
部分中的所有PolicyGenTemplate
YAML 文件,以及resources
部分中的Namespace
CR。例如:apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization generators: - common-ranGen.yaml - group-du-sno-ranGen.yaml - site1.yaml - site2.yaml resources: - common-ns.yaml - group-du-sno-ranGen-ns.yaml - site1-ns.yaml - site2-ns.yaml
SiteConfig
kustomization 文件必须包括generator
部分中的所有SiteConfig
YAML 文件,以及资源中的任何其他 CR:apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization generators: - site1.yaml - site2.yaml
删除
pre-sync.yaml
和post-sync.yaml
文件。在 OpenShift Container Platform 4.10 及更新的版本中,不再需要
pre-sync.yaml
和post-sync.yaml
文件。update/deployment/kustomization.yaml
CR 管理 hub 集群上的策略部署。注意在
SiteConfig
和PolicyGenTemplate
树下都有一组pre-sync.yaml
和post-sync.yaml
文件。检查并纳入推荐的更改
每个发行版本可能会包括对应用到已部署集群的配置进行额外的推荐更改。通常,这些更改由 OpenShift 平台、额外功能或改进对平台的调整带来较低的 CPU 使用。
查看适用于您网络中的集群类型的参考
SiteConfig
和PolicyGenTemplate
CR。这些示例可在从 GitOps ZTP 容器中提取的argocd/example
目录中找到。
17.12.6. 安装新的 GitOps ZTP 应用程序
使用提取的 argocd/deployment
目录,并在确保应用程序指向 Git 存储库后应用部署目录的所有内容。应用目录的内容可确保正确配置应用程序的所有必要资源。
流程
要使用之前提取到
update/argocd/deployment/
目录中的补丁文件来修补 hub 集群中的 ArgoCD 实例,请输入以下命令:$ oc patch argocd openshift-gitops \ -n openshift-gitops --type=merge \ --patch-file update/argocd/deployment/argocd-openshift-gitops-patch.json
要应用
argocd/deployment
目录的内容,请输入以下命令:$ oc apply -k update/argocd/deployment
17.12.7. 推出 GitOps ZTP 配置更改
如果因为实现推荐的更改而在升级过程中包括任何配置更改,升级过程会在 hub 集群上生成 Non-Compliant
状态的一组策略 CR。使用 ZTP GitOps v4.10 及之后的版本 ztp-site-generate
容器,这些策略被设置为 inform
模式,且不会为用户在没有额外步骤的情况下推送到受管集群。这样可保证在进行更改时可以管理对集群的破坏性更改,例如在维护窗口期间以及同时更新多少个集群。
要推出更改,请创建一个或多个 ClusterGroupUpgrade
CR,如 TALM 文档所述。CR 必须包含您要推送到受管集群的 Non-Compliant
策略列表,以及应包含在更新中的集群的列表或选择器。
其他资源
- 有关 Topology Aware Lifecycle Manager(TALM),请参阅关于 Topology Aware Lifecycle Manager 配置。
-
有关创建
ClusterGroupUpgrade
CR 的信息,请参阅关于为 ZTP 自动创建的 ClusterGroupUpgrade CR。
17.13. 使用 GitOps ZTP 扩展单节点 OpenShift 集群
您可以使用 GitOps ZTP 扩展单节点 OpenShift 集群。将 worker 节点添加到单节点 OpenShift 集群时,原始单节点 OpenShift 集群会保留 control plane 节点角色。添加 worker 节点不需要现有单节点 OpenShift 集群的任何停机时间。
虽然您可以添加到单节点 OpenShift 集群的 worker 节点数量没有指定的限制,但您必须为额外的 worker 节点重新评估 control plane 节点上的保留 CPU 分配。
如果需要 worker 节点上的工作负载分区,则必须在安装节点前在 hub 集群中部署并修复受管集群策略。这样,工作负载分区 MachineConfig
对象会被呈现,并在 GitOps ZTP 工作流将 MachineConfig
ignition 文件应用到 worker
节点前与 worker 机器配置池相关联。
建议您首先修复策略,然后安装 worker 节点。如果在安装 worker 节点后创建工作负载分区清单,您必须手动排空该节点并删除由守护进程集管理的所有 pod。当管理守护进程集创建新 pod 时,新 pod 会处理工作负载分区过程。
使用 GitOps ZTP 将 worker 节点添加到单节点 OpenShift 集群只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
其他资源
- 有关为 vDU 应用程序部署调整的单节点 OpenShift 集群的更多信息,请参阅在单节点 OpenShift 中部署 vDU 的参考配置。
- 如需有关 worker 节点的更多信息,请参阅将 worker 节点添加到单节点 OpenShift 集群。
17.13.1. 将配置集应用到 worker 节点
您可以使用 DU 配置集配置额外的 worker 节点。
您可以使用 ZTP GitOps 通用、组和特定站点的 PolicyGenTemplate
资源,将 RAN 分布式单元 (DU) 配置集应用到 worker 节点集群。链接到 ArgoCD policies
应用程序的 GitOps ZTP 管道包括以下 CR,您可以在提取 ztp-site-generate
容器时在 out/argocd/example/policygentemplates
文件夹中找到:
-
common-ranGen.yaml
-
group-du-sno-ranGen.yaml
-
example-sno-site.yaml
-
ns.yaml
-
kustomization.yaml
在 worker 节点上配置 DU 配置集被视为升级。要启动升级流,您必须更新现有策略或创建额外的策略。然后,您必须创建一个 ClusterGroupUpgrade
CR 来协调集群组中的策略。
17.13.2. (可选)确保 PTP 和 SR-IOV 守护进程选择器兼容性
如果 DU 配置集使用 GitOps ZTP 插件版本 4.11 或更早版本部署,则 PTP 和 SR-IOV Operator 可能会被配置为仅在标记为 master
的节点上放置守护进程。此配置可防止 PTP 和 SR-IOV 守护进程在 worker 节点上运行。如果系统上正确配置了 PTP 和 SR-IOV 守护进程节点选择器,您必须更改守护进程,然后才能继续 worker DU 配置集配置。
流程
在其中一个 spoke 集群中检查 PTP Operator 的守护进程节点选择器设置:
$ oc get ptpoperatorconfig/default -n openshift-ptp -ojsonpath='{.spec}' | jq
PTP Operator 的输出示例
{"daemonNodeSelector":{"node-role.kubernetes.io/master":""}} 1
- 1
- 如果节点选择器设置为
master
,则 spoke 使用需要更改的 ZTP 插件的版本进行部署。
在其中一个 spoke 集群中检查 SR-IOV Operator 的守护进程节点选择器设置:
$ oc get sriovoperatorconfig/default -n \ openshift-sriov-network-operator -ojsonpath='{.spec}' | jq
SR-IOV Operator 的输出示例
{"configDaemonNodeSelector":{"node-role.kubernetes.io/worker":""},"disableDrain":false,"enableInjector":true,"enableOperatorWebhook":true} 1
- 1
- 如果节点选择器设置为
master
,则 spoke 使用需要更改的 ZTP 插件的版本进行部署。
在组策略中,添加以下
complianceType
和spec
条目:spec: - fileName: PtpOperatorConfig.yaml policyName: "config-policy" complianceType: mustonlyhave spec: daemonNodeSelector: node-role.kubernetes.io/worker: "" - fileName: SriovOperatorConfig.yaml policyName: "config-policy" complianceType: mustonlyhave spec: configDaemonNodeSelector: node-role.kubernetes.io/worker: ""
重要更改
daemonNodeSelector
字段会导致临时 PTP 同步丢失和 SR-IOV 连接丢失。- 提交 Git 中的更改,然后推送到由 GitOps ZTP ArgoCD 应用程序监控的 Git 存储库。
17.13.3. PTP 和 SR-IOV 节点选择器兼容性
PTP 配置资源和 SR-IOV 网络节点策略使用 node-role.kubernetes.io/master: ""
作为节点选择器。如果额外的 worker 节点与 control plane 节点具有相同的 NIC 配置,则用于配置 control plane 节点的策略可以被 worker 节点重复使用。但是,节点选择器必须更改为选择两种节点类型,例如使用 "node-role.kubernetes.io/worker"
标签。
17.13.4. 使用 PolicyGenTemplate CR 将 worker 节点策略应用到 worker 节点
您可以为 worker 节点创建策略。
流程
创建以下策略模板:
apiVersion: ran.openshift.io/v1 kind: PolicyGenTemplate metadata: name: "example-sno-workers" namespace: "example-sno" spec: bindingRules: sites: "example-sno" 1 mcp: "worker" 2 sourceFiles: - fileName: MachineConfigGeneric.yaml 3 policyName: "config-policy" metadata: labels: machineconfiguration.openshift.io/role: worker name: enable-workload-partitioning spec: config: storage: files: - contents: source: data:text/plain;charset=utf-8;base64,W2NyaW8ucnVudGltZS53b3JrbG9hZHMubWFuYWdlbWVudF0KYWN0aXZhdGlvbl9hbm5vdGF0aW9uID0gInRhcmdldC53b3JrbG9hZC5vcGVuc2hpZnQuaW8vbWFuYWdlbWVudCIKYW5ub3RhdGlvbl9wcmVmaXggPSAicmVzb3VyY2VzLndvcmtsb2FkLm9wZW5zaGlmdC5pbyIKcmVzb3VyY2VzID0geyAiY3B1c2hhcmVzIiA9IDAsICJjcHVzZXQiID0gIjAtMyIgfQo= mode: 420 overwrite: true path: /etc/crio/crio.conf.d/01-workload-partitioning user: name: root - contents: source: data:text/plain;charset=utf-8;base64,ewogICJtYW5hZ2VtZW50IjogewogICAgImNwdXNldCI6ICIwLTMiCiAgfQp9Cg== mode: 420 overwrite: true path: /etc/kubernetes/openshift-workload-pinning user: name: root - fileName: PerformanceProfile.yaml policyName: "config-policy" metadata: name: openshift-worker-node-performance-profile spec: cpu: 4 isolated: "4-47" reserved: "0-3" hugepages: defaultHugepagesSize: 1G pages: - size: 1G count: 32 realTimeKernel: enabled: true - fileName: TunedPerformancePatch.yaml policyName: "config-policy" metadata: name: performance-patch-worker spec: profile: - name: performance-patch-worker data: | [main] summary=Configuration changes profile inherited from performance created tuned include=openshift-node-performance-openshift-worker-node-performance-profile [bootloader] cmdline_crash=nohz_full=4-47 5 [sysctl] kernel.timer_migration=1 [scheduler] group.ice-ptp=0:f:10:*:ice-ptp.* [service] service.stalld=start,enable service.chronyd=stop,disable recommend: - profile: performance-patch-worker
通用
MachineConfig
CR 用于在 worker 节点上配置工作负载分区。您可以生成crio
和kubelet
配置文件的内容。-
将创建的策略模板添加到由 ArgoCD
policies
应用程序监控的 Git 存储库中。 -
在
kustomization.yaml
文件中添加策略。 - 提交 Git 中的更改,然后推送到由 GitOps ZTP ArgoCD 应用程序监控的 Git 存储库。
要将新策略修复到 spoke 集群,请创建一个 TALM 自定义资源:
$ cat <<EOF | oc apply -f - apiVersion: ran.openshift.io/v1alpha1 kind: ClusterGroupUpgrade metadata: name: example-sno-worker-policies namespace: default spec: backup: false clusters: - example-sno enable: true managedPolicies: - group-du-sno-config-policy - example-sno-workers-config-policy - example-sno-config-policy preCaching: false remediationStrategy: maxConcurrency: 1 EOF
17.13.5. 使用 GitOps ZTP 将 worker 节点添加到单节点 OpenShift 集群
您可以将一个或多个 worker 节点添加到现有的单节点 OpenShift 集群,以增加集群中的可用 CPU 资源。
先决条件
- 在 OpenShift Container Platform 4.11 或更高版本的裸机 hub 集群中安装和配置 RHACM 2.6 或更高版本
- 在 hub 集群中安装 Topology Aware Lifecycle Manager
- 在 hub 集群中安装 Red Hat OpenShift GitOps
-
使用 GitOps ZTP
ztp-site-generate
容器镜像版本 4.12 或更高版本 - 使用 GitOps ZTP 部署受管单节点 OpenShift 集群
- 配置中央基础架构管理,如 RHACM 文档所述
-
配置 DNS 服务集群来解析内部 API 端点
api-int.<cluster_name>.<base_domain>
流程
如果您使用
example-sno.yaml
SiteConfig
清单部署集群,请将新的 worker 节点添加到spec.clusters['example-sno'].nodes
列表中:nodes: - hostName: "example-node2.example.com" role: "worker" bmcAddress: "idrac-virtualmedia+https://[1111:2222:3333:4444::bbbb:1]/redfish/v1/Systems/System.Embedded.1" bmcCredentialsName: name: "example-node2-bmh-secret" bootMACAddress: "AA:BB:CC:DD:EE:11" bootMode: "UEFI" nodeNetwork: interfaces: - name: eno1 macAddress: "AA:BB:CC:DD:EE:11" config: interfaces: - name: eno1 type: ethernet state: up macAddress: "AA:BB:CC:DD:EE:11" ipv4: enabled: false ipv6: enabled: true address: - ip: 1111:2222:3333:4444::1 prefix-length: 64 dns-resolver: config: search: - example.com server: - 1111:2222:3333:4444::2 routes: config: - destination: ::/0 next-hop-interface: eno1 next-hop-address: 1111:2222:3333:4444::1 table-id: 254
为新主机创建一个 BMC 身份验证 secret,如
SiteConfig
文件的spec.nodes
部分中的bmcCredentialsName
字段引用:apiVersion: v1 data: password: "password" username: "username" kind: Secret metadata: name: "example-node2-bmh-secret" namespace: example-sno type: Opaque
提交 Git 中的更改,然后推送到由 GitOps ZTP ArgoCD 应用程序监控的 Git 存储库。
当 ArgoCD
cluster
应用程序同步时,由 ZTP 插件生成的 hub 集群中会出现两个新清单:-
BareMetalHost
NMStateConfig
重要不应为 worker 节点配置
cpuset
字段。worker 节点的工作负载分区会在节点安装完成后通过管理策略添加。
-
验证
您可以通过几种方法监控安装过程。
运行以下命令,检查预置备镜像是否已创建:
$ oc get ppimg -n example-sno
输出示例
NAMESPACE NAME READY REASON example-sno example-sno True ImageCreated example-sno example-node2 True ImageCreated
检查裸机主机的状态:
$ oc get bmh -n example-sno
输出示例
NAME STATE CONSUMER ONLINE ERROR AGE example-sno provisioned true 69m example-node2 provisioning true 4m50s 1
- 1
provisioning
状态表示从安装介质引导的节点正在进行中。
持续监控安装过程:
运行以下命令监控代理安装过程:
$ oc get agent -n example-sno --watch
输出示例
NAME CLUSTER APPROVED ROLE STAGE 671bc05d-5358-8940-ec12-d9ad22804faa example-sno true master Done [...] 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Starting installation 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Installing 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Writing image to disk [...] 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Waiting for control plane [...] 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Rebooting 14fd821b-a35d-9cba-7978-00ddf535ff37 example-sno true worker Done
当 worker 节点安装完成后,worker 节点证书会被自动批准。此时,worker 会出现在
ManagedClusterInfo
状态中。运行以下命令查看状态:$ oc get managedclusterinfo/example-sno -n example-sno -o \ jsonpath='{range .status.nodeList[*]}{.name}{"\t"}{.conditions}{"\t"}{.labels}{"\n"}{end}'
输出示例
example-sno [{"status":"True","type":"Ready"}] {"node-role.kubernetes.io/master":"","node-role.kubernetes.io/worker":""} example-node2 [{"status":"True","type":"Ready"}] {"node-role.kubernetes.io/worker":""}
17.14. 用于单节点 OpenShift 部署的预缓存镜像
在有限带宽的环境中,您可以使用 GitOps 零接触置备 (ZTP) 解决方案来部署大量集群,您需要避免下载引导和安装 OpenShift Container Platform 所需的所有镜像。远程单节点 OpenShift 站点上的有限带宽可能会导致长时间部署时间。factory-precaching-cli 工具允许您在将服务器发送到 ZTP 置备的远程站点前预暂存服务器。
factory-precaching-cli 工具执行以下操作:
- 下载最小 ISO 所需的 RHCOS rootfs 镜像。
-
从标记为
data
的安装磁盘中创建分区。 - 将磁盘格式化为 xfs。
- 在磁盘末尾创建 GUID 分区表 (GPT) 数据分区,其中分区的大小可以被工具进行配置。
- 复制安装 OpenShift Container Platform 所需的容器镜像。
- 复制 ZTP 安装 OpenShift Container Platform 所需的容器镜像。
- 可选:将 Day-2 Operator 复制到分区。
factory-precaching-cli 工具只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
17.14.1. 获取 factory-precaching-cli 工具
factory-precaching-cli 工具 Go 二进制文件在 Telco RAN 工具容器镜像 中公开提供。容器镜像中的 factory-precaching-cli 工具 Go 二进制文件在使用 podman
运行 RHCOS live 镜像的服务器上执行。如果您在断开连接的环境中工作或具有私有 registry,则需要将镜像复制到服务器。
流程
运行以下命令拉取 factory-precaching-cli 工具镜像:
# podman pull quay.io/openshift-kni/telco-ran-tools:latest
验证
要检查该工具是否可用,请查询 factory-precaching-cli 工具 Go 二进制文件的当前版本:
# podman run quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli -v
输出示例
factory-precaching-cli version 20221018.120852+main.feecf17
17.14.2. 从实时操作系统镜像引导
您可以使用带有 的 factory-precaching-cli 工具来引导只有一个磁盘可用的服务器,外部磁盘驱动器无法附加到服务器。
当磁盘即将使用 RHCOS 镜像写入时,RHCOS 要求不使用磁盘。
根据服务器硬件,您可以使用以下方法之一将 RHCOS live ISO 挂载到空白服务器上:
- 在 Dell 服务器上使用 Dell RACADM 工具。
- 在 HP 服务器上使用 HPONCFG 工具。
- 使用 Redfish BMC API。
建议自动执行挂载过程。要自动化这个过程,您需要拉取所需的镜像并在本地 HTTP 服务器上托管它们。
先决条件
- 您打开了主机电源。
- 有到主机的网络连接。
本例流程使用 Redfish BMC API 来挂载 RHCOS live ISO。
挂载 RHCOS live ISO:
检查虚拟介质状态:
$ curl --globoff -H "Content-Type: application/json" -H \ "Accept: application/json" -k -X GET --user ${username_password} \ https://$BMC_ADDRESS/redfish/v1/Managers/Self/VirtualMedia/1 | python -m json.tool
将 ISO 文件挂载为虚拟介质:
$ curl --globoff -L -w "%{http_code} %{url_effective}\\n" -ku ${username_password} -H "Content-Type: application/json" -H "Accept: application/json" -d '{"Image": "http://[$HTTPd_IP]/RHCOS-live.iso"}' -X POST https://$BMC_ADDRESS/redfish/v1/Managers/Self/VirtualMedia/1/Actions/VirtualMedia.InsertMedia
将引导顺序设置为从虚拟介质引导一次:
$ curl --globoff -L -w "%{http_code} %{url_effective}\\n" -ku ${username_password} -H "Content-Type: application/json" -H "Accept: application/json" -d '{"Boot":{ "BootSourceOverrideEnabled": "Once", "BootSourceOverrideTarget": "Cd", "BootSourceOverrideMode": "UEFI"}}' -X PATCH https://$BMC_ADDRESS/redfish/v1/Systems/Self
- 重新引导并确保服务器从虚拟介质启动。
其他资源
-
有关
butane
工具的更多信息,请参阅关于 Butane。 - 有关创建自定义 live RHCOS ISO 的更多信息,请参阅为远程服务器访问创建自定义 live RHCOS ISO。
- 有关使用 Dell RACADM 工具的更多信息,请参阅集成 Dell Remote Access Controller 9 RACADM CLI 指南。
- 有关使用 HPONCFG 工具的更多信息,请参阅使用 HPONCFG。
- 有关使用 Redfish BMC API 的更多信息,请参阅使用 Redfish API 从 HTTP 托管 ISO 镜像引导。
17.14.3. 对磁盘进行分区
要运行完整的预缓存过程,您必须从 live ISO 启动,并使用 factory-precaching-cli 工具从容器镜像引导到分区并预缓存所有需要的工件。
需要 live ISO 或 RHCOS live ISO,因为当操作系统(RHCOS) 在置备过程中写入该设备时,磁盘不得被使用。单磁盘服务器也可使用此流程启用。
先决条件
- 您有一个没有分区的磁盘。
-
您可以访问
quay.io/openshift-kni/telco-ran-tools:latest
镜像。 - 有足够的存储来安装 OpenShift Container Platform 并预缓存所需的镜像。
流程
验证磁盘是否已清除:
# lsblk
输出示例
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 93.8G 0 loop /run/ephemeral loop1 7:1 0 897.3M 1 loop /sysroot sr0 11:0 1 999M 0 rom /run/media/iso nvme0n1 259:1 0 1.5T 0 disk
从设备中删除任何文件系统、RAID 或分区表签名:
# wipefs -a /dev/nvme0n1
输出示例
/dev/nvme0n1: 8 bytes were erased at offset 0x00000200 (gpt): 45 46 49 20 50 41 52 54 /dev/nvme0n1: 8 bytes were erased at offset 0x1749a955e00 (gpt): 45 46 49 20 50 41 52 54 /dev/nvme0n1: 2 bytes were erased at offset 0x000001fe (PMBR): 55 aa
如果磁盘不是空的,该工具会失败,因为它使用设备的分区号 1 来预缓存工件。
17.14.3.1. 创建分区
设备就绪后,您可以创建一个单个分区和 GPT 分区表。分区自动标记为 data
,并在设备末尾创建。否则,分区将被 coreos-installer
覆盖。
coreos-installer
要求在设备末尾创建分区,并将其标记为 data
。在将 RHCOS 镜像写入磁盘时,这两个要求都需要保存分区。
先决条件
-
由于格式化主机设备,容器必须以
特权
运行。 -
您必须挂载
/dev
文件夹,以便可以在容器内执行该进程。
流程
在以下示例中,分区的大小为 250 GiB,因为允许为第 2 天 Operator 预缓存 DU 配置集。
以
特权
运行容器,并对磁盘进行分区:# podman run -v /dev:/dev --privileged \ --rm quay.io/openshift-kni/telco-ran-tools:latest -- \ factory-precaching-cli partition \ 1 -d /dev/nvme0n1 \ 2 -s 250 3
检查存储信息:
# lsblk
输出示例
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 93.8G 0 loop /run/ephemeral loop1 7:1 0 897.3M 1 loop /sysroot sr0 11:0 1 999M 0 rom /run/media/iso nvme0n1 259:1 0 1.5T 0 disk └─nvme0n1p1 259:3 0 250G 0 part
验证
您必须验证是否满足要求:
- 该设备有 GPT 分区表
- 该分区使用设备的最新扇区。
-
分区被正确标记为
data
。
查询磁盘状态以验证磁盘是否按预期分区:
# gdisk -l /dev/nvme0n1
输出示例
GPT fdisk (gdisk) version 1.0.3 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. Disk /dev/nvme0n1: 3125627568 sectors, 1.5 TiB Model: Dell Express Flash PM1725b 1.6TB SFF Sector size (logical/physical): 512/512 bytes Disk identifier (GUID): CB5A9D44-9B3C-4174-A5C1-C64957910B61 Partition table holds up to 128 entries Main partition table begins at sector 2 and ends at sector 33 First usable sector is 34, last usable sector is 3125627534 Partitions will be aligned on 2048-sector boundaries Total free space is 2601338846 sectors (1.2 TiB) Number Start (sector) End (sector) Size Code Name 1 2601338880 3125627534 250.0 GiB 8300 data
17.14.3.2. 挂载分区
验证磁盘是否已正确分区后,您可以将设备挂载到 /mnt
中。
建议将设备挂载到 /mnt
,因为在 ZTP 准备过程中使用了该挂载点。
验证分区是否格式化为
xfs
:# lsblk -f /dev/nvme0n1
输出示例
NAME FSTYPE LABEL UUID MOUNTPOINT nvme0n1 └─nvme0n1p1 xfs 1bee8ea4-d6cf-4339-b690-a76594794071
挂载分区:
# mount /dev/nvme0n1p1 /mnt/
验证
检查分区是否已挂载:
# lsblk
输出示例
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT loop0 7:0 0 93.8G 0 loop /run/ephemeral loop1 7:1 0 897.3M 1 loop /sysroot sr0 11:0 1 999M 0 rom /run/media/iso nvme0n1 259:1 0 1.5T 0 disk └─nvme0n1p1 259:2 0 250G 0 part /var/mnt 1
- 1
- 挂载点是
/var/mnt
,因为 RHCOS 中的/mnt
文件夹是到/var/mnt
的链接。
17.14.4. 下载镜像
factory-precaching-cli 工具允许您将以下镜像下载到分区服务器中:
- OpenShift Container Platform 镜像
- 包含在 5G RAN 站点的分布式单元 (DU) 配置集中的 Operator 镜像
- 来自断开连接的 registry 的 Operator 镜像
可用的 Operator 镜像列表在不同的 OpenShift Container Platform 版本中可能会有所不同。
17.14.4.1. 使用并行 worker 下载
factory-precaching-cli 工具使用并行 worker 同时下载多个镜像。您可以使用 --parallel
或 -p
选项配置 worker 数量。默认数量设置为服务器可用 CPU 的 80%。
您的登录 shell 可能仅限于 CPU 的子集,这降低了容器可用的 CPU。要删除此限制,您可以在命令前面使用 taskset 0xffffffff
,例如:
# taskset 0xffffffff podman run --rm quay.io/openshift-kni/telco-ran-tools:latest factory-precaching-cli download --help
17.14.4.2. 准备下载 OpenShift Container Platform 镜像
要下载 OpenShift Container Platform 容器镜像,您需要知道多集群引擎版本。当使用 --du-profile
标志时,您还需要指定在要置备单节点 OpenShift 的 hub 集群中运行的 Red Hat Advanced Cluster Management (RHACM) 版本。
先决条件
- 已安装 RHACM 和多集群引擎 Operator。
- 您对存储设备进行分区。
- 您有足够的空间用于分区设备上的镜像。
- 您已将裸机服务器连接到互联网。
- 具有有效的 pull secret。
流程
在 hub 集群中运行以下命令来检查 RHACM 版本和多集群引擎版本:
$ oc get csv -A | grep -i advanced-cluster-management
输出示例
open-cluster-management advanced-cluster-management.v2.6.3 Advanced Cluster Management for Kubernetes 2.6.3 advanced-cluster-management.v2.6.3 Succeeded
$ oc get csv -A | grep -i multicluster-engine
输出示例
multicluster-engine cluster-group-upgrades-operator.v0.0.3 cluster-group-upgrades-operator 0.0.3 Pending multicluster-engine multicluster-engine.v2.1.4 multicluster engine for Kubernetes 2.1.4 multicluster-engine.v2.0.3 Succeeded multicluster-engine openshift-gitops-operator.v1.5.7 Red Hat OpenShift GitOps 1.5.7 openshift-gitops-operator.v1.5.6-0.1664915551.p Succeeded multicluster-engine openshift-pipelines-operator-rh.v1.6.4 Red Hat OpenShift Pipelines 1.6.4 openshift-pipelines-operator-rh.v1.6.3 Succeeded
要访问容器 registry,请在服务器中复制有效的 pull secret 以供安装:
创建
.docker
文件夹:$ mkdir /root/.docker
将
config.json
文件中有效的 pull 复制到之前创建的.docker/
文件夹:$ cp config.json /root/.docker/config.json 1
- 1
/root/.docker/config.json
是默认路径,podman
检查 registry 的登录凭证。
如果使用其他 registry 来拉取所需的工件,则需要复制正确的 pull secret。如果本地 registry 使用 TLS,则需要也包含来自 registry 的证书。
17.14.4.3. 下载 OpenShift Container Platform 镜像
factory-precaching-cli 工具允许您预缓存置备特定 OpenShift Container Platform 发行版本所需的所有容器镜像。
流程
运行以下命令预缓存发行版本:
# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools -- \ factory-precaching-cli download \ 1 -r 4.12.0 \ 2 --acm-version 2.6.3 \ 3 --mce-version 2.1.4 \ 4 -f /mnt \ 5 --img quay.io/custom/repository 6
输出示例
Generated /mnt/imageset.yaml Generating list of pre-cached artifacts... Processing artifact [1/176]: ocp-v4.0-art-dev@sha256_6ac2b96bf4899c01a87366fd0feae9f57b1b61878e3b5823da0c3f34f707fbf5 Processing artifact [2/176]: ocp-v4.0-art-dev@sha256_f48b68d5960ba903a0d018a10544ae08db5802e21c2fa5615a14fc58b1c1657c Processing artifact [3/176]: ocp-v4.0-art-dev@sha256_a480390e91b1c07e10091c3da2257180654f6b2a735a4ad4c3b69dbdb77bbc06 Processing artifact [4/176]: ocp-v4.0-art-dev@sha256_ecc5d8dbd77e326dba6594ff8c2d091eefbc4d90c963a9a85b0b2f0e6155f995 Processing artifact [5/176]: ocp-v4.0-art-dev@sha256_274b6d561558a2f54db08ea96df9892315bb773fc203b1dbcea418d20f4c7ad1 Processing artifact [6/176]: ocp-v4.0-art-dev@sha256_e142bf5020f5ca0d1bdda0026bf97f89b72d21a97c9cc2dc71bf85050e822bbf ... Processing artifact [175/176]: ocp-v4.0-art-dev@sha256_16cd7eda26f0fb0fc965a589e1e96ff8577e560fcd14f06b5fda1643036ed6c8 Processing artifact [176/176]: ocp-v4.0-art-dev@sha256_cf4d862b4a4170d4f611b39d06c31c97658e309724f9788e155999ae51e7188f ... Summary: Release: 4.12.0 Hub Version: 2.6.3 ACM Version: 2.6.3 MCE Version: 2.1.4 Include DU Profile: No Workers: 83
验证
检查所有镜像是否在服务器的目标文件夹中压缩:
$ ls -l /mnt 1
- 1
- 建议您预缓存
/mnt
文件夹中的镜像。
输出示例
-rw-r--r--. 1 root root 136352323 Oct 31 15:19 ocp-v4.0-art-dev@sha256_edec37e7cd8b1611d0031d45e7958361c65e2005f145b471a8108f1b54316c07.tgz -rw-r--r--. 1 root root 156092894 Oct 31 15:33 ocp-v4.0-art-dev@sha256_ee51b062b9c3c9f4fe77bd5b3cc9a3b12355d040119a1434425a824f137c61a9.tgz -rw-r--r--. 1 root root 172297800 Oct 31 15:29 ocp-v4.0-art-dev@sha256_ef23d9057c367a36e4a5c4877d23ee097a731e1186ed28a26c8d21501cd82718.tgz -rw-r--r--. 1 root root 171539614 Oct 31 15:23 ocp-v4.0-art-dev@sha256_f0497bb63ef6834a619d4208be9da459510df697596b891c0c633da144dbb025.tgz -rw-r--r--. 1 root root 160399150 Oct 31 15:20 ocp-v4.0-art-dev@sha256_f0c339da117cde44c9aae8d0bd054bceb6f19fdb191928f6912a703182330ac2.tgz -rw-r--r--. 1 root root 175962005 Oct 31 15:17 ocp-v4.0-art-dev@sha256_f19dd2e80fb41ef31d62bb8c08b339c50d193fdb10fc39cc15b353cbbfeb9b24.tgz -rw-r--r--. 1 root root 174942008 Oct 31 15:33 ocp-v4.0-art-dev@sha256_f1dbb81fa1aa724e96dd2b296b855ff52a565fbef003d08030d63590ae6454df.tgz -rw-r--r--. 1 root root 246693315 Oct 31 15:31 ocp-v4.0-art-dev@sha256_f44dcf2c94e4fd843cbbf9b11128df2ba856cd813786e42e3da1fdfb0f6ddd01.tgz -rw-r--r--. 1 root root 170148293 Oct 31 15:00 ocp-v4.0-art-dev@sha256_f48b68d5960ba903a0d018a10544ae08db5802e21c2fa5615a14fc58b1c1657c.tgz -rw-r--r--. 1 root root 168899617 Oct 31 15:16 ocp-v4.0-art-dev@sha256_f5099b0989120a8d08a963601214b5c5cb23417a707a8624b7eb52ab788a7f75.tgz -rw-r--r--. 1 root root 176592362 Oct 31 15:05 ocp-v4.0-art-dev@sha256_f68c0e6f5e17b0b0f7ab2d4c39559ea89f900751e64b97cb42311a478338d9c3.tgz -rw-r--r--. 1 root root 157937478 Oct 31 15:37 ocp-v4.0-art-dev@sha256_f7ba33a6a9db9cfc4b0ab0f368569e19b9fa08f4c01a0d5f6a243d61ab781bd8.tgz -rw-r--r--. 1 root root 145535253 Oct 31 15:26 ocp-v4.0-art-dev@sha256_f8f098911d670287826e9499806553f7a1dd3e2b5332abbec740008c36e84de5.tgz -rw-r--r--. 1 root root 158048761 Oct 31 15:40 ocp-v4.0-art-dev@sha256_f914228ddbb99120986262168a705903a9f49724ffa958bb4bf12b2ec1d7fb47.tgz -rw-r--r--. 1 root root 167914526 Oct 31 15:37 ocp-v4.0-art-dev@sha256_fa3ca9401c7a9efda0502240aeb8d3ae2d239d38890454f17fe5158b62305010.tgz -rw-r--r--. 1 root root 164432422 Oct 31 15:24 ocp-v4.0-art-dev@sha256_fc4783b446c70df30b3120685254b40ce13ba6a2b0bf8fb1645f116cf6a392f1.tgz -rw-r--r--. 1 root root 306643814 Oct 31 15:11 troubleshoot@sha256_b86b8aea29a818a9c22944fd18243fa0347c7a2bf1ad8864113ff2bb2d8e0726.tgz
17.14.4.4. 下载 Operator 镜像
您还可以预缓存第 2 个 Operator,用于 5G Radio 访问网络 (RAN) 分布式单元 (DU) 集群配置。Day-2 Operator 依赖于已安装的 OpenShift Container Platform 版本。
您需要使用 --acm-version
和 --mce-version
标志包含 RHACM hub 和 multicluster engine Operator 版本,以便 factory-precaching-cli 工具可以预缓存 RHACM 和 multicluster engine Operator 的适当容器镜像。
流程
预缓存 Operator 镜像:
# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download \ 1 -r 4.12.0 \ 2 --acm-version 2.6.3 \ 3 --mce-version 2.1.4 \ 4 -f /mnt \ 5 --img quay.io/custom/repository 6 --du-profile -s 7
输出示例
Generated /mnt/imageset.yaml Generating list of pre-cached artifacts... Processing artifact [1/379]: ocp-v4.0-art-dev@sha256_7753a8d9dd5974be8c90649aadd7c914a3d8a1f1e016774c7ac7c9422e9f9958 Processing artifact [2/379]: ose-kube-rbac-proxy@sha256_c27a7c01e5968aff16b6bb6670423f992d1a1de1a16e7e260d12908d3322431c Processing artifact [3/379]: ocp-v4.0-art-dev@sha256_370e47a14c798ca3f8707a38b28cfc28114f492bb35fe1112e55d1eb51022c99 ... Processing artifact [378/379]: ose-local-storage-operator@sha256_0c81c2b79f79307305e51ce9d3837657cf9ba5866194e464b4d1b299f85034d0 Processing artifact [379/379]: multicluster-operators-channel-rhel8@sha256_c10f6bbb84fe36e05816e873a72188018856ad6aac6cc16271a1b3966f73ceb3 ... Summary: Release: 4.12.0 Hub Version: 2.6.3 ACM Version: 2.6.3 MCE Version: 2.1.4 Include DU Profile: Yes Workers: 83
17.14.4.5. 在断开连接的环境中预缓存自定义镜像
在生成 ImageSetConfiguration
自定义资源 (CR) 后,-- generate-imageset
参数会停止 factory-precaching-cli 工具。这可让您在下载任何镜像前自定义 ImageSetConfiguration
CR。自定义 CR 后,您可以使用 --skip-imageset
参数下载您在 ImageSetConfiguration
CR 中指定的镜像。
您可以使用以下方法自定义 ImageSetConfiguration
CR:
- 添加 Operator 和其他镜像
- 删除 Operator 和其他镜像
- 将 Operator 和目录源改为本地或断开连接的 registry
流程
预缓存镜像:
# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download \ 1 -r 4.12.0 \ 2 --acm-version 2.6.3 \ 3 --mce-version 2.1.4 \ 4 -f /mnt \ 5 --img quay.io/custom/repository 6 --du-profile -s \ 7 --generate-imageset 8
输出示例
Generated /mnt/imageset.yaml
ImageSetConfiguration CR 示例
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration mirror: platform: channels: - name: stable-4.12 minVersion: 4.12.0 1 maxVersion: 4.12.0 additionalImages: - name: quay.io/custom/repository operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.12 packages: - name: advanced-cluster-management 2 channels: - name: 'release-2.6' minVersion: 2.6.3 maxVersion: 2.6.3 - name: multicluster-engine 3 channels: - name: 'stable-2.1' minVersion: 2.1.4 maxVersion: 2.1.4 - name: local-storage-operator 4 channels: - name: 'stable' - name: ptp-operator 5 channels: - name: 'stable' - name: sriov-network-operator 6 channels: - name: 'stable' - name: cluster-logging 7 channels: - name: 'stable' - name: lvms-operator 8 channels: - name: 'stable-4.12' - name: amq7-interconnect-operator 9 channels: - name: '1.10.x' - name: bare-metal-event-relay 10 channels: - name: 'stable' - catalog: registry.redhat.io/redhat/certified-operator-index:v4.12 packages: - name: sriov-fec 11 channels: - name: 'stable'
在 CR 中自定义目录资源:
apiVersion: mirror.openshift.io/v1alpha2 kind: ImageSetConfiguration mirror: platform: [...] operators: - catalog: eko4.cloud.lab.eng.bos.redhat.com:8443/redhat/certified-operator-index:v4.12 packages: - name: sriov-fec channels: - name: 'stable'
当使用本地或断开连接的 registry 下载镜像时,您必须首先为您要从中拉取内容的 registry 添加证书。
要避免任何错误,请将 registry 证书复制到您的服务器中:
# cp /tmp/eko4-ca.crt /etc/pki/ca-trust/source/anchors/.
然后,更新证书信任存储:
# update-ca-trust
将主机
/etc/pki
文件夹挂载到 factory-cli 镜像中:# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker -v /etc/pki:/etc/pki --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- \ factory-precaching-cli download \ 1 -r 4.12.0 \ 2 --acm-version 2.6.3 \ 3 --mce-version 2.1.4 \ 4 -f /mnt \ 5 --img quay.io/custom/repository 6 --du-profile -s \ 7 --skip-imageset 8
在不生成新的
imageSetConfiguration
CR 的情况下下载镜像:# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker --privileged --rm quay.io/openshift-kni/telco-ran-tools:latest -- factory-precaching-cli download -r 4.12.0 \ --acm-version 2.6.3 --mce-version 2.1.4 -f /mnt \ --img quay.io/custom/repository \ --du-profile -s \ --skip-imageset
其他资源
- 要访问在线红帽 registry,请参阅 OpenShift 安装自定义工具。
- 有关使用多集群引擎的更多信息,请参阅关于 multicluster engine operator 的集群生命周期。
17.14.5. ZTP 中的预缓存镜像
SiteConfig
清单定义如何安装和配置 OpenShift 集群。在 ZTP 置备工作流中,factory-precaching-cli 工具需要 SiteConfig
清单中的以下附加字段:
-
clusters.ignitionConfigOverride
-
nodes.installerArgs
-
nodes.ignitionConfigOverride
带有其他字段的 SiteConfig 示例
apiVersion: ran.openshift.io/v1 kind: SiteConfig metadata: name: "example-5g-lab" namespace: "example-5g-lab" spec: baseDomain: "example.domain.redhat.com" pullSecretRef: name: "assisted-deployment-pull-secret" clusterImageSetNameRef: "img4.9.10-x86-64-appsub" sshPublicKey: "ssh-rsa ..." clusters: - clusterName: "sno-worker-0" clusterLabels: group-du-sno: "" common-411: true sites : "example-5g-lab" vendor: "OpenShift" clusterNetwork: - cidr: 10.128.0.0/14 hostPrefix: 23 machineNetwork: - cidr: 10.19.32.192/26 serviceNetwork: - 172.30.0.0/16 networkType: "OVNKubernetes" additionalNTPSources: - clock.corp.redhat.com ignitionConfigOverride: '{"ignition":{"version":"3.1.0"},"systemd":{"units":[{"name":"var-mnt.mount","enabled":true,"contents":"[Unit]\nDescription=Mount partition with artifacts\nBefore=precache-images.service\nBindsTo=precache-images.service\nStopWhenUnneeded=true\n\n[Mount]\nWhat=/dev/disk/by-partlabel/data\nWhere=/var/mnt\nType=xfs\nTimeoutSec=30\n\n[Install]\nRequiredBy=precache-images.service"},{"name":"precache-images.service","enabled":true,"contents":"[Unit]\nDescription=Extracts the precached images in discovery stage\nAfter=var-mnt.mount\nBefore=agent.service\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/var/mnt\nExecStart=bash /usr/local/bin/extract-ai.sh\n#TimeoutStopSec=30\n\n[Install]\nWantedBy=multi-user.target default.target\nWantedBy=agent.service"}]},"storage":{"files":[{"overwrite":true,"path":"/usr/local/bin/extract-ai.sh","mode":755,"user":{"name":"root"},"contents":{"source":"data:,%23%21%2Fbin%2Fbash%0A%0AFOLDER%3D%22%24%7BFOLDER%3A-%24%28pwd%29%7D%22%0AOCP_RELEASE_LIST%3D%22%24%7BOCP_RELEASE_LIST%3A-ai-images.txt%7D%22%0ABINARY_FOLDER%3D%2Fvar%2Fmnt%0A%0Apushd%20%24FOLDER%0A%0Atotal_copies%3D%24%28sort%20-u%20%24BINARY_FOLDER%2F%24OCP_RELEASE_LIST%20%7C%20wc%20-l%29%20%20%23%20Required%20to%20keep%20track%20of%20the%20pull%20task%20vs%20total%0Acurrent_copy%3D1%0A%0Awhile%20read%20-r%20line%3B%0Ado%0A%20%20uri%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%241%7D%27%29%0A%20%20%23tar%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%242%7D%27%29%0A%20%20podman%20image%20exists%20%24uri%0A%20%20if%20%5B%5B%20%24%3F%20-eq%200%20%5D%5D%3B%20then%0A%20%20%20%20%20%20echo%20%22Skipping%20existing%20image%20%24tar%22%0A%20%20%20%20%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20%20%20%20%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%0A%20%20%20%20%20%20continue%0A%20%20fi%0A%20%20tar%3D%24%28echo%20%22%24uri%22%20%7C%20%20rev%20%7C%20cut%20-d%20%22%2F%22%20-f1%20%7C%20rev%20%7C%20tr%20%22%3A%22%20%22_%22%29%0A%20%20tar%20zxvf%20%24%7Btar%7D.tgz%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-f%20%24%7Btar%7D.gz%3B%20fi%0A%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20skopeo%20copy%20dir%3A%2F%2F%24%28pwd%29%2F%24%7Btar%7D%20containers-storage%3A%24%7Buri%7D%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-rf%20%24%7Btar%7D%3B%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%3B%20fi%0Adone%20%3C%20%24%7BBINARY_FOLDER%7D%2F%24%7BOCP_RELEASE_LIST%7D%0A%0A%23%20workaround%20while%20https%3A%2F%2Fgithub.com%2Fopenshift%2Fassisted-service%2Fpull%2F3546%0A%23cp%20%2Fvar%2Fmnt%2Fmodified-rhcos-4.10.3-x86_64-metal.x86_64.raw.gz%20%2Fvar%2Ftmp%2F.%0A%0Aexit%200"}},{"overwrite":true,"path":"/usr/local/bin/agent-fix-bz1964591","mode":755,"user":{"name":"root"},"contents":{"source":"data:,%23%21%2Fusr%2Fbin%2Fsh%0A%0A%23%20This%20script%20is%20a%20workaround%20for%20bugzilla%201964591%20where%20symlinks%20inside%20%2Fvar%2Flib%2Fcontainers%2F%20get%0A%23%20corrupted%20under%20some%20circumstances.%0A%23%0A%23%20In%20order%20to%20let%20agent.service%20start%20correctly%20we%20are%20checking%20here%20whether%20the%20requested%0A%23%20container%20image%20exists%20and%20in%20case%20%22podman%20images%22%20returns%20an%20error%20we%20try%20removing%20the%20faulty%0A%23%20image.%0A%23%0A%23%20In%20such%20a%20scenario%20agent.service%20will%20detect%20the%20image%20is%20not%20present%20and%20pull%20it%20again.%20In%20case%0A%23%20the%20image%20is%20present%20and%20can%20be%20detected%20correctly%2C%20no%20any%20action%20is%20required.%0A%0AIMAGE%3D%24%28echo%20%241%20%7C%20sed%20%27s%2F%3A.%2A%2F%2F%27%29%0Apodman%20image%20exists%20%24IMAGE%20%7C%7C%20echo%20%22already%20loaded%22%20%7C%7C%20echo%20%22need%20to%20be%20pulled%22%0A%23podman%20images%20%7C%20grep%20%24IMAGE%20%7C%7C%20podman%20rmi%20--force%20%241%20%7C%7C%20true"}}]}}' nodes: - hostName: "snonode.sno-worker-0.example.domain.redhat.com" role: "master" bmcAddress: "idrac-virtualmedia+https://10.19.28.53/redfish/v1/Systems/System.Embedded.1" bmcCredentialsName: name: "worker0-bmh-secret" bootMACAddress: "e4:43:4b:bd:90:46" bootMode: "UEFI" rootDeviceHints: deviceName: /dev/nvme0n1 cpuset: "0-1,40-41" installerArgs: '["--save-partlabel", "data"]' ignitionConfigOverride: '{"ignition":{"version":"3.1.0"},"systemd":{"units":[{"name":"var-mnt.mount","enabled":true,"contents":"[Unit]\nDescription=Mount partition with artifacts\nBefore=precache-ocp-images.service\nBindsTo=precache-ocp-images.service\nStopWhenUnneeded=true\n\n[Mount]\nWhat=/dev/disk/by-partlabel/data\nWhere=/var/mnt\nType=xfs\nTimeoutSec=30\n\n[Install]\nRequiredBy=precache-ocp-images.service"},{"name":"precache-ocp-images.service","enabled":true,"contents":"[Unit]\nDescription=Extracts the precached OCP images into containers storage\nAfter=var-mnt.mount\nBefore=machine-config-daemon-pull.service nodeip-configuration.service\n\n[Service]\nType=oneshot\nUser=root\nWorkingDirectory=/var/mnt\nExecStart=bash /usr/local/bin/extract-ocp.sh\nTimeoutStopSec=60\n\n[Install]\nWantedBy=multi-user.target"}]},"storage":{"files":[{"overwrite":true,"path":"/usr/local/bin/extract-ocp.sh","mode":755,"user":{"name":"root"},"contents":{"source":"data:,%23%21%2Fbin%2Fbash%0A%0AFOLDER%3D%22%24%7BFOLDER%3A-%24%28pwd%29%7D%22%0AOCP_RELEASE_LIST%3D%22%24%7BOCP_RELEASE_LIST%3A-ocp-images.txt%7D%22%0ABINARY_FOLDER%3D%2Fvar%2Fmnt%0A%0Apushd%20%24FOLDER%0A%0Atotal_copies%3D%24%28sort%20-u%20%24BINARY_FOLDER%2F%24OCP_RELEASE_LIST%20%7C%20wc%20-l%29%20%20%23%20Required%20to%20keep%20track%20of%20the%20pull%20task%20vs%20total%0Acurrent_copy%3D1%0A%0Awhile%20read%20-r%20line%3B%0Ado%0A%20%20uri%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%241%7D%27%29%0A%20%20%23tar%3D%24%28echo%20%22%24line%22%20%7C%20awk%20%27%7Bprint%242%7D%27%29%0A%20%20podman%20image%20exists%20%24uri%0A%20%20if%20%5B%5B%20%24%3F%20-eq%200%20%5D%5D%3B%20then%0A%20%20%20%20%20%20echo%20%22Skipping%20existing%20image%20%24tar%22%0A%20%20%20%20%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20%20%20%20%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%0A%20%20%20%20%20%20continue%0A%20%20fi%0A%20%20tar%3D%24%28echo%20%22%24uri%22%20%7C%20%20rev%20%7C%20cut%20-d%20%22%2F%22%20-f1%20%7C%20rev%20%7C%20tr%20%22%3A%22%20%22_%22%29%0A%20%20tar%20zxvf%20%24%7Btar%7D.tgz%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-f%20%24%7Btar%7D.gz%3B%20fi%0A%20%20echo%20%22Copying%20%24%7Buri%7D%20%5B%24%7Bcurrent_copy%7D%2F%24%7Btotal_copies%7D%5D%22%0A%20%20skopeo%20copy%20dir%3A%2F%2F%24%28pwd%29%2F%24%7Btar%7D%20containers-storage%3A%24%7Buri%7D%0A%20%20if%20%5B%20%24%3F%20-eq%200%20%5D%3B%20then%20rm%20-rf%20%24%7Btar%7D%3B%20current_copy%3D%24%28%28current_copy%20%2B%201%29%29%3B%20fi%0Adone%20%3C%20%24%7BBINARY_FOLDER%7D%2F%24%7BOCP_RELEASE_LIST%7D%0A%0Aexit%200"}}]}}' nodeNetwork: config: interfaces: - name: ens1f0 type: ethernet state: up macAddress: "AA:BB:CC:11:22:33" ipv4: enabled: true dhcp: true ipv6: enabled: false interfaces: - name: "ens1f0" macAddress: "AA:BB:CC:11:22:33"
17.14.5.1. 了解 cluster.ignitionConfigOverride 字段
clusters.ignitionConfigOverride
字段在 ZTP 发现阶段以 Ignition 格式添加配置。该配置包括挂载到虚拟介质中的 ISO 中的 systemd
服务。这样,脚本是发现 RHCOS live ISO 的一部分,可用于加载辅助安装程序(AI)镜像。
systemd
服务-
systemd
服务为var-mnt.mount
和precache-images.services
。precache-images.service
依赖于var-mnt.mount
单元在/var/mnt
中挂载的磁盘分区。该服务调用名为extract-ai.sh
的脚本。 extract-ai.sh
-
extract-ai.sh
脚本提取并将所需的镜像从磁盘分区加载到本地容器存储。脚本成功完成后,您可以在本地使用镜像。 agent-fix-bz1964591
-
agent-fix-bz1964591
脚本是 AI 问题的一个临时解决方案。要防止 AI 删除镜像,这样可强制agent.service
从 registry 中再次拉取镜像,agent-fix-bz1964591
脚本会检查请求的容器镜像是否存在。
17.14.5.2. 了解 nodes.installerArgs 字段
nodes.installerArgs
字段允许您配置 coreos-installer
实用程序如何将 RHCOS live ISO 写入磁盘。您需要指示保存标记为 data
的磁盘分区,因为 OpenShift Container Platform 安装过程中需要保存在 data
分区中的工件。
额外的参数直接传递给将 live RHCOS 写入磁盘的 coreos-installer
工具。下一次重启时,操作系统从磁盘启动。
您可以将几个选项传递给 coreos-installer
工具:
OPTIONS: ... -u, --image-url <URL> Manually specify the image URL -f, --image-file <path> Manually specify a local image file -i, --ignition-file <path> Embed an Ignition config from a file -I, --ignition-url <URL> Embed an Ignition config from a URL ... --save-partlabel <lx>... Save partitions with this label glob --save-partindex <id>... Save partitions with this number or range ... --insecure-ignition Allow Ignition URL without HTTPS or hash
17.14.5.3. 了解 nodes.ignitionConfigOverride 字段
与 clusters.ignitionConfigOverride
类似,nodes.ignitionConfigOverride
项允许对 coreos-installer
工件程序的额外配置(使用 Ignition 格式),但在 OpenShift Container Platform 的安装阶段。当 RHCOS 写入磁盘时,ZTP 发现 ISO 中包含的额外配置不再可用。在发现阶段,额外的配置存储在实时操作系统的内存中。
在这个阶段,提取和加载的容器镜像数量会大于发现阶段。根据 OpenShift Container Platform 发行版本以及安装 day-2 Operator,安装时间可能会有所不同。
在安装阶段,使用 var-mnt.mount
和 precache-ocp.services
systemd
服务。
precache-ocp.service
precache-ocp.service
依赖于var-mnt.mount
单元在/var/mnt
中挂载的磁盘分区。precache-ocp.service
服务调用一个名为extract-ocp.sh
的脚本。重要要在 OpenShift Container Platform 安装前提取所有镜像,您必须先执行
precache-ocp.service
,然后才能执行machine-config-daemon-pull.service
和nodeip-configuration.service
服务。extract-ocp.sh
-
extract-ocp.sh
脚本提取并将所需的镜像从磁盘分区加载到本地容器存储。脚本成功完成后,您可以在本地使用镜像。
当您将 SiteConfig
和可选的 PolicyGenTemplates
自定义资源 (CR) 上传到监控 Argo CD 的 Git 仓库时,您可以通过将 CR 与 hub 集群同步来启动 ZTP 工作流。
17.14.6. 故障排除
17.14.6.1. 渲染的目录无效
当使用本地或断开连接的 registry 下载镜像时,您可能会看到 The rendered catalog is invalid
错误。这意味着您将缺少要从中拉取内容的新 registry 证书。
factory-precaching-cli 工具镜像基于 UBI RHEL 镜像构建。RHCOS 上的证书路径和位置相同。
错误示例
Generating list of pre-cached artifacts... error: unable to run command oc-mirror -c /mnt/imageset.yaml file:///tmp/fp-cli-3218002584/mirror --ignore-history --dry-run: Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/publish Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/v2 Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/charts Creating directory: /tmp/fp-cli-3218002584/mirror/oc-mirror-workspace/src/release-signatures backend is not configured in /mnt/imageset.yaml, using stateless mode backend is not configured in /mnt/imageset.yaml, using stateless mode No metadata detected, creating new workspace level=info msg=trying next host error=failed to do request: Head "https://eko4.cloud.lab.eng.bos.redhat.com:8443/v2/redhat/redhat-operator-index/manifests/v4.11": x509: certificate signed by unknown authority host=eko4.cloud.lab.eng.bos.redhat.com:8443 The rendered catalog is invalid. Run "oc-mirror list operators --catalog CATALOG-NAME --package PACKAGE-NAME" for more information. error: error rendering new refs: render reference "eko4.cloud.lab.eng.bos.redhat.com:8443/redhat/redhat-operator-index:v4.11": error resolving name : failed to do request: Head "https://eko4.cloud.lab.eng.bos.redhat.com:8443/v2/redhat/redhat-operator-index/manifests/v4.11": x509: certificate signed by unknown authority
流程
将 registry 证书复制到您的服务器中:
# cp /tmp/eko4-ca.crt /etc/pki/ca-trust/source/anchors/.
更新证书信任存储:
# update-ca-trust
将主机
/etc/pki
文件夹挂载到 factory-cli 镜像中:# podman run -v /mnt:/mnt -v /root/.docker:/root/.docker -v /etc/pki:/etc/pki --privileged -it --rm quay.io/openshift-kni/telco-ran-tools:latest -- \ factory-precaching-cli download -r 4.11.5 --acm-version 2.5.4 \ --mce-version 2.0.4 -f /mnt \--img quay.io/custom/repository --du-profile -s --skip-imageset
Legal Notice
Copyright © 2024 Red Hat, Inc.
OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).
Modified versions must remove all Red Hat trademarks.
Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.
Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.