ALB Ingress支持根據ALB后端統計的QPS數據進行應用的自動擴容和縮容,保障應用的穩定性以及達到更好的成本控制。本文介紹如何通過ALB Ingress實現基于QPS數據的應用彈性伸縮。
前提條件
已安裝alibaba-cloud-metrics-adapter組件,且版本為2.3.0及以上。具體操作,請參見基于阿里云組件指標的容器水平伸縮。
已安裝ALB Ingress Controller組件。具體操作,請參見管理ALB Ingress Controller組件。
已安裝壓力測試工具Apache Benchmark。更多信息,請參見Apache Benchmark。
已在日志服務中創建Project。具體操作,請參見管理Project。
已創建兩個不同可用區的交換機,且與集群處于同一VPC。具體操作,請參見創建和管理交換機。
操作流程
步驟一:創建應用和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
執行以下命令,創建測試應用tea和Service。
kubectl apply -f tea.yaml
步驟二:創建ALB Ingress
創建ALBConfig。
使用以下內容,創建alb-test.yaml。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** - vSwitchId: vsw-uf6nun9tql5t8nh15**** accessLogConfig: logProject: "****" logStore: "alb_****" listeners: - port: 80 protocol: HTTP
zoneMappings:設置ALB Ingress交換機ID,您需要至少指定兩個不同可用區交換機ID,且與集群處于同一VPC。
logProject:設置Project名稱。
logStore:設置Logstore名稱。logStore命名需要以alb_開頭,若指定logStore不存在,系統將會自動創建。
執行以下命令,創建ALBConfig。
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
執行以下命令,創建IngressClass。
kubectl apply -f alb.yaml
創建ALB 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
執行以下命令,創建ALB Ingress。
kubectl apply -f tea-ingress.yaml
執行以下命令,獲取ALB Ingress的
ADDRESS
。kubectl get ingress
預期輸出:
NAME CLASS HOSTS ADDRESS PORTS AGE tea-ingress alb demo.ingress.top alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com 80 7m5s
步驟三:創建HPA
使用以下內容,創建hpa.yaml。
apiVersion: autoscaling/v2beta2 kind: HorizontalPodAutoscaler metadata: name: ingress-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: nginx-deployment-basic minReplicas: 2 maxReplicas: 10 metrics: - type: External external: metric: name: sls_alb_ingress_qps # sls_alb_ingress_qps是本文實現伸縮使用的指標,表示基于QPS數據實現彈性伸縮。 selector: matchLabels: sls.project: "****" # 替換sls.project值為真實值。 sls.logstore: "alb_****" # 替換sls.logstore值為真實值。 sls.ingress.route: "default-tea-svc-80" # sls.ingress.route參數的格式為<namespace>-<svc>-<port>,例如default-nginx-80。 target: type: AverageValue # type為AverageValue表示QPS要除以Pod的數目進行判斷。 averageValue: 2
執行以下命令,創建HPA。
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
執行以下命令,查看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
步驟四:驗證應用是否隨著QPS數據自動擴縮容
驗證應用是否隨著QPS數據擴容。
執行以下命令,對應用進行壓測。
ab -c 5 -n 5000 -H Host:demo.ingress.top http://alb-110zvs5nhsvfv*****.cn-chengdu.alb.aliyuncs.com/tea
執行以下命令,查看應用伸縮情況。
kubectl get hpa
預期輸出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE ingress-hpa Deployment/nginx-deployment-basic 12500m/2 (avg) 2 10 10 15m
返回結果中
REPLICAS
為10,表明隨著QPS數據增大,應用的Pod擴容到10個。
驗證應用是否隨著QPS數據縮容。
QPS數據在壓測停止后會下降為0,低于測試閾值,HPA會縮容。
待壓測停止后,執行以下命令,查看應用伸縮情況。
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,表明隨著QPS數據減少,應用的Pod縮容到2個。