ランタイム サービスのスケーリングと自動スケーリング

Kubernetes で実行されるほとんどのサービスは、コマンドラインまたは構成のオーバーライドでスケーリングできます。Apigee ハイブリッド ランタイム サービス用のスケーリング パラメータは、overrides.yaml ファイルで設定できます。

サービス 実装方法 スケーリング
Cassandra ApigeeDatastore(CRD) Cassandra のスケーリングをご覧ください。
Ingress / LoadBalancer Deployment Cloud Service Mesh は、水平 Pod 自動スケーリング(HPA)を使用します。
Logger DaemonSet DaemonSet は、すべてのノードで Pod のレプリカを管理し、Pod 自身のスケーリングに合わせてスケーリングします。
MART
Apigee Connect
Watcher
ApigeeOrganization(CRD)

構成でスケーリングするには、martwatcherconnectAgent スタンザに対する Deployment の replicaCountMin 構成プロパティの値を増やします。例:

mart:
  replicaCountMax: 2
  replicaCountMin: 1

watcher:
  replicaCountMax: 2
  replicaCountMin: 1

connectAgent:
  replicaCountMax: 2
  replicaCountMin: 1

これらの Deployment では、自動スケーリングに HorizontalPodAutoscaler が使用されます。Deployment オブジェクトの targetCPUUtilizationPercentage プロパティにスケールアップのしきい値を設定します。この値を超えると、Kubernetes は replicaCountMax の値に達するまで Pod を追加します。

構成プロパティの設定の詳細については、ランタイム プレーン コンポーネントの管理をご覧ください。

Runtime
Synchronizer
UDCA
ApigeeEnvironment(CRD) 構成でスケーリングするには、オーバーライド ファイルで、udcasynchronizerruntime スタンザに対する replicaCountMin プロパティの値を増やします。次に例を示します。
synchronizer:
  replicaCountMax: 10
  replicaCountMin: 1

runtime:
  replicaCountMax: 10
  replicaCountMin: 1

udca:
  replicaCountMax: 10
  replicaCountMin: 1

注: これらの変更は、オーバーライド ファイル内のすべての環境に適用されます。環境ごとにスケーリングをカスタマイズする場合は、後述の高度な構成をご覧ください。

これらの Deployment では、自動スケーリングに HorizontalPodAutoscaler が使用されます。Deployment オブジェクトの targetCPUUtilizationPercentage プロパティにスケールアップのしきい値を設定します。この値を超えると、Kubernetes により、replicaCountMax の値に達するまで Pod が追加されます。

構成プロパティの設定の詳細については、ランタイム プレーン コンポーネントの管理をご覧ください。

高度な構成

状況によっては、高度なスケーリング オプションを使用する必要があります。次のようなシナリオの場合です。

  • 環境ごとに、異なるスケーリング オプションを設定するとき。たとえば、env1 の minReplica が 5 で、env2 の minReplica が 2 の場合です。
  • 環境内のコンポーネントごとに、異なるスケーリング オプションを設定するとき。たとえば、udca コンポーネントの maxReplica が 5 で、synchronizer コンポーネントの maxReplica が 2 の場合です。

次の例では、kubernetes patch コマンドを使用して、runtime コンポーネントの maxReplicas プロパティを変更する方法を示します。

  1. 次のコマンドで、使用する環境変数を作成します。
    export ENV_NAME=my-environment-name
    export ENV_RELEASE_NAME=$ENV_NAME # the Helm release name for the environment
    export APIGEE_NAMESPACE=apigee  #the namespace where Apigee is deployed
    export COMPONENT=runtime #can be udca or synchronizer
    export MAX_REPLICAS=2
    export MIN_REPLICAS=1
  2. patch を実行します。この例では、kubectlPATH に入っていることを前提としています。
    kubectl patch apigeeenvironment -n $APIGEE_NAMESPACE \
      $(kubectl get apigeeenvironments -n $APIGEE_NAMESPACE -o jsonpath='{.items[?(@.spec.name == "'$ENV'" )]..metadata.name}') \
      --patch "$(echo -e "spec:\n  components:\n    $COMPONENT:\n      autoScaler:\n        maxReplicas: $MAX_REPLICAS\n        minReplicas: $MIN_REPLICAS")" \
      --type merge
    
  3. 次のコマンドで変更を確認します。
    kubectl get hpa -n $APIGEE_NAMESPACE
    

環境に基づくスケーリング

デフォルトでは、スケーリングは組織レベルで記述されます。次の例に示すように、overrides.yaml ファイルで環境固有のスケーリングを指定することで、デフォルト設定をオーバーライドできます。

envs:
  # Apigee environment name
  - name: ENV_NAME>
    components:
    # Environment-specific scaling override
    # Otherwise, uses scaling defined at the respective root component
     runtime:
      replicaCountMin: 2
      replicaCountMax: 20

指標に基づくスケーリング

指標に基づくスケーリングでは、ランタイムは CPU とアプリケーション指標を使用して apigee-runtime Pod をスケーリングできます。Kubernetes HorizontalPodAutoscaler(HPA)API は、hpaBehavior フィールドを使用して、ターゲット サービスのスケールアップとスケールダウンの動作を構成します。指標に基づくスケーリングは、ハイブリッド デプロイの他のコンポーネントでは使用できません。

スケーリングは次の指標に基づいて調整できます。

