すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:クロスゾーン展開の自動スケーリング

最終更新日:Oct 23, 2024

マルチゾーン負荷分散は、データサービスの高可用性シナリオで一般的に使用される展開ソリューションです。 ゾーンをまたいでデプロイされているアプリケーションに、重いワークロードを処理するのに十分なリソースがない場合、Container Service for Kubernetes (ACK) では、アプリケーションの各ゾーンに特定の数のノードを作成することができます。 このトピックでは、クロスゾーンデプロイの自動スケーリングを設定する方法について説明します。

前提条件

複数のゾーンが選択され、ゾーン内にvSwitchが作成されます。 ノードを作成するゾーンに少なくとも1つのvSwitchを作成する必要があります。 ゾーンとvSwitchの作成方法の詳細については、「ACK管理クラスターの作成」をご参照ください。

背景情報

ACKで提供されるノード自動スケーリングコンポーネントは、プリスケジュールを使用してアプリケーションを特定のスケーリンググループにデプロイできるかどうかを確認します。 次に、コンポーネントはスケーリンググループにスケールアウト要求を送信し、スケーリンググループは要求された数のノードを作成します。 スケーリンググループに複数のゾーンのvSwitchを設定すると、次の問題が発生する可能性があります。

クラスターリソースが不十分なために複数のゾーンのアプリケーションポッドをスケジュールできない場合、ノード自動スケーリングコンポーネントはスケーリンググループに要求を送信してスケールアウト活動をトリガーします。 ただし、スケーリンググループは、より多くのノードを必要とする各ゾーンにノードを作成できない場合があります。 代わりに、スケーリンググループは特定のゾーンでのみノードを作成できます。 これは、クロスゾーン展開の自動スケーリングの要件を満たしていません。

image

解決策

クロスゾーンデプロイメントの自動スケーリングの要件を満たすために、ACKはack-autoscaling-placeholderコンポーネントを提供します。 コンポーネントは、リソースの冗長性を使用してこの問題を修正します。 コンポーネントは、特定のゾーンにノードを作成する代わりに、異なるゾーンのノードプールを同時にスケールアウトできます。 詳細については、「Use ack-autoscaling-placeholder to scale pods within seconds」をご参照ください。

次のセクションでは、クロスゾーン展開の自動スケーリングを設定する方法について説明します。

  1. 各ゾーンにノードプールを作成し、ノードプールにラベルを追加します。 ラベルは、ノードプールがデプロイされるゾーンを指定します。

  2. ゾーンラベルに基づいてポッドをスケジュールするようにnodeSelectorを設定します。 このように、ack-autoscaling-placehodlerはプレースホルダーポッドを各ゾーンにスケジュールできます。 既定では、プレースホルダーポッドの優先度はアプリケーションポッドの優先度よりも低くなります。

  3. これにより、保留中のアプリケーションポッドがプレースホルダーポッドを置き換えることができます。 保留中のアプリケーションポッドがnodeSelectorを使用してスケジュールされたプレースホルダーポッドを置き換えると、プレースホルダーポッドは保留になります。 ノード自動スケーリングコンポーネントで使用されるノードスケジューリングポリシーが、antiaAffinityからnodeSelectorに変更されました。 このように、ノード自動スケーリングコンポーネントは、アプリケーションの各ゾーンに同時にノードを作成できます。

次の図は、既存のアーキテクチャに基づいて2つのゾーンに同時にノードを作成する方法を示しています。

image
  1. アプリケーションポッドとノード自動スケーリングコンポーネントの間のブリッジとしてack-autoscaling-placeholderを使用し、各ゾーンにプレースホルダーポッドを作成します。 プレースホルダーポッドの優先度は、アプリケーションポッドの優先度より低くする必要があります。

  2. アプリケーションポッドの状態がPendingに変わった後、アプリケーションポッドはプレースホルダーポッドを置き換え、各ゾーンの既存のノードにスケジュールされます。 プレースホルダーポッドの状態がPendingに変わります。

  3. プレースホルダーポッドは、nodeSelectorを使用してスケジュールされます。 ノード自動スケーリングコンポーネントは、プレースホルダーポッドをホストするために各ゾーンにノードを作成する必要があります。

