01-container-mount-ns-and-kubelet-conf-master.yaml
01-container-mount-ns-and-kubelet-conf-worker.yaml
在部署虚拟分布式单元 (vDU) 应用程序之前,需要调整和配置集群主机固件以及其他各种集群配置设置。 使用以下信息验证集群配置以支持 vDU 工作负载。
将下表作为在 OpenShift Container Platform 4.17 上运行 vDU 应用程序的集群主机固件配置的基础。
下表是 vDU 集群主机固件配置的一般建议。 确切的固件设置将取决于您的需求和具体的硬件平台。 零接触配置管道不处理固件的自动设置。 |
固件设置 | 配置 | 描述 |
---|---|---|
超传输 (HT) |
已启用 |
超传输 (HT) 总线是 AMD 开发的一种总线技术。 HT 提供主机内存中的组件和其他系统外设之间的高速链路。 |
UEFI |
已启用 |
启用从 UEFI 引导 vDU 主机。 |
CPU 电源和性能策略 |
性能 |
将 CPU 电源和性能策略设置为优化系统以提高性能而不是能效。 |
非核心频率缩放 |
已禁用 |
禁用非核心频率缩放以防止独立设置 CPU 非核心部分的电压和频率。 |
非核心频率 |
最大值 |
将 CPU 的非核心部分(例如缓存和内存控制器)设置为其最大可能的运行频率。 |
性能 P-limit |
已禁用 |
禁用性能 P-limit 以防止处理器的非核心频率协调。 |
增强型英特尔® SpeedStep 技术 |
已启用 |
启用增强型英特尔 SpeedStep 以允许系统动态调整处理器电压和核心频率,从而降低主机的功耗和热量产生。 |
英特尔® Turbo Boost 技术 |
已启用 |
为基于英特尔的 CPU 启用 Turbo Boost 技术,以便如果处理器在低于功耗、电流和温度规格限制的情况下运行,则可以自动允许处理器核心运行速度高于额定工作频率。 |
英特尔可配置 TDP |
已启用 |
启用 CPU 的热设计功耗 (TDP)。 |
可配置 TDP 级别 |
级别 2 |
TDP 级别设置特定性能等级所需的 CPU 功耗。 TDP 级别 2 将 CPU 设置为最稳定的性能级别,但代价是功耗。 |
节能 Turbo |
已禁用 |
禁用节能 Turbo 以防止处理器使用基于节能的策略。 |
硬件 P 状态 |
已启用或已禁用 |
启用操作系统控制的 P 状态以允许每 Pod 电力管理。 禁用 |
封装 C 状态 |
C0/C1 状态 |
使用 C0 或 C1 状态将处理器设置为完全活动状态 (C0) 或停止在软件中运行的 CPU 内部时钟 (C1)。 |
C1E |
已禁用 |
CPU 增强型暂停 (C1E) 是英特尔芯片中的节能功能。 禁用 C1E 可防止操作系统在不活动时向 CPU 发送暂停命令。 |
处理器 C6 |
已禁用 |
C6 节能是 CPU 功能,可自动禁用空闲的 CPU 核心和缓存。 禁用 C6 可以提高系统性能。 |
子 NUMA 集群 |
已禁用 |
子 NUMA 集群将处理器核心、缓存和内存划分为多个 NUMA 域。 禁用此选项可以提高对延迟敏感的工作负载的性能。 |
为主机中的固件启用全局 SR-IOV 和 VT-d 设置。 这些设置与裸机环境相关。 |
启用 |
运行虚拟化分布式单元 (vDU) 应用程序的集群需要高度调整和优化的配置。 以下信息描述了在 OpenShift Container Platform 4.17 集群中支持 vDU 工作负载所需的各种元素。
检查从ztp-site-generate
容器中提取的MachineConfig
自定义资源 (CR) 是否已应用到集群中。这些 CR 位于提取的out/source-crs/extra-manifest/
文件夹中。
来自ztp-site-generate
容器的以下MachineConfig
CR 配置集群主机
MachineConfig CR | 描述 |
---|---|
|
配置容器挂载命名空间和 kubelet 配置。 |
|
加载 SCTP 内核模块。这些 |
|
配置集群的 kdump 崩溃报告。 |
|
配置集群中的 SR-IOV 内核参数。 |
|
在集群重新引导后禁用 |
|
禁用集群重启后自动清除 CRI-O 缓存。 |
|
配置 Chrony 服务对系统时钟进行一次性检查和调整。 |
|
启用 |
|
在集群安装期间以及生成 RHACM 集群策略时启用 cgroups v1。 |
在 OpenShift Container Platform 4.14 及更高版本中,您可以使用 |
运行虚拟化分布式单元 (vDU) 应用程序的集群需要以下 Operators,它们是基线参考配置的一部分
节点调优 Operator (NTO)。NTO 打包了以前由性能附加组件 Operator 提供的功能,该 Operator 现在是 NTO 的一部分。
PTP Operator
SR-IOV 网络 Operator
Red Hat OpenShift 日志 Operator
本地存储 Operator
始终在您的集群中使用最新支持的实时内核版本。确保您在集群中应用以下配置
确保在集群性能配置文件中设置以下additionalKernelArgs
apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
# ...
spec:
additionalKernelArgs:
- "rcupdate.rcu_normal_after_boot=0"
- "efi=runtime"
- "vfio_pci.enable_sriov=1"
- "vfio_pci.disable_idle_d3=1"
- "module_blacklist=irdma"
# ...
可选:在hardwareTuning
字段下设置 CPU 频率
您可以使用硬件调优来调整保留和隔离核心 CPU 的 CPU 频率。对于 FlexRAN 等应用程序,硬件供应商建议您将 CPU 频率运行在低于提供的默认频率。强烈建议您在设置任何频率之前,参考硬件供应商关于您处理器代的最高频率设置的指南。此示例显示 Sapphire Rapid 硬件的保留和隔离 CPU 的频率
apiVersion: performance.openshift.io/v2
kind: PerformanceProfile
metadata:
name: openshift-node-performance-profile
spec:
cpu:
isolated: "2-19,22-39"
reserved: "0-1,20-21"
hugepages:
defaultHugepagesSize: 1G
pages:
- size: 1G
count: 32
realTimeKernel:
enabled: true
hardwareTuning:
isolatedCpuFreq: 2500000
reservedCpuFreq: 2800000
确保Tuned
CR 中的performance-patch
配置文件配置与相关PerformanceProfile
CR 中的isolated
CPU 集匹配的正确 CPU 隔离集,例如
apiVersion: tuned.openshift.io/v1
kind: Tuned
metadata:
name: performance-patch
namespace: openshift-cluster-node-tuning-operator
annotations:
ran.openshift.io/ztp-deploy-wave: "10"
spec:
profile:
- name: performance-patch
# The 'include' line must match the associated PerformanceProfile name, for example:
# include=openshift-node-performance-${PerformanceProfile.metadata.name}
# When using the standard (non-realtime) kernel, remove the kernel.timer_migration override from the [sysctl] section
data: |
[main]
summary=Configuration changes profile inherited from performance created tuned
include=openshift-node-performance-openshift-node-performance-profile
[scheduler]
group.ice-ptp=0:f:10:*:ice-ptp.*
group.ice-gnss=0:f:10:*:ice-gnss.*
group.ice-dplls=0:f:10:*:ice-dplls.*
[service]
service.stalld=start,enable
service.chronyd=stop,disable
# ...
始终在您的 OpenShift Container Platform 集群中使用最新版本的实时内核。如果您不确定集群中正在使用的内核版本,您可以按照以下步骤将当前实时内核版本与发行版本进行比较。
您已安装 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
这是发行版附带的默认实时内核版本。
实时内核由内核版本中的字符串 |
检查集群当前发行版列出的内核版本是否与集群中运行的实际实时内核匹配。运行以下命令以检查正在运行的实时内核版本
打开到集群节点的远程 shell 连接
$ oc debug node/<node_name>
检查实时内核版本
sh-4.4# uname -r
4.18.0-305.49.1.rt7.121.el8_4.x86_64
您可以检查集群是否正在运行正确的配置。以下步骤描述了如何检查在 OpenShift Container Platform 4.17 集群中部署 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 安装的所有 Operators 以及参考 DU 调优配置中包含的额外 Operators 集。运行以下命令
$ 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
不应为工作负载分区添加额外 Operators 的注释。在前面命令的输出中,应列出额外的 Operators,在 |
检查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
容器的远程 shell 连接和 PTP 管理客户端 (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
1 | master_offset 应在 -100 到 100 ns 之间。 |
2 | 表示 PTP 时钟已与主时钟同步,并且本地时钟不是主时钟。 |
检查在/var/run/ptp4l.0.config
中找到的预期master offset
值是否在linuxptp-daemon-container
日志中。
$ 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
的清理间隔是否已调整为较慢的速率。这在 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 保留期是否设置为 24 小时
$ 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 个作为reserved
的 CPU
$ oc get performanceprofile -o jsonpath="{ .items[0].spec.cpu.reserved }"
0-3
根据您的工作负载要求,您可能需要分配额外的保留 CPU。 |