第9章 ネットワークエッジ上にあるリモートワーカーノード
9.1. ネットワークエッジでのリモートワーカーノードの使用 リンクのコピーリンクがクリップボードにコピーされました!
OpenShift Container Platform クラスターは、ネットワークのエッジに配置されたノード (リモートワーカーノード と呼ばれる) を使用して設定できます。リモートワーカーノードを備えた一般的なクラスターは、オンプレミスの制御プレーンとワーカーノードと、クラスターに接続する他の場所にあるワーカーノードを組み合わせたものです。
このトピックは、リモートワーカーノードの使用のベストプラクティスに関するガイダンスを提供することを目的としており、特定の設定に関する詳細情報は含まれません。
リモートワーカーノードを使用したデプロイメントパターンに関しては、小売、製造、政府など、さまざまな業界のユースケースがいくつもあります。たとえば、リモートワーカーノードを Kubernetes ゾーン に結合することで、プロジェクトとワークロードを分離して隔離できます。
ただし、リモートワーカーノードを使用すると、高いレイテンシーの発生や、ネットワーク接続が断続的に失われるなどの問題が発生する可能性があります。リモートワーカーノードを含むクラスターの課題には、以下のようなものがあります。
- ネットワーク分離: OpenShift Container Platform コントロールプレーンとリモートワーカーノードは、相互に通信できる必要があります。コントロールプレーンとリモートワーカーノードの間に距離があるため、ネットワークの問題が発生すると、この通信が妨げられる可能性があります。OpenShift Container Platform がネットワークの分離にどのように対応するか、およびクラスターへの影響を軽減する方法は、リモートワーカーノードを使用したネットワークの分離 を参照してください。
- 停電: コントロールプレーンとリモートワーカーノードは別々の場所にあるため、リモートの場所での停電、またはそれぞれの場所からの任意の場所での停電により、クラスターに悪影響を及ぼす可能性があります。ノードの電力損失に OpenShift Container Platform がどのように対応するか、およびクラスターへの影響を軽減する方法は、リモートワーカーノードの電力損失 を参照してください。
- 急激な高レイテンシーまたは一時的なスループットの低下: ネットワークの場合と同様に、クラスターとリモートワーカーノード間のネットワーク状態の変更は、クラスターに悪影響を及ぼす可能性があります。OpenShift Container Platform は、レイテンシーの問題に対するクラスターの反応を制御できる複数の ワーカーレイテンシープロファイル を提供します。
リモートワーカーノードを含むクラスターを計画する場合には、以下の制限に注意してください。
- OpenShift Container Platform は、オンプレミスクラスターが使用するクラウドプロバイダー以外のクラウドプロバイダーを使用するリモートワーカーノードをサポートしません。
- ワークロードを 1 つの Kubernetes ゾーンから別の Kubernetes ゾーンに移動すると、(特定のタイプのメモリーが異なるゾーンで利用できないなどの) システムや環境に関する課題により、問題が発生する可能性があります。
- プロキシーおよびファイアウォールでは、このドキュメントでは扱われていない追加的制限が出てくる可能性があります。このような制限に対処する方法は、ファイアウォールの設定 など、関連する OpenShift Container Platform ドキュメントを参照してください。
- コントロールプレーンとネットワークエッジノード間の L2/L3 レベルのネットワーク接続を設定および維持する必要があります。
9.1.1. リモートワーカーノードの追加 リンクのコピーリンクがクリップボードにコピーされました!
リモートワーカーノードをクラスターに追加する際に考慮すべき事項について理解を深めるには、以下の情報を参照してください。
- コントロールプレーンとすべてのリモートワーカーノードの間でトラフィックをルーティングするには、ルートまたはデフォルトゲートウェイが配置されていることを確認する必要があります。
- Ingress VIP をコントロールプレーンに配置する必要があります。
- user-provisioned infrastructure を使用してリモートワーカーノードを追加する方法は、他のワーカーノードを追加する方法と同じです。
-
インストール時にインストーラーがプロビジョニングしたクラスターにリモートワーカーノードを追加するには、インストール前に
install-config.yamlファイルで各ワーカーノードのサブネットを指定します。DHCP サーバーに追加の設定は必要ありません。リモートワーカーノードはローカルプロビジョニングネットワークにアクセスできないため、仮想メディアを使用する必要があります。 -
プロビジョニングネットワークを使用してデプロイされたインストーラープロビジョニングクラスターにリモートワーカーノードを追加するには、
install-config.yamlファイルでvirtualMediaViaExternalNetworkフラグがtrueに設定されていることを確認してください。これにより、仮想メディアを使用してノードが追加されます。リモートワーカーノードは、ローカルプロビジョニングネットワークにアクセスできません。PXE ではなく、仮想メディアを使用してデプロイする必要があります。さらに、DHCP サーバー内のリモートワーカーノードの各グループとコントロールプレーンノードの各サブネットを指定します。
9.1.2. リモートワーカーノードによるネットワーク分離 リンクのコピーリンクがクリップボードにコピーされました!
以下の情報を確認することで、OpenShift Container Platform がリモートノードとのネットワーク接続の喪失にどのように対応するか、また接続喪失に伴う問題をどのように軽減できるかを理解できます。
OpenShift Container Platform は、ネットワークパーティションやその他の中断に対して回復性を持たせるように設計されています。ソフトウェアのアップグレードの中断、ネットワーク分割、ルーティングの問題など、より一般的な中断の一部を軽減することができます。軽減策には、リモートワーカーノードの Pod が正しい CPU およびメモリーリソースの量を要求すること、適切なレプリケーションポリシーの設定、ゾーン間の冗長性の使用、ワークロードでの Pod の Disruption Budget の使用などが含まれます。
すべてのノードは、10 秒ごとに OpenShift Container Platform クラスターの Kubernetes Controller Manager Operator (kube コントローラー) にハートビートを送信します。クラスターがノードからハートビートを受信しない場合、OpenShift Container Platform は複数のデフォルトメカニズムを使用して応答します。
設定した期間後に kube コントローラーのノードとの接続が解除された場合、コントロールプレーンのノードコントローラーはノードの正常性を Unhealthy に更新し、ノードの Ready 状態を Unknown とマークします。この操作に応じて、スケジューラーはそのノードへの Pod のスケジューリングを停止します。オンプレミスノードコントローラーは、effect が NoExecute の node.kubernetes.io/unreachable taint をノードに追加し、デフォルトで 5 分後に、退避用にノード上で Pod をスケジュールします。
Deployment オブジェクト、または StatefulSet オブジェクトなどのワークロードコントローラーが、正常でないノードの Pod にトラフィックを転送し、他のノードがクラスターに到達できる場合、OpenShift Container Platform はトラフィックをノードの Pod から遠ざけます。クラスターに到達できないノードは、新しいトラフィックルーティングでは更新されません。その結果、それらのノードのワークロードは、正常でないノードに到達しようとします。
接続喪失の影響を軽減するには、以下のいずれかのストラテジーを用いることができます。
- デーモンセットを使用して、taint を許容する Pod を作成する。
- ノードがダウンした場合に自動的に再起動する静的 Pod を使用する。
- Kubernetes ゾーンを使用して Pod の退避を制御する。
- Pod の toleration を設定して、Pod 退避の発生を遅延または回避します。
- kubelet を設定して、ノードを異常とマークするタイミングを制御する。
9.1.3. リモートワーカーノードの電源損失 リンクのコピーリンクがクリップボードにコピーされました!
以下の情報を確認することで、OpenShift Container Platform がリモートノードの停電にどのように対応するか、また停電に伴う問題をどのように軽減できるかを理解できます。
リモートワーカーノードの電源がなくなったり、強制的な再起動を行う場合、OpenShift Container Platform は複数のデフォルトメカニズムを使用して応答します。
設定した期間後に Kubernetes Controller Manager Operator (kube コントローラー) のノードとの接続が解除された場合、コントロールプレーンはノードの正常性を Unhealthy に更新し、ノードの Ready 状態を Unknown とマークします。この操作に応じて、スケジューラーはそのノードへの Pod のスケジューリングを停止します。オンプレミスノードコントローラーは、effect が NoExecute の node.kubernetes.io/unreachable taint をノードに追加し、デフォルトで 5 分後に、退避用にノード上で Pod をスケジュールします。
ノードでは、ノードが電源を回復し、コントロールプレーンに再接続する際に、Pod を再起動する必要があります。
再起動時に Pod をすぐに再起動する必要がある場合は、静的 Pod を使用します。
ノードの再起動後に kubelet も再起動し、ノードにスケジュールされた Pod の再起動を試行します。コントロールプレーンへの接続にデフォルトの 5 分よりも長い時間がかかる場合、コントロールプレーンはノードの正常性を更新して node.kubernetes.io/unreachable taint を削除することができません。ノードで、kubelet は実行中の Pod をすべて終了します。これらの条件がクリアされると、スケジューラーはそのノードへの Pod のスケジューリングを開始できます。
以下の方法で、電源損失の影響を軽減できます。
- デーモンセットを使用して、taint を許容する Pod を作成する。
- ノードの再起動時に自動的に再起動する静的 Pod を使用する。
- Pod の toleration を設定して、Pod 退避の発生を遅延または回避します。
- ノードコントローラーがノードを異常とマークするタイミングを制御するように kubelet を設定します。
9.1.4. リモートワーカーへのレイテンシーの急上昇またはスループットの一時的な低下 リンクのコピーリンクがクリップボードにコピーされました!
クラスター管理者としてプラットフォーム検証のためにレイテンシーテストを実施した場合、高レイテンシーの場合でも安定性を確保するためにクラスターの動作を調整する必要があることに気づくかもしれません。
クラスター管理者として変更する必要があるのは、ファイルに記録されている 1 つのパラメーターのみです。このパラメーターは、監視プロセスがステータスを読み取り、クラスターの状態を解釈する方法に影響を与える 4 つのパラメーターを制御します。1 つのパラメーターのみを変更し、サポートしやすく簡単な方法でクラスターをチューニングできます。
Kubelet プロセスは、クラスターの健全性を監視する上での出発点です。Kubelet は、OpenShift Container Platform クラスター内のすべてのノードのステータス値を設定します。Kubernetes コントローラーマネージャー (kube controller) は、デフォルトで 10 秒ごとにステータス値を読み取ります。ノードのステータス値を読み取ることができない場合、設定期間が経過すると、kube controller とそのノードとの接続が失われます。デフォルトの動作は次のとおりです。
-
コントロールプレーン上のノードコントローラーは、ノードの状態を
不健康に更新し、ノードの準備完了状態を不明とマークします。 - この操作に応じて、スケジューラーはそのノードへの Pod のスケジューリングを停止します。
-
ノードライフサイクルコントローラーが、
NoExecuteeffect を持つnode.kubernetes.io/unreachabletaint をノードに追加し、デフォルトでノード上のすべての Pod を 5 分後に退避するようにスケジュールします。
この動作は、ネットワークが遅延の問題を起こしやすい場合、特にネットワークエッジにノードがある場合に問題が発生する可能性があります。場合によっては、ネットワークの遅延が原因で、Kubernetes コントローラーマネージャーが正常なノードから更新を受信できないことがあります。Kubelet は、ノードが正常であっても、ノードから Pod を退避させます。
この問題を回避するには、ワーカーレイテンシープロファイル を使用して、Kubelet と Kubernetes コントローラーマネージャーがアクションを実行する前にステータスの更新を待機する頻度を調整できます。これらの調整により、コントロールプレーンとワーカーノード間のネットワーク遅延が最適でない場合に、クラスターが適切に動作するようになります。
これらのワーカーレイテンシープロファイルには、3 つのパラメーターセットが含まれています。パラメーターは、遅延の増加に対するクラスターの反応を制御するように、慎重に調整された値で事前定義されています。試験により手作業で最良の値を見つける必要はありません。
クラスターのインストール時、またはクラスターネットワークのレイテンシーの増加に気付いたときはいつでも、ワーカーレイテンシープロファイルを設定できます。
9.1.5. リモートワーカーノードストラテジー リンクのコピーリンクがクリップボードにコピーされました!
リモートワーカーノードにおける電力供給や接続の喪失に関連する問題を軽減する方法を理解するには、以下の情報を参照してください。
リモートワーカーノードを使用する場合は、アプリケーションを実行するために使用するオブジェクトを考慮してください。
ネットワークの問題や停電が発生した場合の動作に応じて、デーモンセットまたは静的 Pod を使用できます。さらに、Kubernetes ゾーンおよび toleration を使用して、コントロールプレーンがリモートワーカーノードに到達できない場合に Pod 退避を制御したり、回避したりできます。
- デーモンセット
デーモンセットは、以下の理由により、リモートワーカーノードでの Pod の管理に最適な方法です。
-
デーモンセットは通常、動作の再スケジュールを必要としません。ノードがクラスターから切断される場合、ノードの Pod は実行を継続できます。OpenShift Container Platform はデーモンセット Pod の状態を変更せず、Pod を最後に報告された状態のままにします。たとえば、デーモンセット Pod が
Running状態の際にノードが通信を停止する場合、Pod は実行し続けますが、これは OpenShift Container Platform によって実行されていることが想定されます。 デフォルトでは、デーモンセットの Pod は、次の例に示すように、
tolerationSeconds値のないnode.kubernetes.io/unreachableおよびnode.kubernetes.io/not-readytaint に対してNoExecuteトレランスを使用して作成されます。これらのデフォルト値により、コントロールプレーンがノードに到達できなくても、デーモンセット Pod が退避されることはありません。デフォルトでデーモンセット Pod に toleration を追加
tolerations: - key: node.kubernetes.io/not-ready operator: Exists effect: NoExecute - key: node.kubernetes.io/unreachable operator: Exists effect: NoExecute - key: node.kubernetes.io/disk-pressure operator: Exists effect: NoSchedule - key: node.kubernetes.io/memory-pressure operator: Exists effect: NoSchedule - key: node.kubernetes.io/pid-pressure operator: Exists effect: NoSchedule - key: node.kubernetes.io/unschedulable operator: Exists effect: NoSchedule- デーモンセットは、ワークロードが一致するワーカーノードで実行されるように、ラベルを使用することができます。
- OpenShift Container Platform サービスエンドポイントを使用してデーモンセット Pod の負荷を分散できます。
注記デーモンセットは、OpenShift Container Platform がノードに到達できない場合、ノードの再起動後に Pod をスケジュールしません。
-
デーモンセットは通常、動作の再スケジュールを必要としません。ノードがクラスターから切断される場合、ノードの Pod は実行を継続できます。OpenShift Container Platform はデーモンセット Pod の状態を変更せず、Pod を最後に報告された状態のままにします。たとえば、デーモンセット Pod が
- 静的 Pod
ノードが再起動した場合 (停電後など) に Pod を再起動したい場合は、静的 Pod を使用すると良いでしょう。ノード上の kubelet は、ノードの再起動時に静的 Pod を自動的に再起動します。
注記静的 Pod はシークレットおよび設定マップを使用できません。
- Kubernetes ゾーン
Kubernetes ゾーン は、速度を落としたり、または場合によっては Pod 退避を完全に停止したりすることができます。
コントロールプレーンがノードに到達できない場合、デフォルトでノードコントローラーは
node.kubernetes.io/unreachabletaint を適用し、1 秒あたり 0.1 ノードのレートで Pod を退避します。ただし、Kubernetes ゾーンを使用するクラスターでは、Pod 退避の動作が変更されます。ゾーンが完全に中断され、ゾーン内のすべてのノードの準備状態が
FalseまたはUnknownになっている場合、コントロールプレーンはそのゾーン内のノードにnode.kubernetes.io/unreachabletaint を適用しません。(ノードの 55% 超が
FalseまたはUnknown状態である) 部分的に中断されたゾーンの場合、Pod の退避レートは 1 秒あたり 0.01 ノードに低減されます。50 未満の小規模なクラスターにあるノードに taint は付けられません。これらの動作を有効にするには、クラスターに 4 つ以上のゾーンが必要です。ノード仕様に
topology.kubernetes.io/regionラベルを適用して、ノードを特定のゾーンに割り当てます。Kubernetes ゾーンのノードラベルの例
kind: Node apiVersion: v1 metadata: labels: topology.kubernetes.io/region=east
- Kubelet 設定オブジェクト
kubelet が各ノードの状態をチェックする時間を調整することができます。
オンプレミスノードコントローラーがノードを
UnhealthyまたはUnreachable状態にマークするタイミングに影響を与える間隔を設定するには、node-status-update-frequencyおよびnode-status-report-frequencyパラメーターが含まれるKubeletConfigオブジェクトを作成します。各ノードの kubelet は
node-status-update-frequency設定で定義されたノードのステータスを判別し、node-status-report-frequency設定に基づいてそのステータスをクラスターに報告します。デフォルトで、kubelet は 10 秒ごとに Pod のステータスを判別し、毎分ごとにステータスを報告します。ただし、ノードの状態が変更されると、kubelet は変更をクラスターに即時に報告します。OpenShift Container Platform は、Node Lease フィーチャーゲートが有効にされている場合にのみ、node-status-report-frequency設定を使用します。これは OpenShift Container Platform クラスターのデフォルト状態です。Node Lease フィーチャーゲートが無効になっている場合、ノードはnode-status-update-frequency設定に基づいてノードのステータスを報告します。kubelet 設定の例
apiVersion: machineconfiguration.openshift.io/v1 kind: KubeletConfig metadata: name: disable-cpu-units spec: machineConfigPoolSelector: matchLabels: machineconfiguration.openshift.io/role: worker kubeletConfig: node-status-update-frequency: - "10s" node-status-report-frequency: - "1m"ここでは、以下のようになります。
spec.machineConfigPoolSelector.matchLabels.machineconfiguration.openshift.io/role-
MachineConfigオブジェクトのラベルを使用して、このKubeletConfigオブジェクトが適用されるノードタイプのタイプを指定します。 spec.kubeletConfig.node-status-update-frequency-
この
MachineConfigオブジェクトに関連付けられたノードの状態を kubelet がチェックする頻度を指定します。デフォルト値は10sです。このデフォルト値を変更すると、node-status-report-frequencyの値は同じ値に変更されます。 spec.kubeletConfig.node-status-report-frequency-
この
MachineConfigオブジェクトに関連付けられたノードの状態を kubelet が報告する頻度を指定します。デフォルト値は1mです。
node-status-update-frequencyパラメーターは、node-monitor-grace-periodパラメーターと連携して機能します。node-monitor-grace-periodパラメーターは、コントローラーマネージャーがハートビートを受信しない場合に、このMachineConfigオブジェクトに関連付けられたノードがUnhealthyとマークされた後に、OpenShift Container Platform が待機する時間を指定します。この待機時間後も、ノード上のワークロードは引き続き実行されます。node-monitor-grace-periodの期限が切れた後にリモートワーカーノードがクラスターに再度加わる場合、Pod は実行を継続します。新規 Pod をノードにスケジュールできます。node-monitor-grace-periodの間隔は40sです。node-status-update-frequencyの値は、node-monitor-grace-periodの値よりも低い値である必要があります。注記node-monitor-grace-periodパラメーターを変更することはサポートされていません。
- Tolerations
オンプレミスノードコントローラーが、effect が
NoExecuteのnode.kubernetes.io/unreachabletaint を到達できないノードに追加する場合、Pod toleration を使用して effect を軽減することができます。effect が
NoExecuteの taint は、ノードですでに実行中の Pod に以下のような影響を及ぼします。- taint を容認しない Pod は、退避のキューに置かれます。
-
toleration の仕様に
tolerationSeconds値を指定せずに taint を許容する Pod は、永久にバインドされたままになります。 指定された
tolerationSeconds値で taint を許容する Pod は、指定された期間バインドされます。時間が経過すると、Pod は退避のキューに置かれます。注記toleration が明示的に設定されていない限り、Kubernetes は
tolerationSeconds=300を使用して、node.kubernetes.io/not-readyおよびnode.kubernetes.io/unreachableに対する toleration を自動的に追加します。これは、これらの taint のいずれかが検出された場合、Pod は 5 分間バインドされたままになることを意味します。effect が
NoExecuteのnode.kubernetes.io/unreachabletaint およびnode.kubernetes.io/not-readytaint で Pod の toleration を設定し、Pod の退避を遅延したり回避したりできます。Pod 仕様での toleration の例
... tolerations: - key: "node.kubernetes.io/unreachable" operator: "Exists" effect: "NoExecute" - key: "node.kubernetes.io/not-ready" operator: "Exists" effect: "NoExecute" tolerationSeconds: 600 ...-
最初の例では、
tolerationSeconds を指定しないNoExecute効果により、コントロールプレーンがノードに到達できない場合、Pod が永久に残ります。 -
2 番目の例では、
tolerationSeconds: 600 を指定したNoExecute効果により、コントロールプレーンがノードをUnhealthyとマークした場合、Pod は 10 分間存続します。独自のtolerationSeconds値を指定できます。
-
最初の例では、
- OpenShift Container Platform オブジェクトの他のタイプ
レプリカセット、デプロイメント、およびレプリケーションコントローラーを使用できます。スケジューラーは、ノードが 5 分間切断された後、これらの Pod を他のノードに再スケジュールできます。他のノードへの再スケジュールは、管理者が特定数の Pod を確実に実行し、アクセスできるようにする REST API などの一部のワークロードにとって有益です。
注記リモートワーカーノードを使用する際に、リモートワーカーノードが特定の機能用に予約されることが意図されている場合、異なるノードでの Pod の再スケジュールは許容されない可能性があります。
ステートフルセット は、停止時に再起動されません。Pod は、コントロールプレーンが Pod の終了を認識できるまで、
terminating状態のままになります。同じタイプの永続ストレージにアクセスできないノードにスケジュールしないようにするため、OpenShift Container Platform では、ネットワークの分離時に永続ボリュームを必要とする Pod を他のゾーンに移行することはできません。