手順1: 各ゾーンのノードプールを作成し、カスタムノードラベルを設定する

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. [クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックします。 クラスターの詳細ページで、左側のナビゲーションウィンドウから [ノード] > [ノードプール] を選択します。

  3. の右上隅にノードプールページをクリックします。ノードプールの作成.

  4. [ノードプールの作成] ダイアログボックスで、ノードプールのパラメーターを設定します。 この例では、自動スケーリング機能が有効になっているauto-zone-IノードプールがゾーンIに作成されています。

    次の表に、主要なパラメーターを示します。 その他のパラメーターの詳細については、「ノードプールの作成」をご参照ください。

    パラメーター

    説明

    ノードプール名

    オートゾーン-I

    vSwitch

    ゾーンIにデプロイされたvSwitchを選択します。Dingtalk_20230925151432.jpg

    Auto Scaling

    自動スケーリングを有効にします。

    ノードラベル

    ノードラベルのKeyパラメーターをavaliable_zoneに設定し、Valueパラメーターをiに設定します。

  5. [注文の確認] をクリックします。

    [ノードプール] ページで、作成したノードプールを確認できます。 auto-zone-Iノードプールの状態が [アクティブ] に変わると、ノードプールが作成されます。

  6. 上記の手順を繰り返して、自動スケーリングが必要なゾーンごとに自動スケーリング機能が有効になっているノードプールを作成します。

节点池多可用区.png

手順2: ack-autoscaling-placeholderとplaceholderのデプロイ

  1. ACKコンソールの左側のナビゲーションウィンドウで、[Marketplace] > [Marketplace] を選択します。

  2. On theアプリカタログタブ、検索してクリックack-autoscaling-placeholder.

  3. On theack-autoscaling-placeholderページをクリックします。デプロイ.

  4. [基本情報] ステップで、[クラスター] ドロップダウンリストからクラスターを選択し、[名前空間] ドロップダウンリストから名前空間を選択し、[次へ] をクリックします。 [チャートバージョン] ドロップダウンリストからチャートバージョンを選択し、パラメーターを設定し、[OK] をクリックします。

    ack-autoscaling-placeholderのデプロイ後、クラスターの詳細ページに移動します。 左側のナビゲーションで、[アプリケーション] > [ヘルム] を選択します。 アプリケーションの状態が [デプロイ済み] であることがわかります。

  5. 詳細ページの左側のナビゲーションウィンドウで、[アプリケーション] > [ヘルム] を選択します。

  6. On theヘルムページ、ack-autoscaling-placeholder-defaultを見つけて、更新で、アクション列を作成します。

  7. [リリースの更新] パネルで、要件に基づいて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ファイルを更新すると、各ゾーンにプレースホルダーの配置が配置されます。创建占位Deployment.png

ステップ3: ワークロードのPriorityClassを作成する

  1. 次の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."
  2. 次のコマンドを実行して、ワークロードにPriorityClassをデプロイします。

    kubectl apply -f priorityClass.yaml

    期待される出力:

    priorityclass.scheduling.k8s.io/high-priority created

ステップ4: ワークロードのデプロイ

この例では、ワークロードはゾーンIにデプロイされています。

  1. 次の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
  2. 次のコマンドを実行して、ワークロードをデプロイします。

    kubectl apply -f workload.yaml

    期待される出力:

    deployment.apps/placeholder-test created

    Verify the result

    ワークロードのデプロイ後、クラスターの詳細ページに移動し、左側のナビゲーションウィンドウで [ワークロード] > [ポッド] を選択します。 [ポッド] ページで、ワークロードのPriorityClassの値がプレースホルダーポッドの値よりも高いことがわかります。 これにより、追加されたノードでワークロードポッドを実行できます。 プレースホルダーポッドは、ノード自動スケーリングコンポーネントをトリガーして、各ゾーンに同時にノードを作成し、ワークロードによって要求される次のスケールアウトアクティビティの準備をします。部署工作负载.png

    [ノード] > [ノード] を選択します。 [ノード] ページで、プレースホルダーポッドをホストするノードでワークロードポッドが実行されていることがわかります。负载Pod.png