×

如果集群管理员已针对平台验证执行延迟测试,他们可以发现需要调整集群的操作以确保在高延迟情况下保持稳定性。集群管理员只需要更改一个记录在文件中的参数,该参数控制四个影响监督进程如何读取状态和解释集群健康状况的参数。仅更改一个参数即可提供简单易维护的集群调整。

Kubelet进程为监控集群健康状况提供了起点。Kubelet为OpenShift Container Platform集群中的所有节点设置状态值。Kubernetes控制器管理器(kube controller)默认每10秒读取一次状态值。如果kube controller无法读取节点状态值,则在配置的时间段后会失去与该节点的联系。默认行为是

  1. 控制平面上的节点控制器将节点健康状况更新为不健康,并将节点就绪条件标记为未知

  2. 作为响应,调度程序停止向该节点调度Pod。

  3. 节点生命周期控制器添加一个具有NoExecute效果的node.kubernetes.io/unreachable污点到节点,并默认在五分钟后调度该节点上的任何Pod进行驱逐。

如果您的网络容易出现延迟问题,尤其是在网络边缘有节点的情况下,此行为可能会导致问题。在某些情况下,由于网络延迟,Kubernetes控制器管理器可能无法从健康节点接收更新。即使节点处于健康状态,Kubelet也会从节点驱逐Pod。

为了避免此问题,您可以使用工作程序延迟配置文件来调整Kubelet和Kubernetes控制器管理器在采取行动之前等待状态更新的频率。这些调整有助于确保在控制平面和工作节点之间的网络延迟不是最佳的情况下,您的集群能够正常运行。

这些工作程序延迟配置文件包含三组参数,这些参数已使用精心调整的值预定义,以控制集群对增加的延迟的反应。无需手动实验查找最佳值。

您可以在安装集群时或在任何时候注意到集群网络中延迟增加时配置工作程序延迟配置文件。

了解工作程序延迟配置文件

工作程序延迟配置文件包含四个不同类别的精心调整的参数。实现这些值的四个参数是node-status-update-frequencynode-monitor-grace-perioddefault-not-ready-toleration-secondsdefault-unreachable-toleration-seconds。这些参数可以使用允许您控制集群对延迟问题的反应的值,而无需使用手动方法确定最佳值。

不支持手动设置这些参数。参数设置不正确会对集群稳定性产生不利影响。

所有工作程序延迟配置文件都配置以下参数

node-status-update-frequency

指定kubelet多久向API服务器发布一次节点状态。

node-monitor-grace-period

指定Kubernetes控制器管理器在将节点标记为不健康并向节点添加node.kubernetes.io/not-readynode.kubernetes.io/unreachable污点之前等待kubelet更新的时间(以秒为单位)。

default-not-ready-toleration-seconds

指定将节点标记为不健康后,Kube API Server 运算符在驱逐该节点上的 Pod 之前等待的时间(以秒为单位)。

default-unreachable-toleration-seconds

指定将节点标记为不可达后,Kube API Server 运算符在驱逐该节点上的 Pod 之前等待的时间(以秒为单位)。

以下运算符监控工作节点延迟配置文件的变化并做出相应的响应

  • 机器配置运算符 (MCO) 更新工作节点上的node-status-update-frequency参数。

  • Kubernetes 控制器管理器更新控制平面节点上的node-monitor-grace-period参数。

  • Kubernetes API Server 运算符更新控制平面节点上的default-not-ready-toleration-secondsdefault-unreachable-toleration-seconds参数。

虽然默认配置在大多数情况下都能正常工作,但 OpenShift Container Platform 还提供了另外两种工作节点延迟配置文件,用于网络延迟高于平常的情况。以下各节将介绍这三种工作节点延迟配置文件。

默认工作节点延迟配置文件

使用Default配置文件时,每个Kubelet都会每 10 秒更新一次其状态 (node-status-update-frequency)。Kube Controller Manager每 5 秒检查一次Kubelet的状态。

