7.8. ワーカーレイテンシープロファイルを使用したレイテンシーの高い環境でのクラスターの安定性の向上

すべてのノードは、デフォルトで 10 秒ごとに OpenShift Container Platform クラスターの Kubernetes Controller Manager Operator (kube コントローラー) にハートビートを送信します。クラスターがノードからハートビートを受信しない場合、OpenShift Container Platform は複数のデフォルトメカニズムを使用して応答します。

たとえば、Kubernetes Controller Manager Operator が設定された期間後にノードとの接続を失う場合:

  1. コントロールプレーンのノードコントローラーはノードの正常性を Unhealthy に更新し、ノードの Ready 状態を Unknown とマークします。
  2. この操作に応じて、スケジューラーはそのノードへの Pod のスケジューリングを停止します。
  3. オンプレミスノードコントローラーは、effect が NoExecutenode.kubernetes.io/unreachable テイントをノードに追加し、デフォルトで 5 分後に、エビクション用にノード上で Pod をスケジュールします。

この動作は、ネットワークが遅延の問題を起こしやすい場合、特にネットワークエッジにノードがある場合に問題が発生する可能性があります。Kubernetes Controller Manager Operator は、ネットワークの遅延により、健全なノードからの更新を受信できない場合があります。次に、Kubernetes Controller Manager Operator は、ノードが正常な場合でも Pod をノードからエビクトしました。この問題を回避するには、ワーカーレイテンシープロファイル を使用して kubelet および Kubernetes Controller Manager Operator がステータスの更新を待機する頻度を調節してからアクションを実行することができます。これらの調整により、コントロールプレーンとワーカーノード間のネットワーク遅延が最適でない場合に、クラスターが適切に動作するようになります。

これらのワーカーレイテンシープロファイルは、慎重に調整された値であらかじめ定義された 3 つのパラメーターセットで、最適な値を手動で決定する必要なく、レイテンシーの問題に対するクラスターの反応を制御することができます。

クラスターのインストール時、またはクラスターネットワークのレイテンシーの増加に気付いたときはいつでも、ワーカーレイテンシープロファイルを設定できます。

7.8.1. ワーカーレイテンシープロファイルを理解する

ワーカー遅延プロファイルは、node-status-update-frequencynode-monitor-grace-perioddefault-not-ready-toleration-seconds、および default-unreachable-toleration-seconds パラメーターに対して慎重に調整された値の複数のセットです。これらのパラメーターを使用すると、最適な値を手動で決定しなくても、レイテンシーの問題に対するクラスターの反応を制御できます。

すべてのワーカーレイテンシープロファイルは、次のパラメーターを設定します。

  • 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 taint をノードに追加する前に、kubelet からの更新を待機する時間を秒単位で指定します。
  • default-not-ready-toleration-seconds。ノードを異常とマークした後、KubernetesControllerManagerOperator がそのノードから Pod を削除する前に待機する時間を秒単位で指定します。
  • default-unreachable-toleration-seconds。ノードに到達不能をマークした後、Kubernetes Controller Manager Operator がそのノードから Pod を削除する前に待機する時間を秒単位で指定します。
重要

node-monitor-grace-period パラメーターを手動で変更することはサポートされていません。

次の Operator は、ワーカーレイテンシープロファイルの変更を監視し、それに応じて対応します。

  • Machine Config Operator (MCO) は、ワーカーノードの node-status-update-frequency パラメーターを更新します。
  • Kubernetes Controller Manager Operator は、コントロールプレーンノードの node-monitor-grace-period パラメーターを更新します。
  • Kubernetes API Server Operator は、コントロールプレーンノードの default-not-ready-toleration-seconds および default-unreachable-toleration-seconds パラメーターを更新します。

ほとんどの場合、デフォルト設定が機能しますが、OpenShift Container Platform は、ネットワークで通常よりも高いレイテンシーが発生している状況に対して、他に 2 つのワーカーレイテンシープロファイルを提供します。次のセクションでは、3 つのワーカーレイテンシープロファイルについて説明します。

デフォルトのワーカーレイテンシープロファイル

Default プロファイルでは、各 kubelet はノードステータスを 10 秒ごとに Kubelet Controller Manager Operator (kube コントローラー) に報告します。Kubelet Controller ManagerOperator は、5 秒ごとに kubelet のステータスをチェックします。

Kubernetes Controller ManagerOperator は、ノードが異常であると見なす前に、ステータスが更新されるまで 40 秒待機します。ノードに node.kubernetes.io/not-ready または node.kubernetes.io/unreachable のマークを付け、そのノードの Pod を削除します。そのノードの Pod に NoExecute toleration がある場合、Pod は 300 秒で削除されます。Pod に tolerationSeconds パラメーターがある場合、エビクションはそのパラメーターで指定された期間待機します。

プロファイルコンポーネントパラメーター

デフォルト

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 秒に減らし、KubernetesControllerManagerOperator がそれらの更新を待機する期間を 2 分に変更します。そのノード上の Pod の Pod 排除期間は 60 秒に短縮されます。Pod に tolerationSeconds パラメーターがある場合、エビクションはそのパラメーターで指定された期間待機します。

Kubernetes Controller Manager Operator は、2 分間待機してノードの正常でないとみなします。別の 1 分間でエビクションプロセスが開始されます。

プロファイルコンポーネントパラメーター

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 Controller Manager Operator がそれらの更新が 5 分になるまで待機する期間を変更します。そのノード上の Pod の Pod 排除期間は 60 秒に短縮されます。Pod に tolerationSeconds パラメーターがある場合、エビクションはそのパラメーターで指定された期間待機します。

Kubernetes Controller Manager Operator は、5 分間待機してノードの正常でないとみなします。別の 1 分間でエビクションプロセスが開始されます。

プロファイルコンポーネントパラメーター

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

7.8.2. ワーカーレイテンシープロファイルの使用

ワーカーレイテンシープロファイルを実装してネットワークレイテンシーに対応するには、node.config オブジェクトを編集してプロファイルの名前を追加します。レイテンシーが増減すると、プロファイルをいつでも変更できます。

ワーカーレイテンシープロファイルは、一度に 1 つ移動する必要があります。たとえば、Default プロファイルから LowUpdateSlowReaction ワーカーレイテンシープロファイルに直接移動することはできません。最初に default のワーカーレイテンシープロファイルから MediumUpdateAverageReaction プロファイルに移動し、次に LowUpdateSlowReaction に移動する必要があります。同様に、デフォルトプロファイルに戻るときは、最初にロープロファイルからミディアムプロファイルに移動してから、デフォルトに移動する必要があります。

注記

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
      中規模のワーカーレイテンシーポリシーを指定します。

      変更が適用されると、各ワーカーノードでのスケジューリングは無効になります。

      全ノードが 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
      プロファイルが適用され、アクティブであることを指定します。
  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
      ワーカーの低レイテンシーポリシーの使用を指定します。

      変更が適用されると、各ワーカーノードでのスケジューリングは無効になります。

ロープロファイルをミディアムに変更するか、ミディアムをローに変更するには、node.config オブジェクトを編集し、spec.workerLatencyProfile パラメーターを適切な値に設定します。