カスタム指標による Deployment の自動スケーリング

このチュートリアルでは、Stackdriver からインポートしたカスタム指標に基づいて Kubernetes Engine ワークロードを自動的にスケーリングする方法を示します。

目標

Kubernetes Engine でカスタム指標(カスタム メトリック)による自動スケーリングを設定するには、次のことを行う必要があります。

  1. カスタム指標 Stackdriver アダプタをデプロイします。
  2. カスタム指標 を Stackdriver にエクスポートします。
  3. HorizontalPodAutoscaler(HPA)リソースをデプロイして、カスタム指標に基づいて Deployment をスケーリングします。

始める前に

次の手順で Kubernetes Engine API を有効にします。
  1. Google Cloud Platform Console で Kubernetes Engine ページにアクセスします。
  2. プロジェクトを作成または選択します。
  3. API と関連サービスが有効になるのを待ちます。これには数分かかることがあります。
  4. プロジェクトの課金を有効にします。

    課金の有効化

このチュートリアルで使用されている以下のコマンドライン ツールをインストールします。

  • Kubernetes Engine クラスタを作成および削除するには、gcloud を使用します。gcloudGoogle Cloud SDK に含まれています。
  • kubectl は、Kubernetes Engine で使用されるクラスタ オーケストレーション システムである Kubernetes を管理するために使用されます。gcloud を使用して kubectl をインストールできます。
    gcloud components install kubectl

gcloud コマンドライン ツールのデフォルトを設定する

次のコマンドを実行してデフォルト値を設定しておくと、gcloud コマンドライン ツールでプロジェクト IDCompute Engine ゾーンの各オプションを入力する時間を節約できます。
gcloud config set project [PROJECT_ID]
gcloud config set compute/zone us-central1-b

クラスタの作成とモニタリングの設定

カスタム指標の選択

カスタム指標による自動スケーリングには、次の 2 つの方法があります。

  • Deployment の中のすべてのポッドからカスタム指標をエクスポートし、ポッドあたりの平均値を目標にすることができます。
  • Deployment の外部の単一のポッドからカスタム指標をエクスポートし、合計値を目標にすることができます。

1 つの Deployment では、指定された制限内で、指標(メトリック)値に基づいて複製ポッドをスケーリングできます。合計目標値を伴う指標は、常に、スケーリングによって指標値が目標値に近づくように定義される必要があります。

たとえば、1 秒あたりのクエリ数の指標に基づいてフロントエンド アプリケーションをスケーリングする場合を考えみましょう。指標値が増加したとき、各ポッドで処理するトラフィック量は以前とほぼ同じままで、ポッド数を増やす必要があります。各ポッドの「クエリ/秒」値をエクスポートし、適切な目標平均値を設定することにより、望ましい動作が得られます。しかし、「クエリ/秒」の合計をエクスポートしてこの指標の合計目標値を設定しても、この場合は望ましい動作が得られません。ポッドの数を増やしてもトラフィックの総量は減少しないためです。

ユースケースに応じて、平均リクエスト レイテンシなどの他の指標を合計目標値とともに直接使用して Deployment をスケーリングできます。

ステップ 1: カスタム指標 Stackdriver アダプタをデプロイする

Stackdriver に格納されている指標へのアクセスを Kubernetes Engine オブジェクトに許可するには、Custom Metrics Stackdriver アダプタをデプロイする必要があります。

クラスタでアダプタをデプロイするには、次のコマンドを実行します。

kubectl create -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/adapter-beta.yaml

ステップ 2: 指標を Stackdriver にエクスポートする

指標を Stackdriver にエクスポートする方法として、アプリケーションから直接エクスポートすることも、または Prometheus 形式でそれらを公開し、Prometheus-to-Stackdriver アダプタをポッドのコンテナに追加することもできます。

Metrics Explorercustom/[METRIC_NAME]custom/foo など)を検索することにより、エクスポートした指標を表示できます。

アプリケーションからの指標のエクスポート

カスタム指標を作成し、それらをアプリケーション コードから Stackdriver に直接エクスポートすることができます。詳細については、Stackdriver Monitoring のドキュメントの「カスタム指標の作成」を参照してください。また、Stackdriver のカスタム指標の自動作成機能を利用することもできます。

指標は、次の要件を満たす必要があります。

  • 指標の種類は GAUGE でなければなりません。
  • 指標タイプは、DOUBLE または INT64 のいずれかです。
  • 指標名は、接頭部 custom.googleapis.com/ の後に単純な名前を付けたものでなければなりません。
  • リソースタイプは "gke_container" でなければなりません
  • リソースラベルには、次のものが含まれていなければなりません。
    • pod_id。これをポッド UID に設定します(Downward API により取得可能)。
    • container_name = “”
    • project_idzonecluster_name。アプリケーションによってメタデータ サーバーから取得可能。値を取得するには、Google Cloud のコンピューティング メタデータ クライアントを使用できます。

