水平 Pod 自動スケーリングを構成する

このドキュメントでは、クラスタで実行されている既存のステートレス ワークロードに水平 Pod 自動スケーリングを設定する方法について説明します。水平 Pod 自動スケーリングは、リアルタイムの需要に基づいてアプリケーションの実行中の Pod(レプリカ)の数を自動的に調整します。負荷が減少すると Pod を削除し、負荷が増加すると Pod を追加します。このスケールインとスケールアウトは、手動介入なしで容量をユーザー トラフィックに正確に一致させることで、アプリケーションの可用性、効率的なリソース使用、コスト削減を保証するために不可欠です。コンテナ ワークロードの要件が変化しても、Pod の自動スケーリングにより、オペレーターがパフォーマンスを常にモニタリングして Pod 数を手動で調整する必要がなくなります。

このページは、基盤となる技術インフラストラクチャのライフサイクルを管理する管理者、アーキテクト、オペレーターを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。

Deployment をスケールする

Kubernetes のスケーリング機能を使用して、デプロイで実行されている Pod の量を適切にスケーリングします。

Deployment の Pod を自動スケーリングする

Kubernetes は自動スケーリングを提供し、需要の変化に応じてデプロイを手動で更新する必要をなくします。デプロイの Pod を自動スケーリングする手順は次のとおりです。

  1. 水平 Pod オートスケーラーが CPU の割合を適切に測定できるようにするには、デプロイに CPU リソース リクエストを設定します。

  2. デプロイで水平 Pod 自動スケーラーを設定します。

    kubectl --kubeconfig CLUSTER_KUBECONFIG \
        -n NAMESPACE \
        autoscale deployment DEPLOYMENT_NAME \
        --cpu-percent=CPU_PERCENT \
        --min=MIN_NUMBER_REPLICAS \
        --max=MAX_NUMBER_REPLICAS
    

    次のように置き換えます。

    • CLUSTER_KUBECONFIG: クラスタの kubeconfig ファイル。

    • NAMESPACE: Namespace。共有クラスタの場合、これはプロジェクト Namespace である必要があります。Standard クラスタの場合は、任意の Namespace を指定できます。

    • DEPLOYMENT_NAME: 自動スケーリングするデプロイの名前。

    • CPU_PERCENT: すべての Pod でリクエストする平均 CPU 使用率の目標値(パーセント)。

    • MIN_NUMBER_REPLICAS: オートスケーラーがプロビジョニングできる Pod 数の下限。

    • MAX_NUMBER_REPLICAS: オートスケーラーがプロビジョニングできる Pod の数の上限。

  3. HorizontalPodAutoscaler の現在のステータスを確認します。

    kubectl get hpa
    

    出力は次のようになります。

    NAME              REFERENCE                          TARGET    MINPODS   MAXPODS   REPLICAS   AGE
    DEPLOYMENT_NAME   Deployment/DEPLOYMENT_NAME/scale   0% / 50%  1         10        1          18s
    

Deployment の Pod を手動でスケーリングする

Deployment を手動でスケーリングする場合は、次のコマンドを実行します。

kubectl --kubeconfig CLUSTER_KUBECONFIG \
    -n NAMESPACE \
    scale deployment DEPLOYMENT_NAME \
    --replicas NUMBER_OF_REPLICAS

次のように置き換えます。

  • CLUSTER_KUBECONFIG: クラスタの kubeconfig ファイル。

  • NAMESPACE: Namespace。共有クラスタの場合、これはプロジェクト Namespace である必要があります。Standard クラスタの場合は、任意の Namespace を指定できます。

  • DEPLOYMENT_NAME: 自動スケーリングするデプロイの名前。

  • DEPLOYMENT_NAME: デプロイ内の複製された Pod オブジェクトの数。

自動スケーリングに Prometheus のカスタム指標を使用する

水平 Pod 自動スケーリングでは、デフォルトで CPU やメモリ使用率などの標準リソース指標が使用されます。標準指標は一般的なスケーリングには有効ですが、特殊なアプリケーション ロードには有効ではありません。

Prometheus のカスタム指標で水平 Pod 自動スケーリングを使用すると、HTTP リクエスト率、キューの深さ、処理レイテンシなどのアプリケーション固有の指標に基づいてワークロードをスケーリングできます。クラスタは、Prometheus モニタリング スタックによってすでに収集されている豊富なデータを活用することで、実際の需要に正確に対応できます。

Prometheus と水平 Pod 自動スケーリングを使用するための前提条件

