水平 Pod 自動スケーリングを使用すると、リアルタイムの需要に基づいて、クラスタ内の既存のステートレス ワークロードに対して実行中の Pod の数を自動的に調整できます。オートスケーラーは、負荷が増加すると Pod を追加し、需要が減少すると Pod を削除します。これにより、手動介入なしでアプリケーションの可用性を維持し、リソースを効率的に使用して、費用を管理できます。CPU 使用率などの標準リソース指標や、HTTP リクエスト率などの Prometheus のカスタム アプリケーション指標に基づいてスケーリングできます。
Deployment をスケールする
Kubernetes のスケーリング機能を使用して、Deployment で実行されている Pod の数を適切にスケーリングします。
Deployment の Pod を自動スケーリングする
Kubernetes には自動スケーリング機能が用意されているため、需要の変化に応じて Deployment を手動で更新する必要がありません。Deployment の Pod を自動スケーリングする手順は次のとおりです。
水平 Pod オートスケーラーが CPU 使用率を適切に測定できるように、Deployment に CPU リソース リクエストを設定します。
Deployment で水平 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 を指定できます。DEPLOYMENT_NAME: 自動スケーリングするデプロイの名前。CPU_PERCENT: リクエストする目標平均 CPU 使用率。すべての Pod の割合として表されます。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 を指定できます。DEPLOYMENT_NAME: 自動スケーリングするデプロイの名前。DEPLOYMENT_NAME: デプロイ内の複製されたPodオブジェクトの数。
Prometheus のカスタム指標を自動スケーリングに使用する
水平 Pod 自動スケーリングでは、デフォルトで CPU 使用率やメモリ使用率などの標準リソース指標が使用されます。標準指標は一般的なスケーリングには適していますが、特殊なアプリケーション負荷には適していません。
Prometheus のカスタム指標で水平 Pod 自動スケーリングを使用すると、HTTP リクエスト率、キューの深さ、処理レイテンシなど、アプリケーション固有の指標に基づいてワークロードをスケーリングできます。Prometheus モニタリング スタックによってすでに収集されている豊富なデータを活用することで、クラスタは実際の需要により正確に対応できます。
水平 Pod 自動スケーリングで Prometheus を使用するための前提条件
この機能を有効にする前に、次の条件を満たす必要があります。
既存の Prometheus サーバー: Prometheus サーバーがすでにデプロイされており、クラスタ内からネットワーク アクセス可能である必要があります(HPA コントローラは Prometheus インスタンス自体を管理しません)。詳細については、Kubernetes で Prometheus Operator をデプロイして構成する方法をご覧ください。
管理権限: Cluster カスタム リソースを変更するために必要な権限が必要です。
API の競合がない: プリフライト チェックでは、他のコンポーネントが
custom.metrics.k8s.ioの APIService を登録していないことを確認します。競合が存在する場合、アダプタを有効にできません。
Prometheus を有効にして構成する
このプロセスでは、指標ルールの定義とクラスタ構成の更新を行います。
1 つ以上の指標ルール ConfigMap を作成します。
ターゲット クラスタの名前空間内の 1 つ以上の ConfigMap で、カスタム指標の PromQL ベースのルールを定義します。コントローラはこれらの ConfigMap を監視し、マージして、アダプタに自動的に適用します。
ルールの定義の詳細については、kubernetes-sigs/prometheus-adapter の指標の検出と表示の構成をご覧ください。
次のサンプルは、
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 Adapter を
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 セクションを削除します。