本文介紹如何在Kubernetes提供外部指標(External Metrics)支持的情況下,通過配置如HTTP請求率、Ingress QPS等指標,在阿里云環境中實現應用的自動水平伸縮。
前提條件
已創建Kubernetes集群。具體操作,請參見創建Kubernetes托管版集群、創建Kubernetes專有版集群、創建集群。
部署alibaba-cloud-metrics-adapter組件
登錄容器服務管理控制臺,在左側導航欄選擇集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇 。
在Helm頁面,單擊創建。參考如下信息完成基礎信息配置。
參數
示例值
應用名
ack-alibaba-cloud-metrics-adapter
命名空間
kube-system
來源
默認為應用市場。
Chart
應用場景:選擇全部。
支持架構:選擇amd64。
搜索框:搜索ack-alibaba-cloud-metrics-adapter。
選中ack-alibaba-cloud-metrics-adapter,單擊下一步。
在參數配置頁面,選擇Chart 版本,然后單擊確定。
配置HPA自動伸縮示例
本文以創建名為Nginx的Deployment和Service為例配置HPA自動伸縮。
登錄容器服務管理控制臺,在左側導航欄單擊集群。
在集群列表頁面,單擊目標集群名稱,然后在左側導航欄,選擇
。在無狀態頁面中,單擊使用YAML創建資源。
設置示例模板為自定義,并使用以下YAML文件創建一個應用,并暴露一個ClusterIP的Service,然后單擊創建。
apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment-basic labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:1.7.9 ports: - containerPort: 80 --- apiVersion: v1 kind: Service metadata: name: nginx namespace: default spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx type: ClusterIP
在集群管理頁左側導航欄中,選擇
,并在路由頁面右上方,單擊創建Ingress。在創建面板中填寫相關信息,然后單擊確定。完成創建后,系統會自動跳轉至路由頁面。
在名稱下,單擊生成的Ingress名稱,查看路由規則信息。
配置HPA。
單擊左上角的符號,返回集群列表頁面。
在控制臺左側導航欄,選擇 。
- 在模板列表頁面右上角單擊創建。
在創建對話框中,配置編排模板,最后單擊保存。
名稱:設置該模板的名稱,本文配置為HPA。
描述:輸入對該模板的描述,可不配置。
模板:配置符合Kubernetes YAML語法規則的編排模板,參考以下文件。
apiVersion: autoscaling/v2 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_ingress_qps selector: matchLabels: sls.project: "***" # 替換sls.project的值為真實值。 sls.logstore: "nginx-ingress" sls.ingress.route: "default-nginx-80" target: type: AverageValue averageValue: 10 - type: External external: metric: name: sls_ingress_latency_p9999 selector: matchLabels: # default ingress log project is k8s-log-clusterId sls.project: "***" # default ingress logstre is nginx-ingress sls.logstore: "nginx-ingress" # namespace-svc-port sls.ingress.route: "default-nginx-80" # sls vpc endpoint, default true # sls.internal.endpoint:true target: type: Value # sls_ingress_latency_p9999 > 10ms value: 10
HPA的配置涉及的參數如下:
參數名
描述
sls.ingress.route
必填,參數的格式為:
<namespace>-<svc>-<port>
,例如default-nginx-80。說明<namespace>
為Ingress所在的命名空間,<svc>
是Ingress對應的Service名稱,<port>
是Ingress對應Service的Port名稱。sls.logstore
日志服務的日志庫名稱,必填。集群中默認
sls.logstore
值為nginx-ingress
。sls.project
日志服務的Project名稱,必填。集群中默認
sls.project
值為k8s-log-集群ID
.sls.internal.endpoint
設置通過內網還是外網訪問日志服務,默認為true。選擇true說明通過內網訪問日志服務;選擇false說明通過外網訪問日志服務。
說明sls_ingress_qps與sls_ingress_latency_p9999是本文實現伸縮使用的兩個指標。在target的type中。
為sls_ingress_qps設置的是AverageValue,表示QPS要除以Pod的數目進行判斷。
為sls_ingress_latency_p9999設置的是Value,表示無需除以Pod的數目。
以上兩種不同的type在HPA的設置中會經常用到。
在模板列表頁面,選擇HPA并單擊創建應用。
在模板列表 - HPA頁面右側,單擊創建。
設置好HPA后,執行以下腳本進行壓測。
#!/bin/bash ##使用Apache Benchmark對Ingress暴露的服務設置并發為10,時間為300秒的壓測。 ab -t 300 -c 10 <ingress配置的域名>
驗證指標伸縮狀態。
在控制臺左側導航欄單擊集群,并在集群列表頁面,選擇目標集群操作列的
。執行以下命令檢查伸縮狀態。
kubectl get hpa ingress-hpa
預期輸出:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAPS AGE ingress-hpa Depolyment/nginx-deployment-basic 21/10 (avg) 2 10 10 7m49s
當REPLICAS的值和MAXPODS的值相同時,說明伸縮成功。
通過命令行查詢數據
可以通過以下命令行查詢數據。以請求指標sls_ingress_qps為例。
kubectl get --raw /apis/external.metrics.k8s.io/v1beta1/namespaces/*/sls_ingress_qps?labelSelector=sls.project={{SLS_Project}},sls.logstore=nginx-ingress
其中 {{SLS_Project}}是此ACK集群對應的SLS日志中心的Project名。若未自定義配置,默認為k8s-log-{{ClusterId}},{{ClusterId}}為此集群的ClusterId。
若返回結果為:
Error from server: {
"httpCode": 400,
"errorCode": "ParameterInvalid",
"errorMessage": "key (slb_pool_name) is not config as key value config,if symbol : is in your log,please wrap : with quotation mark \"",
"requestID": "xxxxxxx"
}
表明此指標無數據。原因可能是未配置使用ALB Ingress,但使用了sls_alb_ingress_qps指標進行數據查詢。
常見問題
問:如果執行
kubectl get hpa
后發現target一欄為<unknow>怎么辦?答:請按照以下操作解決。
執行
kubectl describe hpa <hpa_name>
,確認HPA失效的原因。如果Conditions字段提示AbleToScale為False,請確認Deployment是否正常部署。
如果Conditions字段提示ScalingActive為False,請繼續下一步。
執行
kubectl get --raw "/apis/external.metrics.k8s.io/v1beta1/"
。如果返回為Error from server (NotFound): the server could not find the requested resource,請確認alibaba-cloud-metrics-adapter的啟動狀態。如果確認alibaba-cloud-metrics-adapter狀態正常,請確認HPA指標是否是Ingress相關指標。如果是Ingress相關指標,您需要提前部署日志服務組件。更多信息,請參見Nginx Ingress訪問日志分析與監控。
確認HPA指標填寫正確。sls.ingress.route的值格式為
<namespace>-<svc>-<port>
。namespace為Ingress所在的命名空間。
svc是Ingress對應的Service名稱。
port是Ingress對應Service的端口名稱。
問:如何查找HPA支持的指標名稱?
答:請參見阿里云HPA指標, 以下列舉為常用指標。
指標名稱
描述
附加參數
sls_ingress_qps
指定的IngressRoute每秒查詢率
sls.ingress.route
sls_alb_ingress_qps
ALB數據的IngressRoute每秒查詢率
sls.ingress.route
sls_ingress_latency_avg
所有請求的延遲
sls.ingress.route
sls_ingress_latency_p50
50%請求的延遲
sls.ingress.route
sls_ingress_latency_p95
95%請求的延遲
sls.ingress.route
sls_ingress_latency_p99
99%請求的延遲
sls.ingress.route
sls_ingress_latency_p9999
99.99%請求的延遲
sls.ingress.route
sls_ingress_inflow
Ingress的流入帶寬
sls.ingress.route
問:當用戶自定義了Nginx Ingress日志格式,如何進行適配操作?
答:本文介紹的使用SLS Ingress指標進行容器水平伸縮,需要您開啟并正確配置集群中Nginx Ingress日志接入阿里云日志服務。
在創建集群時,日志服務是默認開啟的。當您保持默認值不變,集群創建成功后,您可以在阿里云日志服務SLS控制臺查看Nginx Ingress的訪問日志分析報表和監控Nginx Ingress實時狀態。
在創建集群時,若您手動關閉了日志服務,集群創建完成后,如果想要使用SLS Ingress指標進行容器水平伸縮,您需要重新開啟或配置日志服務。詳細信息,請參見Nginx Ingress訪問日志分析與監控。
當您需要自定義Nginx Ingress日志格式時,由于集群中初次開啟日志服務部署AliyunLogConfig的CRD只針對ACK默認Ingress Controller中的日志格式生效,若您修改過Ingress Controller的訪問日志格式,請修改CRD配置中的正則表達式提取
processor_regex
部分。具體操作,請參見通過DaemonSet-CRD方式采集容器日志。