この機能を有効にする前に、次の条件を満たしている必要があります。

  • 既存の Prometheus サーバー: Prometheus サーバーがすでにデプロイされ、クラスタ内からネットワーク アクセス可能である必要があります(HPA コントローラは Prometheus インスタンス自体を管理しません)。詳細については、Kubernetes で Prometheus Operator をデプロイして構成する方法をご覧ください。

  • 管理権限: クラスタ カスタム リソースを変更するために必要な権限が必要です。

  • API の競合がない: プリフライト チェックで、他のコンポーネントが custom.metrics.k8s.io の APIService をすでに登録していないことを確認します。競合がある場合、アダプタを有効にすることはできません。

Prometheus を有効にして構成する

このプロセスでは、指標ルールを定義し、クラスタ構成を更新します。

  1. 1 つ以上の指標ルール ConfigMap を作成します。

    ターゲット クラスタの Namespace 内の 1 つ以上の ConfigMap で、カスタム指標の PromQL ベースのルールを定義します。コントローラはこれらの ConfigMap を監視し、それらを統合して、アダプターに自動的に適用します。

    ルールの定義の詳細については、kubernetes-sigs/prometheus-adapterMetrics Discovery and Presentation Configuration をご覧ください。

    次の例は、data フィールドで http_requests_per_second に定義されたルールを含む ConfigMap を示しています。

    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: my-app-rules
      namespace: <cluster-namespace>
    data:
      config.yaml: |
        rules:
        - seriesQuery: 'http_requests_total'
          resources:
            overrides:
              namespace_name: {resource: "namespace"}
              pod_name: {resource: "pod"}
          name:
            matches: "^(.*)_total$"
            as: "${1}_per_second"
          metricsQuery: 'sum(rate(<<.Series>>{<<.LabelMatchers>>}[5m])) by (<<.GroupBy>>)'
    
  2. Prometheus サーバーで相互トランスポート層セキュリティ(mTLS)などの認証が必要な場合は、必要な認証情報を含む kubeconfig 形式の Kubernetes Secret を作成します。

    次の例は、基本認証をサポートする Secret を示しています。

    apiVersion: v1
    kind: Secret
    metadata:
      name: prometheus-auth-secret
      namespace: <cluster-namespace>
      annotations:
        baremetal.cluster.gke.io/mark-source: "true"
    type: Opaque
    stringData:
      config: authentication-credentials
    
  3. Cluster カスタム リソースを更新します。

    1. Cluster カスタム リソースの metadatapreview.baremetal.cluster.gke.io/metrics-adapter: "true" アノテーションを追加します。

    2. spec.metricsAdapter セクションを追加して、Prometheus URL を定義し、ルール ConfigMap を参照します。

      apiVersion: baremetal.cluster.gke.io/v1
      kind: Cluster
      metadata:
        name: <cluster-name>
        namespace: <cluster-namespace>
        annotations:
          preview.baremetal.cluster.gke.io/metrics-adapter: "true"
      spec:
        # ... other existing cluster configurations ...
        metricsAdapter:
          prometheus:
            url: "http://prometheus-k8s.monitoring.svc.cluster.local:9090"
            orgID: "production-environment"
            auth:
              configSecretRef:
                name: prometheus-auth-secret
                key: config # This is the key within the Secret's 'data' field
          rules:
            configMapKeyRefs:
              - name: my-app-rules
                key: config.yaml # This is the key within the ConfigMap's 'data' field
              # - name: base-system-rules
              #   key: config.yaml
      

      Prometheus インスタンスで認証が不要な場合は、クラスタ仕様から metricsAdapter.prometheus.auth セクションを省略できます。

  4. 更新された Cluster カスタム リソースを適用します。

    コントローラは、Prometheus アダプタを kube-system Namespace に自動的にデプロイします。

  5. ConfigMap の rules フィールドで定義されたカスタム指標をターゲットとする HorizontalPodAutoscaler リソースを作成して、水平 Pod 自動スケーリングでカスタム指標を使用します。

    前の手順の ConfigMap の例では、http_requests_per_second カスタム指標を定義しました。この指標を使用するには、HorizontalPodAutoscaler リソースが次の例のようになっている必要があります。

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: <name>
      namespace: <namespace>
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: <workload-name>
      minReplicas: 1
      maxReplicas: 10
      metrics:
      - type: Pods
        pods:
          metric:
            name: http_requests_per_second
          target:
            type: AverageValue
            averageValue: 10
    

Prometheus を無効にする

水平 Pod 自動スケーリングで Prometheus の使用を無効にするには、Cluster カスタム リソースから spec.metricsAdapter セクションを削除します。