マルチゾーン負荷分散は、データサービスの高可用性シナリオで一般的に使用される展開ソリューションです。 ゾーンをまたいでデプロイされているアプリケーションに、重いワークロードを処理するのに十分なリソースがない場合、Container Service for Kubernetes (ACK) では、アプリケーションの各ゾーンに特定の数のノードを作成することができます。 このトピックでは、クロスゾーンデプロイの自動スケーリングを設定する方法について説明します。
前提条件
複数のゾーンが選択され、ゾーン内にvSwitchが作成されます。 ノードを作成するゾーンに少なくとも1つのvSwitchを作成する必要があります。 ゾーンとvSwitchの作成方法の詳細については、「ACK管理クラスターの作成」をご参照ください。
背景情報
ACKで提供されるノード自動スケーリングコンポーネントは、プリスケジュールを使用してアプリケーションを特定のスケーリンググループにデプロイできるかどうかを確認します。 次に、コンポーネントはスケーリンググループにスケールアウト要求を送信し、スケーリンググループは要求された数のノードを作成します。 スケーリンググループに複数のゾーンのvSwitchを設定すると、次の問題が発生する可能性があります。
クラスターリソースが不十分なために複数のゾーンのアプリケーションポッドをスケジュールできない場合、ノード自動スケーリングコンポーネントはスケーリンググループに要求を送信してスケールアウト活動をトリガーします。 ただし、スケーリンググループは、より多くのノードを必要とする各ゾーンにノードを作成できない場合があります。 代わりに、スケーリンググループは特定のゾーンでのみノードを作成できます。 これは、クロスゾーン展開の自動スケーリングの要件を満たしていません。
解決策
クロスゾーンデプロイメントの自動スケーリングの要件を満たすために、ACKはack-autoscaling-placeholderコンポーネントを提供します。 コンポーネントは、リソースの冗長性を使用してこの問題を修正します。 コンポーネントは、特定のゾーンにノードを作成する代わりに、異なるゾーンのノードプールを同時にスケールアウトできます。 詳細については、「Use ack-autoscaling-placeholder to scale pods within seconds」をご参照ください。
次のセクションでは、クロスゾーン展開の自動スケーリングを設定する方法について説明します。
各ゾーンにノードプールを作成し、ノードプールにラベルを追加します。 ラベルは、ノードプールがデプロイされるゾーンを指定します。
ゾーンラベルに基づいてポッドをスケジュールするようにnodeSelectorを設定します。 このように、ack-autoscaling-placehodlerはプレースホルダーポッドを各ゾーンにスケジュールできます。 既定では、プレースホルダーポッドの優先度はアプリケーションポッドの優先度よりも低くなります。
これにより、保留中のアプリケーションポッドがプレースホルダーポッドを置き換えることができます。 保留中のアプリケーションポッドがnodeSelectorを使用してスケジュールされたプレースホルダーポッドを置き換えると、プレースホルダーポッドは保留になります。 ノード自動スケーリングコンポーネントで使用されるノードスケジューリングポリシーが、antiaAffinityからnodeSelectorに変更されました。 このように、ノード自動スケーリングコンポーネントは、アプリケーションの各ゾーンに同時にノードを作成できます。
次の図は、既存のアーキテクチャに基づいて2つのゾーンに同時にノードを作成する方法を示しています。
アプリケーションポッドとノード自動スケーリングコンポーネントの間のブリッジとしてack-autoscaling-placeholderを使用し、各ゾーンにプレースホルダーポッドを作成します。 プレースホルダーポッドの優先度は、アプリケーションポッドの優先度より低くする必要があります。
アプリケーションポッドの状態がPendingに変わった後、アプリケーションポッドはプレースホルダーポッドを置き換え、各ゾーンの既存のノードにスケジュールされます。 プレースホルダーポッドの状態がPendingに変わります。
プレースホルダーポッドは、nodeSelectorを使用してスケジュールされます。 ノード自動スケーリングコンポーネントは、プレースホルダーポッドをホストするために各ゾーンにノードを作成する必要があります。
手順1: 各ゾーンのノードプールを作成し、カスタムノードラベルを設定する
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックします。 クラスターの詳細ページで、左側のナビゲーションウィンドウから を選択します。
の右上隅にノードプールページをクリックします。ノードプールの作成.
[ノードプールの作成] ダイアログボックスで、ノードプールのパラメーターを設定します。 この例では、自動スケーリング機能が有効になっているauto-zone-IノードプールがゾーンIに作成されています。
次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「ノードプールの作成」をご参照ください。
パラメーター
説明
ノードプール名
オートゾーン-I
vSwitch
ゾーンIにデプロイされたvSwitchを選択します。
Auto Scaling
自動スケーリングを有効にします。
ノードラベル
ノードラベルのKeyパラメーターをavaliable_zoneに設定し、Valueパラメーターをiに設定します。
[注文の確認] をクリックします。
[ノードプール] ページで、作成したノードプールを確認できます。 auto-zone-Iノードプールの状態が [アクティブ] に変わると、ノードプールが作成されます。
上記の手順を繰り返して、自動スケーリングが必要なゾーンごとに自動スケーリング機能が有効になっているノードプールを作成します。
手順2: ack-autoscaling-placeholderとplaceholderのデプロイ
ACKコンソールの左側のナビゲーションウィンドウで、 を選択します。
On theアプリカタログタブ、検索してクリックack-autoscaling-placeholder.
On theack-autoscaling-placeholderページをクリックします。デプロイ.
[基本情報] ステップで、[クラスター] ドロップダウンリストからクラスターを選択し、[名前空間] ドロップダウンリストから名前空間を選択し、[次へ] をクリックします。 [チャートバージョン] ドロップダウンリストからチャートバージョンを選択し、パラメーターを設定し、[OK] をクリックします。
ack-autoscaling-placeholderのデプロイ後、クラスターの詳細ページに移動します。 左側のナビゲーションで、
を選択します。 アプリケーションの状態が [デプロイ済み] であることがわかります。詳細ページの左側のナビゲーションウィンドウで、 を選択します。
On theヘルムページ、ack-autoscaling-placeholder-defaultを見つけて、更新で、アクション列を作成します。
[リリースの更新] パネルで、要件に基づいてYAMLテンプレートを変更し、[OK] をクリックします。 各ゾーンにプレースホルダーの配置を配置します。
次のYAMLテンプレートは、ゾーンI、ゾーンK、およびゾーンHにプレースホルダーのデプロイを展開する方法の例を示しています。
deployments: - affinity: {} annotations: {} containers: - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1 imagePullPolicy: IfNotPresent name: placeholder resources: requests: cpu: 3500m # The CPU request of the placeholder Deployment. memory: 6 # The memory request of the placeholder Deployment. imagePullSecrets: {} labels: {} name: ack-place-holder-I # The name of the placeholder Deployment. nodeSelector: {"avaliable_zone":i} # The zone label. The label must be the same as the label that you specified in Step 1 when you created the node pool. replicaCount: 10 # The number of pods that are created in each scale-out activity. tolerations: [] - affinity: {} annotations: {} containers: - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1 imagePullPolicy: IfNotPresent name: placeholder resources: requests: cpu: 3500m # The CPU request of the placeholder Deployment. memory: 6 # The memory request of the placeholder Deployment. imagePullSecrets: {} labels: {} name: ack-place-holder-K # The name of the placeholder Deployment. nodeSelector: {"avaliable_zone":k} # The zone label. The label must be the same as the label that you specified in Step 1 when you created the node pool. replicaCount: 10 # The number of pods that are created in each scale-out activity. tolerations: [] - affinity: {} annotations: {} containers: - image: registry-vpc.cn-beijing.aliyuncs.com/acs/pause:3.1 imagePullPolicy: IfNotPresent name: placeholder resources: requests: cpu: 3500m # The CPU request of the placeholder Deployment. memory: 6 # The memory request of the placeholder Deployment. imagePullSecrets: {} labels: {} name: ack-place-holder-H # The name of the placeholder Deployment. nodeSelector: {"avaliable_zone":h} # The zone label. The label must be the same as the label that you specified in Step 1 when you created the node pool. replicaCount: 10 # The number of pods that are created in each scale-out activity. tolerations: [] fullnameOverride: "" nameOverride: "" podSecurityContext: {} priorityClassDefault: enabled: true name: default-priority-class value: -1
YAMLファイルを更新すると、各ゾーンにプレースホルダーの配置が配置されます。
ステップ3: ワークロードのPriorityClassを作成する
次のyamlテンプレートを使用してpriorityClass. YAMLという名前のファイルを作成します。
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 # Specify the priority value. The value must be higher than the default priority value of the Deployments that you create in Step 2. globalDefault: false description: "This priority class should be used for XYZ service pods only."
ワークロードにPriorityClassを設定しない場合は、グローバルPriorityClassをデフォルト設定として設定できます。 構成をデプロイした後、アプリケーションポッドはプレースホルダーポッドを自動的に置き換えることができます。
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: global-high-priority value: 1 # Specify the priority value. The value must be greater than the default priority of the Deployments that you create in Step 2. globalDefault: true description: "This priority class should be used for XYZ service pods only."
次のコマンドを実行して、ワークロードにPriorityClassをデプロイします。
kubectl apply -f priorityClass.yaml
期待される出力:
priorityclass.scheduling.k8s.io/high-priority created
ステップ4: ワークロードのデプロイ
この例では、ワークロードはゾーンIにデプロイされています。
次のyamlテンプレートを使用して、workload. YAMLという名前のファイルを作成します。
apiVersion: apps/v1 kind: Deployment metadata: name: placeholder-test labels: app: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeSelector: # Select a node to deploy the workload. avaliable_zone: "i" priorityClassName: high-priority # Specify the name of the PriorityClass that is created in Step 3. If you enable global configurations, this parameter is optional. containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 resources: requests: cpu: 3 # Specify the resource request of the workload. memory: 5
次のコマンドを実行して、ワークロードをデプロイします。
kubectl apply -f workload.yaml
期待される出力:
deployment.apps/placeholder-test created
Verify the result
ワークロードのデプロイ後、クラスターの詳細ページに移動し、左側のナビゲーションウィンドウで
を選択します。 [ポッド] ページで、ワークロードのPriorityClassの値がプレースホルダーポッドの値よりも高いことがわかります。 これにより、追加されたノードでワークロードポッドを実行できます。 プレースホルダーポッドは、ノード自動スケーリングコンポーネントをトリガーして、各ゾーンに同時にノードを作成し、ワークロードによって要求される次のスケールアウトアクティビティの準備をします。を選択します。 [ノード] ページで、プレースホルダーポッドをホストするノードでワークロードポッドが実行されていることがわかります。