次のマニフェスト ファイルで記述される Deployment は、Stackdriver クライアント ライブラリを使って指標をエクスポートする Go アプリケーションの単一インスタンスを実行します。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  labels:
    run: custom-metric-sd
  name: custom-metric-sd
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: custom-metric-sd
  template:
    metadata:
      labels:
        run: custom-metric-sd
    spec:
      containers:
      - command:
        - /bin/sh
        - -c
        - ./direct-to-sd --metric-name=foo --metric-value=40 --pod-id=$(POD_ID)
        image: gcr.io/google-samples/sd-dummy-exporter:latest
        name: sd-dummy-exporter
        resources:
          requests:
            cpu: 100m
        env:
          - name: POD_ID
            valueFrom:
              fieldRef:
                apiVersion: v1
                fieldPath: metadata.uid

Prometheus を使用したエクスポート

アプリケーションの指標を Prometheus 形式で公開し、Prometheus-to-Stackdriver アダプタをデプロイすることができます。それにより、指標が収集されて Stackdriver にエクスポートされます。Prometheus 形式で指標を公開する例については、「Kubernetes インストゥルメンテーション ガイド」を参照してください。

指標は、次の要件を満たす必要があります。

  • 指標タイプは Gauge でなければなりません
  • 指標名に接頭部 custom.googleapis.com を含めないでください

指標のエクスポート元のポッド内に Prometheus をコンテナとしてデプロイし、次のフラグをコンテナに渡します。

  • pod-id および namespace-id: ポッドと名前空間 UID に設定します(Downward API で取得できます)。
  • source=http://localhost:[PORT]: ここで [PORT] は指標が公開されるポートです。
  • stackdriver-prefix=custom.googleapis.com

次のマニフェスト ファイルは、Prometheus クライアント ライブラリとアダプタ コンテナを使用して指標を公開する Go アプリケーションを含むポッドを記述しています。

apiVersion: v1
kind: Pod
metadata:
  name: custom-metric-prometheus-sd
spec:
  containers:
  - command:
    - /bin/sh
    - -c
    - ./prometheus-dummy-exporter --metric-name=foo --metric-value=40 --port=8080
    image: gcr.io/google-samples/prometheus-dummy-exporter:latest
    imagePullPolicy: Always
    name: prometheus-dummy-exporter
    resources:
      requests:
        cpu: 100m
  - name: prometheus-to-sd
    image: gcr.io/google-containers/prometheus-to-sd:v0.2.3
    command:
    - /monitor
    - --source=:http://localhost:8080
    - --stackdriver-prefix=custom.googleapis.com
    - --pod-id=$(POD_ID)
    - --namespace-id=$(POD_NAMESPACE)
    env:
    - name: POD_ID
      valueFrom:
        fieldRef:
          apiVersion: v1
          fieldPath: metadata.uid
    - name: POD_NAMESPACE
      valueFrom:
        fieldRef:
          fieldPath: metadata.namespace

ステップ 3: HorizontalPodAutoscaler オブジェクトを作成する

指標を Stackdriver にエクスポートしたら、次に HPA をデプロイすることで、指標に基づいて Deployment をスケーリングできます。

指標を収集してエクスポートするためにどんな方法を選んだかによって、以下の手順は異なります。

すべてのポッドの指標に基づく自動スケーリング

HPA は、指標を使用して平均値を計算し、それを目標平均値と比較します。

アプリケーションから Stackdriver へのエクスポートの例では、指標をエクスポートするポッドが Deployment に含まれています。次のマニフェスト ファイルは、指標の平均目標値に基づいて Deployment をスケーリングする HorizontalPodAutoscaler オブジェクトを記述しています。

apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: custom-metric-sd
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: custom-metric-sd
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Pods
    pods:
      metricName: foo
      targetAverageValue: 20

単一ポッドの指標に基づく自動スケーリング

HPA は、単一ポッドによって公開された値を、指定された目標値と直接比較します。このポッドを、スケーリングされるワークフローにバインドする必要はありません。

Prometheus から Stackdriver へのエクスポートの例では、単一のポッドが指標をエクスポートします。次のマニフェスト ファイルは、Deployment、および指標の目標値に基づいて Deployment をスケーリングする HPA を記述しています。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: dummy-deployment
spec:
  replicas: 2
  selector:
    matchLabels:
      k8s-app: dummy-deployment
  template:
    metadata:
      labels:
        k8s-app: dummy-deployment
    spec:
      containers:
      - name: long
        image: busybox
        command: ["/bin/sh",  "-c", "sleep 180000000"]
---
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: dummy-deployment-hpa
  namespace: default
spec:
  scaleTargetRef:
    apiVersion: apps/v1beta1
    kind: Deployment
    name: dummy-deployment
  minReplicas: 1
  maxReplicas: 5
  metrics:
  - type: Object
    object:
      target:
        kind: Pod
        name: custom-metric-prometheus-sd
      metricName: foo
      targetValue: 20

クリーンアップ

このチュートリアルで使用するリソースについて、Google Cloud Platform アカウントに課金されないようにする手順は次のとおりです。

次のコマンドを実行して、Kubernetes Engine クラスタを削除します。

gcloud container clusters delete [CLUSTER-NAME]

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Kubernetes Engine のチュートリアル