指標 メジャー 考慮事項
serverMainTaskWaitTime ランタイム インスタンスでプロキシ リクエストがポリシーを処理する、処理キューの平均待機時間(ミリ秒)。 この指標は、プロキシのリクエスト フローに接続されたポリシーの複雑さの影響を測定します。
serverNioTaskWaitTime http レイヤでのプロキシ リクエストのランタイム インスタンスにおける、処理キューの平均待機時間(ミリ秒)。 この指標は、プロキシのリクエストとレスポンスの数とペイロード サイズの影響を測定します。

overrides.yamlruntime スタンザでの次の例は、ハイブリッド実装で apigee-runtime Pod をスケーリングするための標準パラメータ(と許可された範囲)を示しています。

runtime:
  # the following parameters configure metrics-based scaling
  hpaMetrics:
    serverMainTaskWaitTime: 400M # (range: 300M to 450M)
    serverNioTaskWaitTime: 400M # (range: 300M to 450M)
    targetCPUUtilizationPercentage: 75
  hpaBehavior:
    scaleDown:
      percent:
        periodSeconds: 60 # (range: 30 - 180)
        value: 20 # (range: 5 - 50)
      pods:
        periodSeconds: 60 # (range: 30 - 180)
        value: 2 # (range: 1 - 15)
      selectPolicy: Min
      stabilizationWindowSeconds: 120 # (range: 60 - 300)
    scaleUp:
      percent:
        periodSeconds: 60 # (range: 30 - 120)
        value: 20 # (range: 5 - 100)
      pods:
        periodSeconds: 60 # (range: 30 - 120)
        value: 4 # (range: 2 - 15)
      selectPolicy: Max
      stabilizationWindowSeconds: 30 # (range:  30 - 120)
  

環境ごとに apigee-runtime チャートを更新して、これらの設定を適用します。次に例を示します。

helm upgrade $ENV_RELEASE_NAME apigee-runtime/ \
  --namespace APIGEE_NAMESPACE \
  --atomic \
  --set env=$ENV_NAME \
  -f overrides.yaml

指標に基づくスケーリングを有効または無効にする

指標に基づくスケーリングはデフォルトで有効になっています。指標に基づくスケーリングを有効または無効にするには、customAutoscaling.enabled プロパティを true または false に設定します。apigee-telemetry チャートを更新して、customAutoscaling.enabled プロパティに変更を適用します。次に例を示します。

helm upgrade telemetry apigee-telemetry/ \
  --namespace APIGEE_NAMESPACE \
  --atomic \
  -f overrides.yaml

より積極的なスケーリングを構成する

スケールアップ ポリシーの percentpods の値を大きくすると、より積極的なスケールアップ ポリシーになります。同様に、scaleDownpercentpods の値を大きくすると、アグレッシブなスケールダウン ポリシーになります。次に例を示します。

runtime:
  # ...
  hpaMetrics:
    serverMainTaskWaitTime: 400M
    serverNioTaskWaitTime: 400M
    targetCPUUtilizationPercentage: 75
  hpaBehavior:
    scaleDown:
      percent:
        periodSeconds: 60
        value: 20
      pods:
        periodSeconds: 60
        value: 4
      selectPolicy: Min
      stabilizationWindowSeconds: 120
    scaleUp:
      percent:
        periodSeconds: 60
        value: 30
      pods:
        periodSeconds: 60
        value: 5
      selectPolicy: Max
      stabilizationWindowSeconds: 30

上記の例では、scaleDown.pods.value5に、scaleUp.percent.value 30に、scaleUp.pods.value5 に増えています。

より積極的ではないスケーリングを構成する

hpaBehavior 構成値を減らすことで、より積極的ではないスケールアップとスケールダウンのポリシーを実装することもできます。次に例を示します。

runtime:
  # ...
  hpaMetrics:
    serverMainTaskWaitTime: 400M
    serverNioTaskWaitTime: 400M
    targetCPUUtilizationPercentage: 75
  hpaBehavior:
    scaleDown:
      percent:
        periodSeconds: 60
        value: 10
      pods:
        periodSeconds: 60
        value: 1
      selectPolicy: Min
      stabilizationWindowSeconds: 180
    scaleUp:
      percent:
        periodSeconds: 60
        value: 20
      pods:
        periodSeconds: 60
        value: 4
      selectPolicy: Max
      stabilizationWindowSeconds: 30

上記の例では、scaleDown.percent.value10 に、scaleDown.pods.value1 に、scaleUp.stablizationWindowSeconds は 180 に減少します。

hpaBehavior フィールドを使用した指標に基づくスケーリングの詳細については、スケーリング ポリシーをご覧ください。

トラブルシューティング

このセクションでは、スケーリングと自動スケーリングの構成の際に発生する可能性がある一般的なエラーのトラブルシューティング方法について説明します。

HPA で指標の値に unknown が表示される

指標に基づくスケーリングが機能せず、HPA に unknown が指標値として表示される場合は、次のコマンドを使用して HPA 出力を確認します。

kubectl describe hpa HPA_NAME

コマンドを実行する際に、HPA_NAME を、表示する HPA の名前に置き換えます。

出力にサービスの CPU ターゲットと使用率が表示されます。指標に基づくスケーリングがない場合、CPU スケーリングが機能することが示されます。複数のパラメータを使用した HPA の動作については、複数メトリクスでのスケーリングをご覧ください。