ASM ゲートウェイ Pod に専用ノードを割り当てることで、ゲートウェイトラフィックをアプリケーションワークロードから分離し、ゲートウェイの可用性を向上させます。ノードにラベルを付け、他の Pod を排除するために Taint を適用し、ノードアフィニティと Toleration を使用して ASM ゲートウェイを構成することで、Pod がそのノードのみに配置されるようにします。
仕組み
3 つの Kubernetes スケジューリングメカニズムが連携して、ゲートウェイ Pod を専用ノードに固定します。
| メカニズム | 役割 |
|---|---|
| ノードラベル | ゲートウェイ用に指定されたノードを識別します |
| テイント | 一致する Toleration を持たないすべての Pod を排除し、非ゲートウェイワークロードを専用ノードから遠ざけます |
| ノードアフィニティ | 特定のラベルを持つノードにゲートウェイ Pod を引き寄せます |
| 許容設定 | Taint されたノードにゲートウェイ Pod をスケジュールできるようにします |
Taint と Toleration は連携して、システムが不適切なノードに Pod をスケジュールするのを防ぎます。1 つ以上の Taint をノードに適用できます。
Pod が特定の Taint を許容しない場合、一致する Taint を持つノードはその Pod を受け入れません。
Pod が特定の Taint を許容する場合、その Pod は一致する Taint を持つノードにスケジュールされる可能性がありますが、必須ではありません。
この設定により、非ゲートウェイ Pod は専用ノードから離れ (Taint によって強制されます)、ゲートウェイ Pod はそれらのノードのみに配置されます (ノードアフィニティによって強制されます)。
前提条件
ステップ 1: ターゲットノードのラベル付け
ラベルは、ゲートウェイ Pod 用に予約されているノードを識別します。
クラスター内のすべてのノードをリスト表示します。
kubectl get nodes出力は以下に似ています:
NAME STATUS ROLES AGE VERSION node1 Ready <none> 30d v1.24.6 node2 Ready <none> 30d v1.24.6 node3 Ready <none> 30d v1.24.6ゲートウェイ Pod をホストするノードにラベルを追加します。
# Syntax kubectl label nodes <node-name> <label-key>=<label-value> # Example kubectl label nodes node1 mykey4pod=asmgateway出力は次のようになります。
node/node1 labeled
ステップ 2: ノードの Taint
Taint は、一致する Toleration を持たない Pod がノードにスケジュールされるのを防ぎます。これにより、アプリケーションワークロードが専用ゲートウェイノードから遠ざけられます。
次のコマンドを実行してノードに Taint を適用します。
kubectl taint nodes node1 mykey=myvalue:NoSchedule出力は次のようになります。
node/node1 taintedNoSchedule 効果は、キー mykey、値 myvalue、および効果 NoSchedule に一致する Toleration を持つ Pod のみが node1 にスケジュールできることを意味します。
ステップ 3: ASM ゲートウェイでのノードアフィニティと Toleration の構成
ASM コンソール にログインします。
左側のナビゲーションウィンドウで、Service Mesh > Mesh 管理 を選択します。
[メッシュ管理] ページで、ASM インスタンスの名前をクリックします。
左側のナビゲーションウィンドウで、[ASM ゲートウェイ] > [Ingress ゲートウェイ] を選択します。
[Ingress ゲートウェイ] ページで、対象のゲートウェイを見つけ、[YAML] をクリックします。
[編集] ダイアログボックスで、次の構成を
specフィールドに追加し、[OK] をクリックします。説明ヒント: 値に関係なく Taint に一致させるには、
operator: "Exists"をoperator: "Equal"の代わりに使用し、valueフィールドを省略します。フィールド 値 説明 nodeAffinityrequiredDuringSchedulingIgnoredDuringExecutionスケジューラは、 mykey4pod=asmgatewayというラベルが付与されたノード上にゲートウェイ Pod を配置する必要がありますtolerations.operatorEqualステップ 2 の Taint と一致し、ゲートウェイ Pod がその Taint 付きノードにスケジュールされることを許可します。 affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: mykey4pod operator: In values: - asmgateway tolerations: - key: "mykey" operator: "Equal" value: "myvalue" effect: "NoSchedule"
結果の確認
ゲートウェイ Pod が再起動した後、期待されるノードで実行中であることを確認します。
オプション 1: ACK コンソール
ACK コンソール にログインします。
左側のナビゲーションウィンドウで、[Clusters] をクリックします。
[クラスター] ページで、クラスターの名前をクリックします。
左側のナビゲーションウィンドウで、[ワークロード] > [ポッド] を選択します。
[ポッド] ページで、[名前空間] ドロップダウンリストから [istio-system] を選択します。
ゲートウェイ Pod を特定し、[ノード] 列に目的のノード (例:
node1) が表示されていることを確認してください。
オプション 2: kubectl
次のコマンドを実行します。
kubectl get pods -n istio-system -o wide | grep <gateway-name>出力は次のようになります。
ingressgateway-xxxx-yyyy 1/1 実行中 0 5m 10.0.1.12 node1 <none> <none>[ノード] 列に node1 が表示されている場合、ゲートウェイ Pod は専用ノードにスケジュールされます。
次のステップ
高可用性のために複数の専用ノードにゲートウェイ Pod をスケジュールするには、追加のノードにラベルを付けて Taint を適用し、それらのラベルを
matchExpressions値リストに追加します。Kubernetes スケジューリングの詳細については、Kubernetes ドキュメントの「Taints and Tolerations」および「Assigning Pods to Nodes」をご参照ください。