MSE網關作為流量入口,對業務流量大小具有最明顯的感知,結合K8s的能力與MSE網關統計的QPS指標,業務應用能夠基于業務Pod上的QPS進行彈性伸縮,使后端業務能夠按需擴展。本文介紹ACK業務如何應用網關訪問日志進行彈性伸縮。
前提條件
操作步驟
在容器服務ACK中部署如下資源。
登錄容器服務管理控制臺,在左側導航欄選擇 。
在搜索框輸入ack-alibaba-cloud-metrics-adapter,單擊應用卡片,在詳情頁右上角單擊一鍵部署。在創建面板進行相關配置,然后單擊確定。
在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在無狀態頁面,單擊使用YAML創建資源。選擇模板為自定義并使用如下YAML,然后單擊創建。
apiVersion: apps/v1 kind: Deployment metadata: name: httpbin-deploy labels: app: httpbin-deploy spec: replicas: 1 selector: matchLabels: app: httpbin template: metadata: labels: app: httpbin spec: containers: - image: kennethreitz/httpbin imagePullPolicy: IfNotPresent name: httpbin ports: - name: http containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: httpbin-svc namespace: default labels: app: httpbin-svc spec: ports: - port: 8080 name: http protocol: TCP targetPort: 80 selector: app: httpbin type: ClusterIP
在MSE網關中添加服務來源并創建服務。
登錄MSE網關管理控制臺,并在頂部菜單欄選擇地域。
在左側導航欄,選擇云原生網關 > 網關列表,單擊目標網關名稱。
在左側導航欄,選擇路由管理,然后選擇來源頁簽。
單擊創建來源,選擇來源類型為容器服務,并選擇已部署應用的ACK集群,然后單擊確定。
在左側導航欄,選擇路由管理,然后選擇服務頁簽。
單擊創建服務,將創建的服務來源添加到服務列表中,然后單擊確定。
為已創建服務添加路由。具體操作,請參見創建路由。
開啟日志投遞服務。
在左側導航欄,單擊參數配置。
在可觀測性參數區域,單擊日志投遞右側的圖標,在對話框中開啟日志投遞和兼容 Nginx Ingress選項。
在ACK集群中創建HorizontalPodAutoscaler,并進行相關設置。
包括需要進行彈性伸縮的后端業務應用、彈性伸縮時最小副本數、彈性伸縮時最大副本數、彈性伸縮依據的指標等。示例如下,其中sls.project值為網關控制臺參數配置頁面顯示的日志投遞的project名稱,sls.ingress.route格式為
<服務命名空間>-<服務名稱>-<服務端口號>
。在該示例中,設置當服務Pod平均QPS大于10時進行擴容。apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: higress-hpa spec: scaleTargetRef: apiVersion: apps/v1beta2 kind: Deployment name: httpbin-deploy minReplicas: 1 maxReplicas: 10 metrics: - type: External external: metric: name: sls_ingress_qps selector: matchLabels: sls.project: "aliyun-product-data-xxxxxxxxxxxxx-cn-hangzhou" sls.logstore: "nginx-ingress" sls.ingress.route: "default-httpbin-svc-8080" target: type: AverageValue averageValue: 10
控制QPS通過網關路由對業務應用進行壓測,觀察HPA的事件進行驗證。
使用如下命令進行驗證。
kubectl describe hpa higress-hpa
輸出如下。
Normal SuccessfulRescale 9m horizontal-pod-autoscaler New size: 3; reason: external metric sls_ingress_qps(&LabelSelector{MatchLabels:map[string]string{sls.ingress.route: default-httpbin-svc-8080,sls.logstore: nginx-ingress,sls.project: aliyun-product-data-xxxxxxxxxxxxxxxx-cn-hangzhou,},MatchExpressions:[]LabelSelectorRequirement{},}) above target Normal SuccessfulRescale 8m45s horizontal-pod-autoscaler New size: 4; reason: external metric sls_ingress_qps(&LabelSelector{MatchLabels:map[string]string{sls.ingress.route: default-httpbin-svc-8080,sls.logstore: nginx-ingress,sls.project: aliyun-product-data-xxxxxxxxxxxxxxxx-cn-hangzhou,},MatchExpressions:[]LabelSelectorRequirement{},}) above target Normal SuccessfulRescale 5m12s horizontal-pod-autoscaler New size: 4; reason: Normal SuccessfulRescale 3m41s horizontal-pod-autoscaler New size: 3; reason: All metrics below target Normal SuccessfulRescale 2m55s horizontal-pod-autoscaler New size: 1; reason: All metrics below target