7.5. 使用 worker 延迟配置集提高高延迟环境中的集群稳定性
默认情况下,所有节点都会每 10 秒向 OpenShift Container Platform 集群中的 Kubernetes Controller Manager Operator(kube controller)发送心跳信号。如果集群没有从节点获得 heartbeat,OpenShift Container Platform 会使用几个默认机制进行响应。
例如,如果 Kubernetes Controller Manager Operator 在配置的时间后丢失与节点联系:
-
控制平面上的节点控制器将节点健康状况更新为
Unhealthy,并将节点Ready条件标记为Unknown。 - 因此,调度程序会停止将 pod 调度到该节点。
-
内部节点控制器添加了一个
node.kubernetes.io/unreachable污点,对节点具有NoExecute效果,默认在五分钟后调度节点上的任何 pod 进行驱除。
如果您的网络容易出现延迟问题,尤其是在网络边缘中有节点时,此行为可能会造成问题。在某些情况下,Kubernetes Controller Manager Operator 可能会因为网络延迟而从健康的节点接收更新。然后,Kubernetes Controller Manager Operator 会从节点驱除 pod,即使节点健康。要避免这个问题,您可以使用 worker 延迟配置集调整 kubelet 和 Kubernetes Controller Manager Operator 在执行操作前等待状态更新的频率。这些调整有助于确保集群在控制平面和 worker 节点间网络延迟无法正常工作时,集群无法正常工作。
这些 worker 延迟配置集是预定义的三组参数,它们带有精心调优的值,可让您控制集群的反应延迟问题,而无需手动确定最佳值。
7.5.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 将其状态更新为 Kubernetes Controller Manager Operator 的时间(以秒为单位)。 -
node-monitor-grace-period。指定 Kubernetes Controller Manager Operator 在节点不健康前等待更新的时间(以秒为单位),并将node.kubernetes.io/not-ready或node.kubernetes.io/unreachable污点添加到节点。 -
default-not-ready-toleration-seconds。在标记节点不健康后,Kubernetes Controller Manager Operator 在从该节点驱除 pod 前等待的时间(以秒为单位)。 -
default-unreachable-toleration-seconds。在标记节点无法访问后,Kubernetes Controller Manager Operator 在从该节点驱除 pod 前等待的时间(以秒为单位)。
不支持手动修改 node-monitor-grace-period 参数。
以下 Operator 监控 worker 延迟配置集的更改并相应地响应:
-
Machine Config Operator (MCO) 更新 worker 节点上的
node-status-update-frequency参数。 -
Kubernetes Controller Manager Operator 更新 control plane 节点上的
node-monitor-grace-period参数。 -
Kubernetes Controller Manager Operator 更新控制计划节点上的
default-not-ready-toleration-seconds和default-unreachable-toleration-seconds参数。
虽然默认配置在大多数情况下可以正常工作,但 OpenShift Container Platform 会为网络遇到比通常更高的延迟的情况提供两个其他 worker 延迟配置集。以下部分描述了三个 worker 延迟配置集:
- 默认 worker 延迟配置集
使用
Default配置集,每个 kubelet 每 10 秒都会将其节点状态报告为 Kubelet Controller Manager Operator(kube controller)。Kubelet Controller Manager Operator 每 5 秒检查 kubelet 的状态。Kubernetes Controller Manager Operator 在考虑不健康的节点前等待 40 秒进行状态更新。它使用
node.kubernetes.io/not-ready或node.kubernetes.io/unreachable污点标记节点,并驱除该节点上的 pod。如果该节点上的 pod 具有NoExecute容限,则 pod 将在 300 秒后被驱除。如果 pod 具有tolerationSeconds参数,则驱除会等待该参数指定的周期。profile 组件 参数 值 Default(默认)
kubelet
node-status-update-frequency10s
kubelet Controller Manager
node-monitor-grace-period40s
Kubernetes API 服务器
default-not-ready-toleration-seconds300s
Kubernetes API 服务器
default-unreachable-toleration-seconds300s
- 中型 worker 延迟配置集
如果网络延迟比通常稍高,则使用
MediumUpdateAverageReaction配置集。MediumUpdateAverageReaction配置集减少了 kubelet 更新频率为 20 秒,并将 Kubernetes Controller Manager Operator 等待这些更新的时间更改为 2 分钟。该节点上的 pod 驱除周期会减少到 60 秒。如果 pod 具有tolerationSeconds参数,则驱除会等待该参数指定的周期。Kubernetes Controller Manager Operator 等待 2 分钟以认为节点不健康。另一分钟后,驱除过程会启动。
profile 组件 参数 值 MediumUpdateAverageReaction
kubelet
node-status-update-frequency20s
kubelet Controller Manager
node-monitor-grace-period2m
Kubernetes API 服务器
default-not-ready-toleration-seconds60s
Kubernetes API 服务器
default-unreachable-toleration-seconds60s
- 低 worker 延迟配置集
如果网络延迟非常高,请使用
LowUpdateSlowReaction配置集。LowUpdateSlowReaction配置集减少了 kubelet 更新频率为 1 分钟,并将 Kubernetes Controller Manager Operator 等待这些更新的时间更改为 5 分钟。该节点上的 pod 驱除周期会减少到 60 秒。如果 pod 具有tolerationSeconds参数,则驱除会等待该参数指定的周期。Kubernetes Controller Manager Operator 等待 5 分钟时间认为节点不健康。另一分钟后,驱除过程会启动。
profile 组件 参数 值 LowUpdateSlowReaction
kubelet
node-status-update-frequency1m
kubelet Controller Manager
node-monitor-grace-period5m
Kubernetes API 服务器
default-not-ready-toleration-seconds60s
Kubernetes API 服务器
default-unreachable-toleration-seconds60s
7.5.2. 使用 worker 延迟配置集
要实现 worker 延迟配置集来处理网络延迟,请编辑 node.config 对象以添加配置集的名称。当延迟增加或减少时,您可以随时更改配置集。
您必须一次移动一个 worker 延迟配置集。例如,您无法直接从 Default 配置集移到 LowUpdateSlowReaction worker 延迟配置集。您必须首先从 default worker 延迟配置集移到 MediumUpdateAverageReaction 配置集,然后将其移到 LowUpdateSlowReaction。同样,当返回到默认配置集时,必须首先从低配置集移到中型配置集,然后再进入默认值。
您还可以在安装 OpenShift Container Platform 集群时配置 worker 延迟配置集。
流程
从默认的 worker 延迟配置集移动:
移到中型 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 参数设置为适当的值。