トラフィックスパイクが Elastic Compute Service (ECS) ノードの処理能力を超える場合、ASM イングレスゲートウェイの Pod はオーバーフロー先を必要とします。Elastic Container Instance (ECI) によってバックアップされた仮想ノードへゲートウェイ Pod をスケジュールすることで、ノードのプロビジョニングやメンテナンスを伴わずに、Pod を自動的にサーバーレスインフラストラクチャへスケールできます。
通常の状態では、ゲートウェイ Pod はラベル付き ECS ノード上で実行されます。当該ノードのリソースが上限に達すると、Pod は仮想ノードを経由して ECI へオーバーフローします。この構成では、Kubernetes のスケジューリングプリミティブ(ノードアフィニティ、Taint、Toleration)を活用して、Pod の配置先を制御します。
ASM ゲートウェイが Serverless Kubernetes (ASK) クラスター上で実行されている場合は、Pod はデフォルトで ECI 上で実行されます。本トピックはスキップし、「イングレスゲートウェイサービスの作成」をご参照ください。
仕組み
この構成は、3 つの Kubernetes スケジューリングメカニズムを連携させて動作します:
| メカニズム | 役割 |
|---|---|
| Taint + Toleration | 仮想ノードには、ECI の誤った使用を防ぐためのデフォルトの virtual-kubelet.io/provider=alibabacloud:NoSchedule Taint が設定されています。ECS ノードには、ゲートウェイ Pod のみを許可するカスタム Taint を追加します。ゲートウェイ Pod は、この 2 つの Taint に対する Toleration を両方とも定義する必要があります。 |
| 必須ノードアフィニティ | Pod の配置先を「ラベル付き ECS ノード」と「仮想ノード」の 2 種類のノードに厳密に制限するハード制約です。関係のないノードへの配置は許可されません。 |
| 推奨ノードアフィニティ | 重み付けによるソフト制約です。ECS ノードには重み 80(強く推奨)、仮想ノードには重み 20(フォールバック)が設定されます。ECS に空き容量がある場合は Pod がそこに配置され、ECS が満杯になると Pod は ECI へオーバーフローします。 |
詳細については、Kubernetes ドキュメントの「Taints and Tolerations」および「Assigning Pods to Nodes」をご参照ください。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
Container Service for Kubernetes (ACK) クラスター(ACK Standard、ACK Pro、または ACK Dedicated)が ASM インスタンスに追加済み
ACK クラスター内に ack-virtual-node コンポーネントがデプロイ済み
ASM インスタンス内に イングレスゲートウェイがデプロイ済み
ゲートウェイの弾力的オーバーフローの構成
本プロシージャは、以下の 4 つの手順で構成されます:ゲートウェイ Pod 用に ECS ノードにラベルを付与、他のワークロードを除外するためにノードに Taint を設定、ゲートウェイ YAML にアフィニティルールおよび Toleration を構成、デプロイメントを検証します。
ステップ 1:対象ノードへのラベル付与
ゲートウェイ Pod をデフォルトで実行する ECS ノードにラベルを追加します。
クラスター内のノード名を取得します。
kubectl get nodes対象ノードにラベルを追加します:ステップ 1 で取得した実際のノード名を
<node-name>に置き換えてください。# 構文 kubectl label nodes <node-name> <label-key>=<label-value> # 例 kubectl label nodes node1 mykey4pod=asmgateway
ステップ 2:ノードへの Taint 設定
マッチする Toleration を持つ Pod のみがこのノード上で実行されるよう、カスタム Taint を追加します。
kubectl taint nodes node1 mykey=myvalue:NoScheduleこの Taint はキー mykey、値 myvalue、効果 NoSchedule を使用します。node1 へのスケジュールは、明示的にこの Taint を許容する Pod のみが可能です。
ステップ 3:ゲートウェイへのノードアフィニティおよび Toleration の追加
ゲートウェイ YAML を更新し、デフォルトではラベル付き ECS ノードへ Pod を配置し、ノードのリソースが上限に達した際に自動的に ECI へオーバーフローするようにします。
ASM コンソールにログインします。左側ナビゲーションウィンドウで、Service Mesh > Mesh Management を選択します。
Mesh Management ページで、ASM インスタンスの名前をクリックします。左側ナビゲーションウィンドウで、ASM Gateways > Ingress Gateway を選択します。
対象のゲートウェイを見つけ、YAML をクリックします。
編集 ダイアログボックスで、
specフィールドに以下の内容を追加し、OK をクリックします。下記の表では、スケジューリング動作について説明しています。重要matchExpressions内のラベルのキーと値のペアが、ステップ 1 で追加したラベルと一致すること、および Toleration のキーと値のペアが、ステップ 2 で追加した Taint と一致することを確認してください。不一致の場合、Pod は Pending 状態のままになります。フィールド 機能 preferredDuringSchedulingIgnoredDuringExecution相対的な重みによるソフトスケジューリングの優先順位を設定します。ECS ノード(重み 80)は ECI(重み 20)よりも強く推奨されます。ECS ノードに空き容量がある場合は Pod がそこに配置され、満杯になると仮想ノードを経由して ECI へオーバーフローします。 requiredDuringSchedulingIgnoredDuringExecutionハード制約を定義します。Pod は、カスタムラベル( mykey4pod=asmgateway)または仮想ノードラベル(type=virtual-kubelet)のいずれかに一致するノードでのみスケジュール可能です。これにより、関係のないノードへの配置が防止されます。tolerations[0]デフォルトの virtual-kubelet.io/provider=alibabacloud:NoScheduleTaint を許容することで、Pod が仮想ノード上で実行できるようになります。この Toleration がない場合、Pod は ECI を利用できません。tolerations[1]ステップ 2 で追加したカスタム Taint( mykey=myvalue:NoSchedule)と一致し、ラベル付き ECS ノード上で Pod を実行可能にします。affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - preference: matchExpressions: - key: type operator: In values: - virtual-kubelet weight: 20 - preference: matchExpressions: - key: mykey4pod operator: In values: - asmgateway weight: 80 requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: mykey4pod operator: In values: - asmgateway - matchExpressions: - key: type operator: In values: - virtual-kubelet tolerations: - effect: NoSchedule key: virtual-kubelet.io/provider operator: Equal value: alibabacloud - effect: NoSchedule key: mykey operator: Equal value: myvalue
ステップ 4:デプロイメントの検証
ゲートウェイ Pod が期待されるノード上で実行されていることを確認します。
ACK コンソールにログインします。左側ナビゲーションウィンドウで、Clusters をクリックします。
Clusters ページで、ご利用のクラスター名をクリックします。左側ナビゲーションウィンドウで、Workloads > Pods を選択します。
Pods ページで、Namespace のドロップダウンリストから istio-system を選択します。
Node 列で、ゲートウェイ Pod の配置先を確認します。
通常の負荷下では、Pod はラベル付き ECS ノード(
node1)上に表示される必要があります。ECS のリソースが枯渇した場合、Pod は仮想ノード上に表示される必要があります。