アプリケーションがリクエスト量に基づいて合計コンピューティングリソースを動的に調整する必要がある場合は、Log Service からの ALB Ingress の QPS メトリクスを使用して、HPA でアプリケーション Pod を自動スケーリングします。
前提条件
次の要件が満たされていることを確認します。
-
alibaba-cloud-metrics-adapter バージョン 2.3.0 以降がインストールされていること。
-
ALB Ingress コントローラーがインストールされていること。
-
Apache Benchmark がインストールされていること。
-
Log Service プロジェクトが作成されていること。
-
クラスターが存在する Virtual Private Cloud (VPC) の異なるゾーンに 2 つのvSwitch がデプロイされていること。
仕組み
-
アプリケーション用の Deployment と Service を作成します。
-
外部トラフィックを Service にルーティングするための ALB Ingress を作成します。
-
Log Service からの
sls_alb_ingress_qpsメトリクスを監視する Horizontal Pod Autoscaler (HPA) を作成します。 -
QPS が Pod あたりのしきい値を超えると、HPA は Deployment をスケールアウトします。QPS が低下すると、HPA はスケールインします。
ステップ 1:アプリケーションと Service の作成
-
tea.yamlという名前のファイルを作成します。apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: tea spec: replicas: 2 selector: matchLabels: app: tea template: metadata: labels: app: tea spec: containers: - name: tea image: nginx:1.7.9 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: tea-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: tea type: NodePort -
マニフェストを適用します。
kubectl apply -f tea.yaml
ステップ 2:ALB Ingress の作成
AlbConfigオブジェクトの作成
-
クラスターに関連付けられている Log Service プロジェクトを検索します。ACK コンソールで、クラスターの詳細ページを開き、[クラスター情報] タブを選択し、[Log Service プロジェクト] を見つけて、プロジェクト名を記録します。
alb-test.yamlという名前のファイルを作成します。フィールド 説明 zoneMappings同じ VPC 内の異なるゾーンにある、少なくとも 2 つの vSwitch ID。 logProjectLog Service プロジェクト名。 logStoreLogstore 名。 alb_で始まる必要があります。存在しない場合は自動的に作成されます。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressType: Internet # インターネット向けのALB zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 1つ目の vSwitch ID に置き換えます - vSwitchId: vsw-uf6nun9tql5t8nh15**** # 2つ目の vSwitch ID (異なるゾーン) に置き換えます accessLogConfig: logProject: "****" # Log Service プロジェクト名に置き換えます logStore: "alb_****" # Logstore 名に置き換えます。alb_ で始まる必要があります -
マニフェストを適用します。
kubectl apply -f alb-test.yaml
IngressClassの作成
-
alb.yamlという名前のファイルを作成します。apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-demo # 上記の AlbConfig の metadata.name と一致させる必要があります -
マニフェストを適用します。
kubectl apply -f alb.yaml
Ingressの作成
-
tea-ingress.yamlという名前のファイルを作成します。apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: tea-ingress spec: ingressClassName: alb rules: - host: demo.ingress.top http: paths: - path: /tea pathType: Prefix backend: service: name: tea-svc port: number: 80 -
マニフェストを適用します。
kubectl apply -f tea-ingress.yaml -
Ingress に割り当てられた ALB アドレスを取得します。
kubectl get ingress想定される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE tea-ingress alb demo.ingress.top alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com 80 7m5sステップ 4 のストレステストのために、
ADDRESSの値をメモしておきます。
ステップ 3:HPA の作成
-
hpa.yamlという名前のファイルを作成します。apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: ingress-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment-basic # スケール対象のDeployment minReplicas: 2 # Podの最小数 maxReplicas: 10 # Podの最大数 metrics: - type: External external: metric: name: sls_alb_ingress_qps # Log ServiceからのALB QPSメトリクス selector: matchLabels: sls.project: "****" # Log Service プロジェクト名に置き換えます sls.logstore: "alb_****" # Logstore 名に置き換えます sls.ingress.route: "default-tea-svc-80" # 形式:<名前空間>--<ポート> # 例:default-nginx-80 target: type: AverageValue # Podあたりの平均QPSに基づいてスケーリング averageValue: 2 # Podあたりの平均QPSが2を超えるとスケールアウト この HPA は、
nginx-deployment-basicを 2 から 10 の Pod の間でスケーリングします。Pod あたりの平均 QPS が 2 を超えるとスケールアウトし、QPS が低下するとスケールインします。 -
マニフェストを適用します。
kubectl apply -f hpa.yaml -
HPA が作成されたことを確認します。
kubectl get hpa想定される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ingress-hpa Deployment/nginx-deployment-basic 0/2 (avg) 2 10 2 4h34mまだアプリケーションにトラフィックが到達していないため、QPS は
0です。Pod 数は最小値 (2) になっています。 -
(オプション) HPA の詳細を確認します。
kubectl describe hpa ingress-hpa想定される出力:
Name: ingress-hpa Namespace: default Labels: <none> Annotations: <none> CreationTimestamp: Tue, 31 Jan 2023 11:35:01 +0800 Reference: Deployment/nginx-deployment-basic Metrics: ( current / target ) "sls_alb_ingress_qps" (target average value): 0 / 2 Min replicas: 2 Max replicas: 10 Deployment pods: 2 current / 2 desired
ステップ 4:自動スケーリングの検証
スケールアウトの検証
-
ステップ 2 で取得した ALB アドレスに対してストレステストを実行します。プレースホルダーを実際のアドレスに置き換えます。
ab -c 5 -n 5000 -H Host:demo.ingress.top http://alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com/tea -
テストの実行中に、HPA のステータスをリアルタイムで監視します。
kubectl get hpa ingress-hpa --watchQPS がしきい値を超えると、レプリカ数が増加します。[Ctrl]+[C] を押して停止します。
-
ストレステストの後、スケールアウトを確認します。
kubectl get hpa想定される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ingress-hpa Deployment/nginx-deployment-basic 12500m/2 (avg) 2 10 10 15mREPLICASが10になっており、Deployment が最大数までスケールアウトしたことが確認できます。
スケールインの検証
ストレステストが終了すると、QPS は 0 に低下し、HPA は Deployment をスケールインします。スケールインには約 5 分間の安定化ウィンドウがあるため、確認する前にしばらく待ちます。
kubectl get hpa
想定される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
ingress-hpa Deployment/nginx-deployment-basic 0/2 (avg) 2 10 2 60m
REPLICAS が 2 に戻っており、Deployment がスケールインしたことが確認できます。
次のステップ
-
HPA 仕様の
behaviorフィールドを設定して、スケールアウトとスケールインを調整できます。 -
追加のAlibaba Cloud メトリクスに基づいてスケーリングできます。