デフォルトでは、Horizontal Pod Autoscaler ( HPA ) は CPU とメモリのメトリックに基づく自動スケーリングをサポートしています。ただし、これらのメトリックは、複雑な操作シナリオでは不十分な場合があります。Managed Service for Prometheus によって収集されたカスタムメトリックと外部メトリックを HPA でサポートされているスケーリングメトリックに変換するには、このトピックをご参照ください。このトピックでは、モニタリングデータを取得し、対応するスケーリング設定を実装する方法について説明しています。このソリューションは、アプリケーションに柔軟で便利なスケーリングメカニズムを提供します。
前提条件
Managed Service for Prometheus がインストールされています。詳細については、「Alibaba Cloud Prometheus モニタリングを使用する」をご参照ください。
ack-alibaba-cloud-metrics-adapter がデプロイされます。詳細については、「ACK-alibaba-cloud-metrics-adapter コンポーネントをデプロイする」セクションをご参照ください。
説明ack-alibaba-cloud-metrics-adapter をデプロイするには、Container Service for Kubernetes (ACK) コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。[マーケットプレイス] ページで、ack-alibaba-cloud-metrics-adapter を見つけてデプロイします。
機能
デフォルトでは、HPA は CPU とメモリ使用量に基づく自動スケーリングのみをサポートしています。これは、O&M 要件を満たすことができません。 Managed Service for Prometheus は、オープンソースの Prometheus エコシステムと連携するフルマネージド型のモニタリングサービスです。 Managed Service for Prometheus はさまざまなコンポーネントを監視し、すぐに使用できる複数のダッシュボードを提供します。 Prometheus メトリックに基づいて水平ポッド自動スケーリングを有効にするには、次の手順を実行します。
ACK クラスタで Managed Service for Prometheus を使用してメトリックを公開します。
ack-alibaba-cloud-metrics-adapter を使用して、Prometheus メトリックを HPA でサポートされている Kubernetes メトリックに変換します。詳細については、「Kubernetes オブジェクトに関連しないメトリックでの自動スケーリング」をご参照ください。
Configure and deploy the HPA to perform auto scaling based on the preceding metrics. 上記のメトリックに基づいて自動スケーリングを実行するように HPA を構成およびデプロイします。
メトリックは、シナリオに基づいて次のタイプに分類できます。
カスタム メトリック: オブジェクトに関連するメトリックに基づいて、ポッドなどの Kubernetes オブジェクトをスケーリングします。たとえば、ポッド メトリックに基づいてポッドをスケーリングできます。詳細については、「複数のメトリックとカスタム メトリックでの自動スケーリング」をご参照ください。
外部メトリック: ポッドなどの Kubernetes オブジェクトを、オブジェクトに関連しないメトリックに基づいてスケーリングします。たとえば、ビジネス QPS に基づいてワークロードのポッドをスケーリングできます。詳細については、「Kubernetes オブジェクトに関連しないメトリックでの自動スケーリング」をご参照ください。
次のセクションでは、alibaba-cloud-metrics-adapter を構成して Prometheus メトリックを HPA でサポートされているメトリックに変換し、自動スケーリングを行う方法について説明します。
ステップ 1: Prometheus メトリックを収集する
定義済みのメトリックを使用します
ACK クラスタにインストールされている Managed Service for Prometheus で使用可能な定義済みメトリックに基づいて、自動スケーリングを実行できます。定義済みメトリックには、コンテナ監視用の cadvisor メトリック、ノード監視用の Node-Exporter および GPU-Exporter メトリック、Managed Service for Prometheus によって提供されるすべてのメトリックが含まれます。Managed Service for Prometheus で定義済みメトリックを表示するには、次の手順を実行します。
ACK コンソール にログオンします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のペインで、 を選択します。
[ARMS Prometheus に移動] を右上隅でクリックします。
左側のナビゲーションウィンドウで、[設定] をクリックして、Managed Service for Prometheus でサポートされているすべてのメトリックを表示します。
Example 2: ポッドによって報告される Prometheus メトリックを使用する
Deploy a testing application and expose the metrics of the application based on the metric standards of open-source Prometheus. For more information, see METRIC TYPES. The following section describes how to deploy an application named sample-app and expose the http_requests_total metric to indicate the number of requests sent to the application.
テスト アプリケーションをデプロイし、オープンソースの Prometheus のメトリック標準に基づいてアプリケーションのメトリックを公開します。詳細については、「METRIC TYPES」をご参照ください。次のセクションでは、sample-app という名前のアプリケーションをデプロイし、アプリケーションに送信されたリクエスト数を示す http_requests_total
メトリックを公開する方法について説明します。
ワークロードをデプロイします。
ACK コンソール にログオンします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のナビゲーションウィンドウで、
を選択します。[デプロイメント] ページの上部で、[YAML から作成] をクリックします。[作成] ページで、カスタム[サンプル テンプレート] ドロップダウン リストから [作成] を選択し、次のコンテンツをテンプレートに追加して、 をクリックします。
ServiceMonitor を作成します。
Application Real-Time Monitoring Service (ARMS) コンソール にログオンします。
左側のナビゲーションウィンドウで、[統合管理] をクリックします。ページ上部で、クラスターが存在するリージョンを選択します。
統合環境[統合管理] ページの [コンテナー サービス][環境名/ID] タブで、 タブをクリックします。 列で、クラスターと同じ名前を持つ Prometheus インスタンスをクリックします。
[コンテナー サービス] ページで、[メトリック スクレイピング] タブをクリックします。
現在のタブの左側のナビゲーションウィンドウで、[service Monitor] をクリックします。次に、[作成] をクリックします。[servicemonitor 構成の追加] パネルで、[YAML] をクリックし、ServiceMonitor の次の構成を追加して、[作成] をクリックします。
apiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: annotations: arms.prometheus.io/discovery: 'true' name: sample-app namespace: default spec: endpoints: - interval: 30s port: http path: /metrics namespaceSelector: any: true selector: matchLabels: app: sample-app
モニタリングの状態を確認します。
[自己監視] タブのインスタンス詳細ページで、[ターゲット] タブをクリックします。default/sample-app/0(1/1 up) が表示されている場合は、Managed Service for Prometheus がアプリケーションを監視しています。
Prometheus ダッシュボードで、一定期間内の
http_requests_total
の値をクエリして、モニタリングデータがエラーなしで収集されていることを確認します。
Step 2: [ack-alibaba-cloud-metrics-adapter]
ACK コンソール にログオンします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスター] ページで、管理するクラスターを見つけて、その名前をクリックします。左側のナビゲーションウィンドウで、
を選択します。[helm] ページで、ack-alibaba-cloud-metrics-adapter を見つけ、更新[アクション] 列の をクリックします。
[リリースの更新] パネルで、YAML エディターに次のコンテンツを追加し、[OK] をクリックします。
次の表に、いくつかのフィールドについて説明します。 ack-alibaba-cloud-adapter の構成ファイルの詳細については、このトピックのack-alibaba-cloud-metrics-adapter の構成ファイルセクションをご参照ください。
フィールド
説明
AlibabaCloudMetricsAdapter.prometheus.adapter.rules.custom
alibaba-cloud-metrics-adapter の構成。これは、Prometheus メトリックを変換するために使用されます。このフィールドを、上記の YAML コンテンツの値に設定します。
alibabaCloudMetricsAdapter.prometheus.url
Managed Service for Prometheus のエンドポイント。エンドポイントの取得方法の詳細については、このトピックのManaged Service for Prometheus API のエンドポイントを取得するセクションをご参照ください。
AlibabaCloudMetricsAdapter.prometheus.prometheusHeader[].Authorization
The token。詳細については、この Topic のManaged Service for Prometheus API のエンドポイントを取得するセクションをご参照ください。
AlibabaCloudMetricsAdapter.prometheus.adapter.rules.default
事前定義済みのメトリックを作成するかどうかを指定します。デフォルトでは、事前定義済みのメトリックが作成されます。デフォルト値
false
を使用することをお勧めします。
ack-alibaba-cloud-metrics-adapter を構成します。ack-alibaba-cloud-metrics-adapter のデプロイ後、次のコマンドを実行して Kubernetes 集約 API がデータを収集したかどうかを確認します。
カスタム メトリックに基づいてポッドをスケーリングします。
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1" | jq
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/" | jq .
次のコマンドを実行して、デフォルトの名前空間で
http_requests_per_second
メトリックの現在の値をクエリします。# container_memory_working_set_bytes_per_second メトリックをクエリして、kube-system 名前空間のポッドの作業メモリのサイズを 1 秒あたりで表示します。 kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_memory_working_set_bytes_per_second" # container_cpu_usage_core_per_second メトリックをクエリして、kube-system 名前空間のポッドの vCore 数を 1 秒あたりで表示します。 kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/*/container_cpu_usage_core_per_second"
サンプル出力:
{ "kind": "MetricValueList", "apiVersion": "custom.metrics.k8s.io/v1beta1", "metadata": { "selfLink": "/apis/custom.metrics.k8s.io/v1beta1/namespaces/kube-system/pods/%2A/container_memory_working_set_bytes_per_second" }, "items": [ { "describedObject": { "kind": "Pod", "namespace": "kube-system", "name": "ack-alibaba-cloud-metrics-adapter-7cf8dcb845-h****", "apiVersion": "/v1" }, "metricName": "container_memory_working_set_bytes_per_second", "timestamp": "2023-08-09T06:30:19Z", "value": "24576k", "selector": null } ] }
外部メトリックに基づいてポッドをスケーリングします。
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1" | jq
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/" | jq .
次のコマンドを実行して、デフォルトの名前空間で
http_requests_per_second
メトリックの現在の値をクエリします。kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/namespaces/default/http_requests_per_second"
サンプル出力:
{ "kind": "ExternalMetricValueList", "apiVersion": "external.metrics.k8s.io/v1beta1", "metadata": {}, "items": [ { "metricName": "http_requests_per_second", "metricLabels": {}, "timestamp": "2022-01-28T08:40:20Z", "value": "33m" } ] }
ステップ 3:収集されたメトリックに基づいて自動スケーリングを実行するように HPA を構成およびデプロイする
HPA をデプロイする
Prometheus メトリックを使用して、カスタム メトリックと外部メトリックを同時に公開できます。次の表は、2 種類のメトリックについて説明しています。
メトリックの種類 | 説明 |
カスタム メトリック | Kubernetes オブジェクト ( ポッドなど ) を、オブジェクトに関連するメトリックに基づいてスケーリングします。たとえば、ポッドメトリックに基づいてポッドをスケーリングできます。詳細については、「複数のメトリックとカスタムメトリックでの自動スケーリング」をご参照ください。 |
外部メトリック | Kubernetes オブジェクト ( ポッドなど ) を、オブジェクトに関連しないメトリックに基づいてスケーリングします。たとえば、ビジネス QPS に基づいてワークロードのポッドをスケーリングできます。詳細については、「Kubernetes オブジェクトに関連しないメトリックでの自動スケーリング」をご参照ください。 |
カスタム メトリックに基づいてポッドをスケーリングする
`hpa.yaml` という名前のファイルを作成し、次の内容をファイルに追加します。
kind: HorizontalPodAutoscaler apiVersion: autoscaling/v2 metadata: name: sample-app-memory-high spec: # HPA でスケーリングするオブジェクトを記述します。HPA は、オブジェクトにデプロイされているポッドの数を動的に変更できます。 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app # ポッドの最大数と最小数を指定します。 minReplicas: 1 maxReplicas: 10 # HPA が自動スケーリングを実行する基準となるメトリックを指定します。同時に異なるタイプのメトリックを指定できます。 metrics: - type: Pods pods: # pods/container_memory_working_set_bytes_per_second メトリックを使用します。 metric: name: container_memory_working_set_bytes_per_second # AverageValue タイプのしきい値を指定します。Pods メトリックには AverageValue タイプのしきい値のみを指定できます。 target: type: AverageValue averageValue: 1024000m # 1024000m は 1 KB のメモリしきい値を示します。単位: バイト/秒。m は Kubernetes で使用される精度単位です。値に小数点以下の桁数が含まれていて、ACK で高い精度が必要な場合は、m または k 単位が使用されます。たとえば、1001m は 1.001 に等しく、1k は 1000 に等しくなります。
Run the following command to create the HPA: 次のコマンドを実行して HPA を作成します。
kubectl apply -f hpa.yaml
kubectl get hpa
kubectl get hpa sample-app-memory-high
Durable Functions in Python Durable Functions is an extension of Azure Functions that lets you write stateful functions in a serverless compute environment. The extension manages state, checkpoints, and restarts for you. This article gives you an overview of Durable Functions in Python. If you're not already familiar with Azure Functions, see Azure Functions developers guide. For more information about the differences between durable function orchestration in Python and other languages, see the Comparison with other Durable Functions languages article. Durable Functions lets you define stateful workflows in code that can: Interact with other Azure services Chain functions together Define timeouts and retry policies Pass data between functions Manage external events ``` ```html Python の Durable Functions Durable Functions は、サーバーレス コンピューティング環境でステートフル関数を記述できる Azure Functions の拡張機能です。この拡張機能は、状態、チェックポイント、および再起動を管理します。 この記事では、Python の Durable Functions の概要について説明します。Azure Functions に慣れていない場合は、「Azure Functions 開発者ガイド」をご覧ください。 詳細については、「他の Durable Functions 言語との比較」の記事をご参照ください。 Durable Functions を使用すると、次のことができるコードでステートフル ワークフローを定義できます。 他の Azure サービスと連携する 関数を連結する タイムアウトと再試行ポリシーを定義する 関数間でデータを渡す 外部イベントを管理する ```
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-app-memory-high Deployment/sample-app 24576k/1024000m 3 10 1 7m
外部メトリックに基づいてポッドをスケーリングする
`hpa.yaml` という名前のファイルを作成し、次の内容をファイルに追加します。
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: sample-app spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: sample-app minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: http_requests_per_second selector: matchLabels: job: "sample-app" # 外部メトリックには、Value または AverageValue タイプのしきい値のみを指定できます。 target: type: AverageValue averageValue: 500m
Run the following command to create the HPA: 次のコマンドを実行して、HPA を作成します。
kubectl apply -f hpa.yaml
LoadBalancer サービスが作成された後、次のコマンドを実行してストレステストを実行します。
ab -c 50 -n 2000 LoadBalancer(sample-app):8080/
`kubectl describe hpa [HPA名]`
kubectl get hpa sample-app
This document describes how to create an App Service Environment v3 (ASEv3). An ASEv3 is a deployment of the Azure App Service into a subnet in your Azure Virtual Network (VNet). It provides a fully isolated and dedicated environment for securely running your App Service apps at high scale. For more information, see What is an App Service Environment v3?. ``` ```html このドキュメントでは、App Service Environment v3 (ASEv3) を作成する方法について説明します。ASEv3 は、Azure 仮想ネットワーク (VNet) 内のサブネットへの Azure App Service のデプロイです。これは、App Service アプリを安全かつ大規模に実行するための完全に分離された専用環境を提供します。 詳細については、「App Service Environment v3 とは」をご参照ください。 ```
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE sample-app Deployment/sample-app 33m/500m 1 10 1 7m
構成ファイル(ack-alibaba-cloud-metrics-adapter
ack-alibaba-cloud-metrics-adapter は、Prometheus メトリックを HPA でサポートされているメトリックに変換するために、次のステップを実行します。
Discovery: HPA で使用できる Prometheus メトリックを検出します。
Association: Kubernetes リソース ( ポッド、ノード、名前空間など ) とメトリックを関連付けます。
Naming: 変換後に HPA で使用できるメトリックの名前を定義します。
Querying: Managed Service for Prometheus API からメトリック データをクエリする方法を定義します。
In the preceding example, the http_requests_total
メトリック(sample-app ポッドによって公開されます)は、HPA 用の http_requests_per_second
メトリックに変換されます。次のコードブロックは、ack-alibaba-cloud-metrics-adapter の構成を示しています。
- seriesQuery: http_requests_total{namespace!="",pod!=""}
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
name:
matches: ^(.*)_total
as: ${1}_per_second
metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
パラメーター | 説明 |
| Prometheus クエリ言語 (PromQL) はデータをクエリします。 |
| seriesQuery 内の PromQL クエリデータを集計します。 説明
|
| Labels in the PromQL クエリデータ内のラベル。 |
| Prometheus メトリックの名前を、正規表現を使用して読みやすいメトリック名に変換します。この例では、 |
検出
Prometheus メトリックを指定します。
seriesFilters
パラメーターを指定して、メトリックをフィルタリングできます。seriesQuery
パラメーターは、指定されたラベルに基づいてデータと照合します。次のコードブロックの例をご覧ください。seriesQuery: http_requests_total{namespace!="",pod!=""} seriesFilters: - isNot: "^container_.*_seconds_total"
seriesFilters
: オプション。このフィールドはメトリックをフィルタリングします。is:<正規表現>
: この正規表現を含む名前のメトリックと一致します。isNot:<正規表現>
: この正規表現を含まないメトリック名に一致します。
関連付け
Prometheus メトリックのラベルを Kubernetes リソースにマッピングします。
http_requests_total
メトリックのラベルはnamespace!=""
とpod!=""
です。- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"}
命名
Prometheus メトリックから変換される HPA メトリックに名前を付けます。Prometheus メトリックの名前は変更されません。Prometheus メトリックを直接使用する場合は、名前設定を構成する必要はありません。
kubectl get --raw "/apis/custom.metrics.k8s.io/v1beta1"
コマンドを実行して、HPA でサポートされているメトリックをクエリできます。- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: "^(.*)_total" as: "${1}_per_second"
クエリ
Managed Service for Prometheus API に送信されるリクエストのテンプレート。ack-alibaba-cloud-adapter は、HPA のパラメーターをリクエストテンプレートに渡し、テンプレートに基づいて Managed Service for Prometheus API にリクエストを送信し、返されたパラメーター値を自動スケーリングのために HPA に送信します。
- seriesQuery: http_requests_total{namespace!="",pod!=""} resources: overrides: namespace: {resource: "namespace"} pod: {resource: "pod"} name: matches: ^(.*)_total as: ${1}_per_second metricsQuery: sum(rate(<<.Series>>{<<.LabelMatchers>>}[2m])) by (<<.GroupBy>>)
Managed Service for Prometheus API のエンドポイントを取得します
シナリオ 1:Managed Service for Prometheus
ACK コンソール にログオンします。左側のナビゲーションウィンドウで、[クラスタ] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、その名前をクリックします。左側のペインで、 を選択します。
[ARMS Prometheus に移動] を右上隅でクリックします。
左側のナビゲーションウィンドウで、[設定] をクリックします。次に、[構成] タブをクリックし、[HTTP API URL (grafana Read URL)] を表示します。
マネージドサービス for Prometheus API は、内部ネットワーク経由で呼び出すことをお勧めします。内部ネットワークを使用できない場合は、インターネット経由で API を呼び出すことができます。
シナリオ 2:オープンソース Prometheus
オープンソースのセルフマネージド Prometheus ソリューションの場合は、Service を使用して標準 Prometheus API を公開する必要があります。次に、metrics-adapter コンポーネントで Prometheus データソース URL の相対パラメーターを構成し、オープンソース Prometheus からのデータに基づいて HPA データソースの構成を完了します。
次の例では、ACK コンソールの Marketplace ページにある Helm Chart コミュニティ アプリケーション ack-prometheus-operator を使用します。詳細については、「オープンソースの Prometheus を使用して ACK クラスタを監視する」をご参照ください。
Managed Service for Prometheus をデプロイし、Prometheus の標準 API を公開します。
ACK コンソール にログインします。左側のナビゲーションウィンドウで、 を選択します。
[アプリカタログ] ページで、[ack-prometheus-operator] を見つけてクリックします。表示されるページで、[デプロイ] をクリックします。
表示されるパネルで、[クラスタ] パラメーターと [名前空間] パラメーターを構成し、ビジネス要件に基づいて [リリース名] パラメーターを変更し、[次へ] をクリックします。[パラメーター] セクションをビジネス要件に基づいて変更し、[OK] をクリックします。
デプロイ結果を表示します。
Service を使用して標準 Prometheus API を公開します。 ack-prometheus-operator から Service
ack-prometheus-operator-prometheus
を例として使用します。ServiceIP:9090
をブラウザのアドレスバーに入力し、Prometheus コンソールにアクセスするために Server Load Balancer (SLB) インスタンスにアクセスできるようサービスのインターネットアクセスを有効にします。ブラウザのアドレスバーに入力し、サービスが Server Load Balancer (SLB) インスタンスにアクセスして Prometheus コンソールにアクセスできるようにインターネット経由のアクセスを有効にします。
上部のナビゲーションバーで、
を選択してすべてのコレクションタスクを表示します。[UP] 状態のタスクは想定どおりに実行されています。
[サービス] 列と [名前空間] 列で [ラベル] を確認します。
次のコードブロックはエンドポイントを示しています。この例では、ServiceName は ack-prometheus-operator-prometheus で、ServiceNamespace は monitoring です。
http://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090
コンポーネントの構成で、Prometheus データソースの URL パラメーターを設定して、コンポーネントと Prometheus 間の適切な通信を確保します。
インターネット経由で Prometheus API にアクセスすることを選択した場合は、構成について次の例をご参照ください。
AlibabaCloudMetricsAdapter: ...... prometheus: enabled: true url: http://your_domain.com:9090 # your_domain.com をパブリック IP アドレスに置き換えます。
ack-prometheus-operator を例として使用すると、
url
値はhttp://ack-prometheus-operator-prometheus.monitoring.svc.cluster.local:9090
です。
関連情報
詳細については、「Alibaba Cloud メトリックに基づいて水平 Auto Scaling を実装する」をご参照ください。
詳細については、「NGINX Ingress トラフィック メトリックに基づいて複数のアプリケーションのポッド数を動的に調整する水平ポッド自動スケーリング」をご参照ください。