Kubernetes 控制器管理器等待 40 秒 (node-monitor-grace-period) 以获取来自Kubelet的状态更新,然后再将Kubelet视为不健康。如果 Kubernetes 控制器管理器没有收到任何状态更新,它就会为该节点添加node.kubernetes.io/not-readynode.kubernetes.io/unreachable污点,并驱逐该节点上的 Pod。

如果 Pod 位于具有NoExecute污点的节点上,则 Pod 将根据tolerationSeconds运行。如果节点没有污点,则将在 300 秒内 (Kube API Serverdefault-not-ready-toleration-secondsdefault-unreachable-toleration-seconds设置) 被驱逐。

配置文件 组件 参数

默认

kubelet

node-status-update-frequency

10s

Kubelet 控制器管理器

node-monitor-grace-period

40s

Kubernetes API Server 运算符

default-not-ready-toleration-seconds

300s

Kubernetes API Server 运算符

default-unreachable-toleration-seconds

300s

中等工作节点延迟配置文件

如果网络延迟略高于平常,请使用MediumUpdateAverageReaction配置文件。

MediumUpdateAverageReaction配置文件将 kubelet 更新频率降低到 20 秒,并将 Kubernetes 控制器管理器等待这些更新的时间段更改为 2 分钟。该节点上 Pod 的驱逐时间段减少到 60 秒。如果 Pod 具有tolerationSeconds参数,则驱逐将等待该参数指定的时间段。

Kubernetes 控制器管理器将等待 2 分钟才能将节点视为不健康。再过一分钟,驱逐过程就会开始。

配置文件 组件 参数

MediumUpdateAverageReaction

kubelet

node-status-update-frequency

20s

Kubelet 控制器管理器

node-monitor-grace-period

2m

Kubernetes API Server 运算符

default-not-ready-toleration-seconds

60s

Kubernetes API Server 运算符

default-unreachable-toleration-seconds

60s

低工作节点延迟配置文件

如果网络延迟极高,请使用LowUpdateSlowReaction配置文件。

LowUpdateSlowReaction配置文件将 kubelet 更新频率降低到 1 分钟,并将 Kubernetes 控制器管理器等待这些更新的时间段更改为 5 分钟。该节点上 Pod 的驱逐时间段减少到 60 秒。如果 Pod 具有tolerationSeconds参数,则驱逐将等待该参数指定的时间段。

Kubernetes 控制器管理器将等待 5 分钟才能将节点视为不健康。再过一分钟,驱逐过程就会开始。

配置文件 组件 参数

LowUpdateSlowReaction

kubelet

node-status-update-frequency

1m

Kubelet 控制器管理器

node-monitor-grace-period

5m

Kubernetes API Server 运算符

default-not-ready-toleration-seconds

60s

Kubernetes API Server 运算符

default-unreachable-toleration-seconds

60s

使用和更改工作节点延迟配置文件

要更改工作节点延迟配置文件以处理网络延迟,请编辑node.config对象以添加配置文件的名称。随着延迟的增加或减少,您可以随时更改配置文件。

您必须一次移动一个工作节点延迟配置文件。例如,您不能直接从Default配置文件移动到LowUpdateSlowReaction工作节点延迟配置文件。您必须先从Default工作节点延迟配置文件移动到MediumUpdateAverageReaction配置文件,然后再移动到LowUpdateSlowReaction。同样,当返回到Default配置文件时,您必须先从低配置文件移动到中配置文件,然后再移动到Default

您还可以在安装 OpenShift Container Platform 集群时配置工作节点延迟配置文件。

步骤

要从默认工作节点延迟配置文件移动

  1. 移动到中等工作节点延迟配置文件

    1. 编辑node.config对象

      $ oc edit nodes.config/cluster
    2. 添加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 指定中等工作节点延迟策略。

      在应用更改期间,将禁用每个工作节点上的调度。

  2. 可选:移动到低工作节点延迟配置文件

    1. 编辑node.config对象

      $ oc edit nodes.config/cluster
    2. 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 指定使用低工作节点延迟策略。

在应用更改期间,将禁用每个工作节点上的调度。

验证
  • 当所有节点都返回到Ready状态时,您可以使用以下命令查看 Kubernetes 控制器管理器以确保已应用该命令。

    $ 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参数设置为相应的值。