アプリケーションのリクエスト数に応じて計算リソースを動的に調整する必要がある場合、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 などの対応するワークロードをスケーリングします。
前提条件
-
alibaba-cloud-metrics-adapter コンポーネントのバージョン 2.3.0 以降がインストール済みである必要があります。詳細については、「ack-alibaba-cloud-metrics-adapter コンポーネントのデプロイ」をご参照ください。
-
Apache Benchmark ストレステストツールがインストール済みである必要があります。詳細については、公式ドキュメント「Compiling and Installing」をご参照ください。
kubectl クライアントが ACK クラスターに接続済みである必要があります。詳細については、「kubectl を使用した ACK クラスターへの接続」をご参照ください。
手順 1:AlbConfig の作成と Simple Log Service プロジェクトの関連付け
-
クラスターに関連付けられた Simple Log Service プロジェクトを確認します。
-
Container Service Management Console にログインします。左側のナビゲーションウィンドウで、クラスターリスト をクリックします。
-
クラスターリスト ページで、ご利用のクラスター名をクリックします。左側のナビゲーションウィンドウで、クラスター情報 をクリックします。
-
基本情報 タブで、Log Service プロジェクト リソースを確認し、右側に表示されるプロジェクト名を記録します。
-
-
AlbConfig を作成します。
-
ファイル名を `alb-qps.yaml` として作成し、以下の内容をコピーして貼り付け、`
accessLogConfig` フィールドに Simple Log Service プロジェクト情報を入力します。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> # クラスターに関連付けられた Simple Log Service プロジェクトの名称 logStore: <LOG_STORE> # カスタム Logstore 名。先頭は "alb_" で始める必要があります。 listeners: - port: 80 protocol: HTTP次の表にフィールドの説明を示します。
-
以下のコマンドを実行して AlbConfig を作成します。
kubectl apply -f alb-qps.yaml期待される出力:
albconfig.alibabacloud.com/alb-qps created
-
手順 2:サンプルリソースの作成
AlbConfig に加えて、ALB Ingress はデプロイメント、サービス、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 # 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> # Simple Log Service プロジェクト名。実際のプロジェクト名に置き換えてください。 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
アプリケーションで使用されるワークロード。本例では、手順 1 で作成したデプロイメント `
qps-deploy` を使用します。minReplicas
スケールイン可能な最小 Pod 数。この値は 1 以上の整数である必要があります。
maxRaplicas
スケールアウト可能な最大 Pod 数。この値は最小 Pod 数より大きい必要があります。
external.metric.name
HPA が使用する QPS データのメトリック名。この値は変更しないでください。
sls.project
メトリックデータを提供する Simple Log Service プロジェクト。これは AlbConfig で指定したプロジェクトと同一である必要があります。
sls.logstore
メトリックデータを提供する Logstore。これは AlbConfig で指定した Logstore と同一である必要があります。
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 の増加に伴い、`MAXPODS` で指定された最大 10 個の Pod までアプリケーションがスケールアウトしたことを示しています。
-
-
アプリケーションのスケールインを検証します。
ストレステストが完了した後、以下のコマンドを実行してアプリケーションのスケーリング状態を確認します。
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 に低下した後、`MINPODS` で指定された最小 2 個の Pod までアプリケーションがスケールインしたことを示しています。
参考文献
-
Pod の CPU 使用率またはメモリ使用量に基づいてアプリケーションをスケーリングする場合は、「水平ポッド自動スケーリング(HPA)」をご参照ください。
-
スケジュールに基づいてアプリケーションをスケーリングする場合は、「定時水平ポッド自動スケーリング(CronHPA)」をご参照ください。
-
ノードのスケーリングについては、「ノードのスケーリング」をご参照ください。