本文介紹如何在Kubernetes提供外部指標(External Metrics)支援的情況下,通過配置如HTTP請求率、Ingress QPS等指標,在阿里雲環境中實現應用的自動水平伸縮。
前提條件
已建立Kubernetes叢集。具體操作,請參見建立Kubernetes託管版叢集、建立Kubernetes專有版叢集、建立叢集。
部署alibaba-cloud-metrics-adapter組件
登入Container Service管理主控台,在左側導覽列選擇叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇 。
在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自動調整。
登入Container Service管理主控台,在左側導覽列單擊叢集。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇
。在無狀態頁面中,單擊使用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
Log Service的日誌庫名稱,必填。叢集中預設
sls.logstore
值為nginx-ingress
。sls.project
Log Service的Project名稱,必填。叢集中預設
sls.project
值為k8s-log-叢集ID
.sls.internal.endpoint
設定通過內網還是外網訪問Log Service,預設為true。選擇true說明通過內網訪問Log Service;選擇false說明通過外網訪問Log Service。
說明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相關指標,您需要提前部署Log Service組件。更多資訊,請參見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日誌接入阿里雲Log Service。
在建立叢集時,Log Service是預設開啟的。當您保持預設值不變,叢集建立成功後,您可以在阿里雲Log ServiceSLS控制台查看Nginx Ingress的訪問日誌分析報表和監控Nginx Ingress即時狀態。
在建立叢集時,若您手動關閉了Log Service,叢集建立完成後,如果想要使用SLS Ingress指標進行容器水平伸縮,您需要重新開啟或配置Log Service。詳細資料,請參見Nginx Ingress訪問日誌分析與監控。
當您需要自訂Nginx Ingress日誌格式時,由於叢集中初次開啟Log Service部署AliyunLogConfig的CRD只針對ACK預設Ingress Controller中的日誌格式生效,若您修改過Ingress Controller的訪問日誌格式,請修改CRD配置中的Regex提取
processor_regex
部分。具體操作,請參見通過DaemonSet-CRD方式採集容器日誌。