アプリケーションがリクエスト量に基づいてコンピューティングリソースを動的に調整する必要がある場合、Application Load Balancer (ALB) インスタンスからのクエリ/秒 (QPS) データを使用して、その Pod の自動スケーリングを設定できます。
事前準備
開始する前に、「ALB Ingress を作成してサービスを公開する」をご参照のうえ、ALB Ingress の基本を学習してください。
仕組み
クエリ/秒 (QPS) は、1 秒あたりに受信されるリクエストの数です。Application Load Balancer (ALB) インスタンスは Simple Log Service (SLS) を使用してクライアントのアクセスデータを記録します。Horizontal Pod Autoscaler (HPA) は、これらのレコードからサービスの QPS データをモニターし、デプロイメントや StatefulSet などの対応するワークロードをスケーリングします。
前提条件
バージョン 2.3.0 以降の alibaba-cloud-metrics-adapter コンポーネントがインストールされていること。詳細については、「ack-alibaba-cloud-metrics-adapter コンポーネントのデプロイ」をご参照ください。
Apache Benchmark ストレステストツールがインストールされていること。詳細については、Compiling and Installing の公式ドキュメントをご参照ください。
kubectl クライアントが ACK クラスターに接続されていること。詳細については、「クラスターの kubeconfig を取得し、kubectl を使用してクラスターに接続する」をご参照ください。
ステップ 1: AlbConfig の作成と Simple Log Service プロジェクトの関連付け
クラスターに関連付けられている SLS プロジェクトを表示します。
ACK コンソールにログインします。左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[基本情報] タブで、[Simple Log Service プロジェクト] リソースを見つけ、プロジェクト名を記録します。
AlbConfig を作成します。
alb-qps.yaml という名前のファイルを作成し、次の内容をファイルにコピーしてから、
accessLogConfigフィールドに SLS プロジェクトの詳細を指定します。apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-qps spec: config: name: alb-qps addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # vSwitch の ID。 - vSwitchId: vsw-uf6nun9tql5t8nh15**** accessLogConfig: logProject: <LOG_PROJECT> # クラスターに関連付けられている SLS プロジェクトの名前。 logStore: <LOG_STORE> # カスタム Logstore の名前。名前は「alb_」で始まる必要があります。 listeners: - port: 80 protocol: HTTP各フィールドの説明は次のとおりです:
フィールド
タイプ
説明
logProject
string
Simple Log Service (SLS) プロジェクトの名前。
デフォルト値:
""。logStore
string
SLS Logstore の名前。名前は
alb_で始まる必要があります。Logstore が存在しない場合は、自動的に作成されます。SLS Logstore の設定例については、「アクセスログの有効化」をご参照ください。デフォルト値:
"alb_****"。次のコマンドを実行して AlbConfig を作成します。
kubectl apply -f alb-qps.yaml期待される出力:
albconfig.alibabacloud.com/alb-qps created
ステップ 2: サンプルリソースの作成
AlbConfig に加えて、ALB Ingress が機能するには、デプロイメント、サービス、IngressClass、および Ingress が必要です。次の手順に従って、これらのリソースを迅速に作成します。
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 # AlbConfig の名前。 --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: qps-ingress spec: ingressClassName: qps-ingressclass # IngressClass の名前。 rules: - host: demo.alb.ingress.top # これをご利用のドメイン名に置き換えてください。 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 # HPA がコントロールするワークロードの名前。 minReplicas: 2 # Pod の最小数。 maxReplicas: 10 # Pod の最大数。 metrics: - type: External # 外部メトリック (Kubernetes のネイティブメトリックではない) を使用します。 external: metric: name: sls_alb_ingress_qps # メトリックの名前 (Alibaba Cloud ALB Ingress の QPS)。この値は変更しないでください。 selector: matchLabels: sls.project: <LOG_PROJECT> # SLS プロジェクトの名前。これを実際のプロジェクト名に置き換えてください。 sls.logstore: <LOG_STORE> # Logstore の名前。これを実際の Logstore 名に置き換えてください。 sls.ingress.route: default-qps-svc-80 # サービスのパス。フォーマットは <namespace>-<svc>-<port> です。 target: type: AverageValue # ターゲットメトリックのタイプ (平均値)。 averageValue: "2" # メトリックの期待されるターゲット値。この例では、すべての Pod の平均 QPS は 2 です。各フィールドの説明は次のとおりです:
フィールド
説明
scaleTargetRef
アプリケーションのワークロード。この例では、ステップ 2 で作成された
qps-deployという名前のデプロイメントを指します。minReplicas
デプロイメントがスケールインできる Pod の最小数。この値は 1 以上の整数である必要があります。
maxReplicas
デプロイメントがスケールアウトできる Pod の最大数。この値はレプリカの最小数より大きい必要があります。
external.metric.name
QPS データに基づいており、HPA によって使用されるメトリック。この値は変更しないでください。
sls.project
メトリックの基になる SLS プロジェクト。値は AlbConfig で指定されたものと同じである必要があります。
sls.logstore
メトリックの基になる Logstore。値は AlbConfig で指定されたものと同じである必要があります。
sls.ingress.route
サービスのパスには、<namespace>-<svc>-<port> というフォーマットが使用されます。この例では、パスは ステップ 1 で作成された qps-svc サービス用です。
external.target
メトリックの期待されるターゲット値。この例では、すべての Pod の平均 QPS は 2 です。HPA は、QPS を可能な限りターゲット値に近づけるように Pod の数をコントロールします。
次のコマンドを実行して 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: ******** # HPA のタイムスタンプです。このパラメーターは無視できます。 Reference: Deployment/qps-deploy 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 が増加するにつれて、アプリケーション Pod の数がMAXPODSの値である 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 に低下した後、アプリケーション Pod の数がMINPODSの値である 2 にスケールインすることを示します。
関連ドキュメント
Pod の CPU またはメモリ使用量に基づいてアプリケーションをスケーリングするには、「水平ポッド自動スケーリング (HPA)」をご参照ください。
アプリケーションのスケーリングをスケジュールするには、「コンテナ定時スケーリング (CronHPA)」をご参照ください。
ノードの自動スケーリングについては、「ノードの自動スケーリング」をご参照ください。