Service Mesh (ASM) は、Alibaba Cloud Container Service for Kubernetes (ACK) および Alibaba Cloud Container Service (ACS) クラスター内でのサービス間通信について、テレメトリデータを生成するための非侵入的な方法を提供します。このテレメトリ機能は、サービスの動作に対する可観測性を提供します。これにより、運用保守 (O&M) エンジニアは、アプリケーションコードを変更することなく、アプリケーションのトラブルシューティング、メンテナンス、および最適化を行うことができます。モニタリングの 4 つのゴールデンシグナル (レイテンシー、トラフィック、エラー、飽和度) に基づいて、ASM は管理対象のサービスの一連のメトリックを生成します。このトピックでは、ASM メトリックを使用してワークロードの自動スケーリングを実装する方法について説明します。
前提条件
ACK クラスターまたは ACS クラスターが作成されていること。詳細については、「ACK マネージドクラスターの作成」または「ACS クラスターの作成」をご参照ください。
ASM インスタンスが作成されていること。詳細については、「ASM インスタンスの作成」をご参照ください。
クラスターに Prometheus インスタンスと Grafana インスタンスが作成されていること。詳細については、「オープンソースの Prometheus モニタリング」をご参照ください。
Prometheus がメッシュモニタリング用に統合されていること。詳細については、「セルフマネージド Prometheus インスタンスをメッシュモニタリング用に統合する」をご参照ください。
背景情報
Service Mesh は、管理対象のサービスに対して一連のメトリックを生成します。詳細については、「Istio 標準メトリック」をご参照ください。
自動スケーリングは、リソース使用量に基づいてワークロードを自動的にスケールアップまたはスケールダウンする方法です。Kubernetes は、自動スケーリングのために 2 つのディメンションを提供します:
Cluster Autoscaler (CA):ノードのスケーリング操作を処理し、ノード数を増減させます。
Horizontal Pod Autoscaler (HPA):デプロイメント内の Pod 数を自動的にスケーリングします。
Kubernetes の集約レイヤーにより、サードパーティのアプリケーションは API アドオンコンポーネントとして登録することで Kubernetes API を拡張できます。これらのアドオンコンポーネントは Custom Metrics API を実装でき、HPA が任意のメトリックにアクセスできるようにします。HPA は、Resource Metrics API を介して CPU やメモリなどのコアメトリックを定期的にクエリします。また、Custom Metrics API を介して、ASM が提供する可観測性メトリックを含むアプリケーション固有のメトリックを取得します。
ステップ 1:Prometheus モニタリングメトリックの収集の有効化
詳細については、「Managed Service for Prometheus でモニタリングメトリックを収集する」をご参照ください。
ステップ 2:カスタムメトリック API アダプターのデプロイ
ACK クラスターに kube-metrics-adapter をダウンロードしてインストールします。
helm -n kube-system install asm-custom-metrics ./kube-metrics-adapter --set prometheus.url=http://prometheus.istio-system.svc:9090kube-metrics-adapter が有効になっていることを確認します。
autoscaling/v2が存在することを確認します。kubectl api-versions | grep "autoscaling/v2"想定される出力:
autoscaling/v2kube-metrics-adapter Pod のステータスを確認します。
kubectl get po -n kube-system |grep metrics-adapter想定される出力:
asm-custom-metrics-kube-metrics-adapter-85c6d5d865-2**** 1/1 Running 0 19sPrometheus アダプターが提供するカスタム外部メトリックをリスト表示します。
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1" | jq .想定される出力:
{ "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "external.metrics.k8s.io/v1beta1", "resources": [] }
ステップ 3:サンプルアプリケーションのデプロイ
test 名前空間を作成し、自動サイドカーインジェクションを有効にします。詳細については、「名前空間とクォータの管理」および「自動インジェクションの有効化」をご参照ください。
サンプルアプリケーションをデプロイします。
次の内容で `podinfo.yaml` という名前のファイルを作成します。
podinfo をデプロイします。
kubectl apply -n test -f podinfo.yaml
test 名前空間に負荷テストサービスをデプロイして、自動スケーリングをトリガーします。
`loadtester.yaml` という名前のファイルを作成します。
負荷テストサービスをデプロイします。
kubectl apply -n test -f loadtester.yaml
サンプルアプリケーションと負荷テストサービスがデプロイされていることを確認します。
Pod のステータスを確認します。
kubectl get pod -n test想定される出力:
NAME READY STATUS RESTARTS AGE loadtester-64df4846b9-nxhvv 2/2 Running 0 2m8s podinfo-6d845cc8fc-26xbq 2/2 Running 0 11m負荷テスターコンテナーにログインし、負荷を生成します。
export loadtester=$(kubectl -n test get pod -l "app=loadtester" -o jsonpath='{.items[0].metadata.name}') kubectl -n test exec -it ${loadtester} -c loadtester -- hey -z 5s -c 10 -q 2 http://podinfo.test:9898正常な応答が返された場合は、負荷が生成され、サンプルアプリケーションと負荷テストサービスがデプロイされたことを示します。
ステップ 4:ASM メトリックを使用した HPA の設定
1 秒あたりの受信リクエスト数に基づいて podinfo ワークロードをスケーリングする HPA を定義します。平均トラフィック負荷が 1 秒あたり 10 リクエストを超えると、HPA はデプロイメントをスケールアウトします。
注:この例では、Kubernetes 1.23 以降に適用される HPA API バージョン `autoscaling/v2` を使用します。Kubernetes 1.26 以降を実行するクラスターでは、バージョン `v2` を使用してください。`v2beta2` バージョンは Kubernetes 1.26 で削除されました。
`hpa.yaml` という名前のファイルを作成します。
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: podinfo namespace: test annotations: metric-config.external.prometheus-query.prometheus/processed-requests-per-second: | sum( rate( istio_requests_total{ destination_workload="podinfo", destination_workload_namespace="test", reporter="destination" }[1m] ) ) spec: maxReplicas: 10 minReplicas: 1 scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: podinfo metrics: - type: External external: metric: name: prometheus-query selector: matchLabels: query-name: processed-requests-per-second target: type: AverageValue averageValue: "10"HPA をデプロイします。
kubectl apply -f hpa.yamlHPA がデプロイされていることを確認します。
Prometheus アダプターが提供するカスタム外部メトリックをリスト表示します。
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1" | jq .想定される出力:
{ "kind": "APIResourceList", "apiVersion": "v1", "groupVersion": "external.metrics.k8s.io/v1beta1", "resources": [ { "name": "prometheus-query", "singularName": "", "namespaced": true, "kind": "ExternalMetricValueList", "verbs": [ "get" ] } ] }出力にカスタム ASM メトリックのリソースリストが含まれていれば、HPA が正常にデプロイされたことを示します。
自動スケーリングの確認
負荷テスターコンテナーにログインして、ワークロードリクエストを生成します。
kubectl -n test exec -it ${loadtester} -c loadtester -- hey -z 5m -c 10 -q 5 http://podinfo.test:9898自動スケーリングのステータスを確認します。
説明デフォルトでは、メトリックは 30 秒ごとに同期されます。スケーリング操作は、ワークロードが過去 3〜5 分間に再スケーリングされていない場合にのみ発生します。これにより、HPA が性急で矛盾した決定を下すのを防ぎ、クラスターオートスケーラーが動作する時間を確保できます。
watch kubectl -n test get hpa/podinfo想定される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE podinfo Deployment/podinfo 8308m/10 (avg) 1 10 6 124m1 分後、HPA は 1 秒あたりのリクエスト数がターゲット値を下回るまでワークロードのスケールアップを開始します。負荷テストが完了すると、1 秒あたりのリクエスト数はゼロになり、HPA はワークロード Pod 数のスケールダウンを開始します。数分後、コマンド出力のレプリカ数は 1 に戻ります。