アプリケーションが単位時間あたりに受信したリクエスト数に基づいてコンピューティングリソースの総量を動的に調整する必要がある場合は、application Load Balancer (ALB) インスタンスによって収集されたQPSデータを使用して、アプリケーションのポッドの自動スケーリングを設定できます。
あなたが始める前に
開始する前に、「ALB Ingressの作成」を読んで、ALB Ingressの基本機能について確認することをお勧めします。
仕組み
1秒あたりのクエリ数 (QPS) は、1秒あたりに受信したリクエストの数です。 ALBインスタンスは、Simple Log Service (SLS) を介してクライアントアクセスデータを記録できます。 Horizontal Pod Autoscaler (HPA) は、これらのアクセスレコードに基づいてサービスのQPSデータを監視し、対応するワークロード (DeploymentやStatefulSetなど) をスケールできます。
前提条件
alibaba-cloud-metrics-adapterコンポーネントがインストールされており、バージョンは2.3.0以降です。 詳細については、「alibaba-cloud-metrics-adapterのデプロイ」をご参照ください。
Apache Benchmarkストレステストツールがインストールされています。 詳細については、公式ドキュメントの「コンパイルとインストール」をご参照ください。
kubectlクライアントがACKクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
2つのスイッチは、異なる可用性ゾーンに作成され、クラスターと同じVPCにあります。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。
ステップ1: AlbConfigを作成し、SLSプロジェクトを関連付ける
クラスターに関連付けられているSLSプロジェクトを確認します。
ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターの名前をクリックします。 左側のウィンドウで、[クラスター情報] をクリックします。
[基本情報] タブで、[Log Service Project] リソースを見つけ、右側にSLSプロジェクトの名前を記録します。
AlbConfigを作成します。
次のコンテンツを作成してalb-qps.yamlにコピーし、SLSプロジェクト情報を
accessLogConfig
フィールドに入力します。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-qps spec: config: name: alb-qps addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # ID of the virtual switch - vSwitchId: vsw-uf6nun9tql5t8nh15**** accessLogConfig: logProject: <LOG_PROJECT> # Name of the log project associated with the cluster logStore: <LOG_STORE> # Custom logstore name, must start with "alb_" listeners: - port: 80 protocol: HTTP
次の表に、上記のコードブロックのフィールドを示します。
項目
タイプ
説明
logProject
String
Simple Log Service (SLS) プロジェクトの名前。
デフォルト値:
""
logStore
String
SLS Logstoreの名前。
alb_
で始まる必要があります。 SLS Logstoreは、存在しない場合は自動的に作成されます。 詳細については、「Simple Log Serviceによるアクセスログの収集」をご参照ください。デフォルト値:
""
次のコマンドを実行して、AlbConfigを作成します。
kubectl apply -f alb-qps.yaml
期待される出力:
albconfig.alibabacloud.com/alb-qps created
手順2: サンプルリソースの作成
ALB Ingressには、AlbConfigに加えて、Deployment、Service、IngressClass、Ingressの4種類のリソースが必要です。 次の例を使用して、これらのリソースをすばやく作成できます。
次の内容のqps-quickstart.yamlファイルを作成します。
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: qps-ingressclass spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-qps # Same as the name of AlbConfig --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: qps-ingress spec: ingressClassName: qps-ingressclass # Same as the name of Ingress Class rules: - host: demo.alb.ingress.top # Replace with your domain name http: paths: - path: /qps pathType: Prefix backend: service: name: qps-svc port: number: 80 --- apiVersion: v1 kind: Service metadata: name: qps-svc namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: qps-deploy type: NodePort --- apiVersion: apps/v1 kind: Deployment metadata: name: qps-deploy labels: app: qps-deploy spec: replicas: 2 selector: matchLabels: app: qps-deploy template: metadata: labels: app: qps-deploy spec: containers: - name: qps-container image: nginx:1.7.9 ports: - containerPort: 80
次のコマンドを実行して、サンプルリソースを作成します。
kubectl apply -f qps-quickstart.yaml
ステップ3: HPAを作成する
qps-hpa.yamlファイルを作成し、次のコンテンツをコピーして保存します。
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: qps-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: qps-deploy # Name of the workload controlled by HPA minReplicas: 2 # Minimum number of pods maxReplicas: 10 # Maximum number of pods metrics: - type: External external: metric: name: sls_alb_ingress_qps # Metric name for QPS data, do not modify selector: matchLabels: sls.project: <LOG_PROJECT> # Name of the log project associated with the cluster sls.logstore: <LOG_STORE> # Custom logstore name sls.ingress.route: default-qps-svc-80 # Path of the service, parameter format is <namespace>-<svc>-<port> target: type: AverageType averageValue: 2 # Expected target for the metric, in this example, the average QPS for all pods is 2
次の表に、上記のコードブロックのフィールドを示します。
項目
説明
scaleTargetRef
アプリケーションによって使用されるワークロード。 この例では、手順1で作成したqps-Deploymentという名前のdeploymentを使用します。
minReplicas
展開をスケーリングできるコンテナーの最小数。 この値は、1以上の整数に設定する必要がある。
maxReplicas
展開をスケーリングできるコンテナーの最大数。 この値は、レプリカの最小数より大きい必要があります。
external.metric.name
HPAのQPSベースのメトリック。 値を変更しないでください。
sls.project
メトリックのSLSプロジェクト。 AlbConfigで指定されたSLSプロジェクトに値を設定します。
sls.logstore
メトリックのLogstore。The Logstore for the metric. 値をAlbConfigで指定されたLogstoreに設定します。
sls.ingress.route
サービスのパス。 値を <namespace>-<svc>-<port> 形式で指定します。 この例では、手順1で作成したqps-svcサービスを使用します。
external.tar get
メトリックのターゲット値。 この例では、すべてのポッドの平均QPSは2です。 HPAは、QPSを可能な限り目標値に近づけるようにポッドの数を調整します。
次のコマンドを実行してHPAを作成します。
kubectl apply -f qps-hpa.yaml
次のコマンドを実行して、HPAの展開ステータスを確認します。
kubectl get hpa
期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE qps-hpa Deployment/qps-deploy 0/2 (avg) 2 10 2 5m41s
次のコマンドを実行してHPA設定情報を表示します。
kubectl describe hpa qps-hpa
期待される出力:
Name: qps-hpa Namespace: default Labels: <none> Annotations: <none> CreationTimestamp: ******** # Timestamp of HPA, can be ignored Reference: Deployment/qps-deployment 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: 自動スケーリングの確認
アプリケーションのスケールアウトを確認します。
次のコマンドを実行して、Ingress情報を表示します。
kubectl get ingress
期待される出力:
NAME CLASS HOSTS ADDRESS PORTS AGE qps-ingress qps-ingressclass demo.alb.ingress.top alb-********.alb.aliyuncs.com 80 10m31s
HOSTS
とADDRESS
の値を記録し、後続のステップで使用します。次のコマンドを実行して、アプリケーションでストレステストを実行します。
demo.alb.ingress.top
およびalb-******** .alb.aliyuncs.com
を前の手順で取得した値に置き換えます。ab -r -c 5 -n 10000 -H Host:demo.alb.ingress.top http://alb-********.alb.aliyuncs.com/qps
次のコマンドを実行して、アプリケーションのスケーリングステータスを確認します。
kubectl get hpa
期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE qps-hpa Deployment/qps-deploy 14375m/2 (avg) 2 10 10 15m
結果は、
REPLICAS
が10であることを示しており、QPSデータが増加するにつれて、アプリケーションのポッドの数が10にスケールアウトされることを示しています。
アプリケーションのスケールインを確認します。
ストレステストが完了したら、次のコマンドを実行して、アプリケーションのスケーリング状態を確認します。
kubectl get hpa
期待される出力:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE qps-hpa Deployment/qps-deploy 0/2 (avg) 2 10 2 28m
結果は、
REPLICAS
が2であり、QPSデータが0に落ちた後、アプリケーションが2ポッドにスケールインされることを示しています。
関連ドキュメント
ポッドCPUまたはメモリ負荷に基づいてアプリケーションをスケーリングする必要がある場合は、「Horizontal pod Autoscaler (HPA) 」をご参照ください。
アプリケーションのスケーリングをスケジュールする必要がある場合は、「Cron Horizontal Pod Autoscaler (CronHPA) 」をご参照ください。
ノードの自動スケーリングについては、「ノードスケーリングの概要」をご参照ください。