8.9. 使用 worker 延迟配置集提高高延迟环境中的集群稳定性

默认情况下,所有节点都会每 10 秒向 OpenShift Container Platform 集群中的 Kubernetes Controller Manager Operator(kube controller)发送心跳信号。如果集群没有从节点获得 heartbeat,OpenShift Container Platform 会使用几个默认机制进行响应。

例如,如果 Kubernetes Controller Manager Operator 在配置的时间后丢失与节点联系:

  1. 控制平面上的节点控制器将节点健康状况更新为 Unhealthy,并将节点 Ready 条件标记为 Unknown
  2. 因此,调度程序会停止将 pod 调度到该节点。
  3. 内部节点控制器添加了一个 node.kubernetes.io/unreachable 污点,对节点具有 NoExecute 效果,默认在五分钟后调度节点上的任何 pod 进行驱除。

如果您的网络容易出现延迟问题,尤其是在网络边缘中有节点时,此行为可能会造成问题。在某些情况下,Kubernetes Controller Manager Operator 可能会因为网络延迟而从健康的节点接收更新。然后,Kubernetes Controller Manager Operator 会从节点驱除 pod,即使节点健康。要避免这个问题,您可以使用 worker 延迟配置集调整 kubelet 和 Kubernetes Controller Manager Operator 在执行操作前等待状态更新的频率。这些调整有助于确保集群在控制平面和 worker 节点间网络延迟无法正常工作时,集群无法正常工作。

这些 worker 延迟配置集是预定义的三组参数,它们带有精心调优的值,可让您控制集群的反应延迟问题,而无需手动确定最佳值。

您可在安装集群时配置 worker 延迟配置集,或当您发现集群网络中的延迟增加时。

8.9.1. 了解 worker 延迟配置集

worker 延迟配置集包括了为 node-status-update-frequencynode-monitor-grace-perioddefault-not-ready-toleration-secondsdefault-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-readynode.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-secondsdefault-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-readynode.kubernetes.io/unreachable 污点标记节点,并驱除该节点上的 pod。如果该节点上的 pod 具有 NoExecute 容限,则 pod 将在 300 秒后被驱除。如果 pod 具有 tolerationSeconds 参数,则驱除会等待该参数指定的周期。

profile组件参数

Default(默认)

kubelet

node-status-update-frequency

10s

kubelet Controller Manager

node-monitor-grace-period

40s

Kubernetes API 服务器

default-not-ready-toleration-seconds

300s

Kubernetes API 服务器

default-unreachable-toleration-seconds

300s

中型 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-frequency

20s

kubelet Controller Manager

node-monitor-grace-period

2m

Kubernetes API 服务器

default-not-ready-toleration-seconds

60s

Kubernetes API 服务器

default-unreachable-toleration-seconds

60s

低 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-frequency

1m

kubelet Controller Manager

node-monitor-grace-period

5m

Kubernetes API 服务器

default-not-ready-toleration-seconds

60s

Kubernetes API 服务器

default-unreachable-toleration-seconds

60s

8.9.2. 使用 worker 延迟配置集

要实现 worker 延迟配置集来处理网络延迟,请编辑 node.config 对象以添加配置集的名称。当延迟增加或减少时,您可以随时更改配置集。

您必须一次移动一个 worker 延迟配置集。例如,您无法直接从 Default 配置集移到 LowUpdateSlowReaction worker 延迟配置集。您必须首先从 default worker 延迟配置集移到 MediumUpdateAverageReaction 配置集,然后将其移到 LowUpdateSlowReaction。同样,当返回到默认配置集时,必须首先从低配置集移到中型配置集,然后再进入默认值。

注意

您还可以在安装 OpenShift Container Platform 集群时配置 worker 延迟配置集。

流程

从默认的 worker 延迟配置集移动:

  1. 移到中型 worker 延迟配置集:

    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
      指定中型 worker 延迟策略。

      随着更改被应用,每个 worker 节点上的调度都会被禁用。

  2. 可选:移到低 worker 延迟配置集:

    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
      指定使用低 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 参数设置为适当的值。