このドキュメントでは、クラスタで実行されている既存のステートレス ワークロードに水平 Pod 自動スケーリングを設定する方法について説明します。水平 Pod 自動スケーリングは、リアルタイムの需要に基づいてアプリケーションの実行中の Pod(レプリカ)の数を自動的に調整します。負荷が減少すると Pod を削除し、負荷が増加すると Pod を追加します。このスケールインとスケールアウトは、手動介入なしで容量をユーザー トラフィックに正確に一致させることで、アプリケーションの可用性、効率的なリソース使用、コスト削減を保証するために不可欠です。コンテナ ワークロードの要件が変化しても、Pod の自動スケーリングにより、オペレーターがパフォーマンスを常にモニタリングして Pod 数を手動で調整する必要がなくなります。
このページは、基盤となる技術インフラストラクチャのライフサイクルを管理する管理者、アーキテクト、オペレーターを対象としています。 Google Cloud のコンテンツで使用されている一般的なロールとタスクの例の詳細については、一般的な GKE Enterprise ユーザーロールとタスクをご覧ください。
Deployment をスケールする
Kubernetes のスケーリング機能を使用して、デプロイで実行されている Pod の量を適切にスケーリングします。
Deployment の Pod を自動スケーリングする
Kubernetes は自動スケーリングを提供し、需要の変化に応じてデプロイを手動で更新する必要をなくします。デプロイの Pod を自動スケーリングする手順は次のとおりです。
水平 Pod オートスケーラーが CPU の割合を適切に測定できるようにするには、デプロイに CPU リソース リクエストを設定します。
デプロイで水平 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 の数の上限。
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 つ以上の指標ルール ConfigMap を作成します。
ターゲット クラスタの Namespace 内の 1 つ以上の ConfigMap で、カスタム指標の PromQL ベースのルールを定義します。コントローラはこれらの ConfigMap を監視し、それらを統合して、アダプターに自動的に適用します。
ルールの定義の詳細については、kubernetes-sigs/prometheus-adapter の Metrics 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>>)'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-credentialsCluster カスタム リソースを更新します。
Cluster カスタム リソースの
metadataにpreview.baremetal.cluster.gke.io/metrics-adapter: "true"アノテーションを追加します。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.yamlPrometheus インスタンスで認証が不要な場合は、クラスタ仕様から
metricsAdapter.prometheus.authセクションを省略できます。
更新された Cluster カスタム リソースを適用します。
コントローラは、Prometheus アダプタを
kube-systemNamespace に自動的にデプロイします。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 セクションを削除します。