應對業務突發流量時,更精準的擴縮容能夠提高響應速度,並進一步提升叢集資源利用效率。本文介紹如何利用Kubernetes的外部指標介面(External Metrics)整合重要業務指標(例如HTTP請求率、Ingress QPS等),實現更自動化的伸縮策略。
本文將通過以下步驟,以建立名為Nginx的Deployment、Service和Ingress為例,配置HPA自動調整,實現基於Log Service(SLS)中Ingress的QPS指標對容器進行水平伸縮。
步驟一:部署ack-alibaba-cloud-metrics-adapter組件
ack-alibaba-cloud-metrics-adapter組件允許 Kubernetes 通過 External Metrics API 擷取阿里雲產品(如 ECS、SLB、RDS 等)的監控資料,可以增強叢集的監控和自動調整能力。
登入Container Service管理主控台,在左側導覽列選擇叢集列表。
在叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇。
在Helm頁面,單擊建立,完成基本資料配置,然後選中ack-alibaba-cloud-metrics-adapter,單擊下一步。
在參數配置頁面,選擇Chart 版本,然後單擊確定。
ack-alibaba-cloud-metrics-adapter 組件當前暫不支援平滑升級,需要卸載後再安裝最新版本。
步驟二:建立應用與服務
建立nginx-test.yaml檔案。
執行以下命令,建立應用Deployment和對應的Service。
kubectl apply -f nginx-test.yaml
步驟三:建立路由
在叢集管理頁左側導覽列中,選擇,並在路由頁面左上方,單擊建立Ingress。
在建立面板中填寫相關資訊,然後單擊確定。完成建立後,系統會自動跳轉至路由頁面。
在操作列名稱下,單擊產生的Ingress名稱,查看路由規則資訊。關於Ingress更多詳情,請參見Ingress管理
步驟四:配置HPA
您可以在HPA中配置SLS Project中伸縮使用的兩個指標,例如sls_ingress_qps與sls_ingress_latency_p9999。
sls_ingress_qps:為AverageValue,表示QPS要除以Pod的數目進行判斷。
sls_ingress_latency_p9999:為Value,表示無需除以Pod的數目。
建立並複製以下內容到ingress-hpa.yaml中。
HPA的配置涉及的參數如下。
參數名
是否必填
描述
sls.ingress.route
是
參數的格式為:
<namespace>-<svc>-<port>,其中<namespace>為Ingress所在的命名空間,<svc>是Ingress對應的Service名稱,<port>是Ingress對應Service的Port名稱。例如,default-nginx-80。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:通過內網訪問SLS。
false:通過外網訪問SLS。
執行以下命令,建立HPA。
kubectl apply -f ingress-hpa.yaml
步驟五:結果驗證
配置好HPA後,執行以下命令進行壓測。
ab -t 300 -c 10 <ingress配置的網域名稱> # 使用Apache Benchmark對Ingress暴露的服務設定並發為10,時間為300秒的壓測。驗證指標伸縮狀態。
執行以下命令檢查伸縮狀態。
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的值相同時,說明伸縮成功。
常見問題
如何通過命令列擷取QPS指標 sls_ingress_qps?
可以通過以下命令列查詢資料。以請求指標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}}為此叢集的ID。
若返回結果為:
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指標進行資料查詢。
若返回結果類似為:
{
"kind": "ExternalMetricValueList",
"apiVersion": "external.metrics.k8s.io/v1beta1",
"metadata": {},
"items": [
{
"metricName": "sls_ingress_qps",
"timestamp": "2025-02-26T16:45:00Z",
"value": "50", # QPS的值
"metricLabels": {
"sls.project": "your-sls-project-name",
"sls.logstore": "nginx-ingress"
}
}
]
}表明已查到Kubernetes 外部指標QPS,其中value為QPS值。
如果執行kubectl get hpa後發現target一欄為unknown怎麼辦?
請按照以下操作解決。
執行
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 Service控制台查看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方式採集容器日誌。
Failed to pull alibaba-cloud-metrics-adapter image
問題現象
升級ack-alibaba-cloud-metrics-adapter組件到1.3.7版本時拉取鏡像報錯,報錯內容如下:
Failed to pull image "registry-<region-id>-vpc.ack.aliyuncs.com/acs/alibaba-cloud-metrics-adapter-amd64:v0.2.9-ba634de-aliyun"。
問題原因
ack-alibaba-cloud-metrics-adapter 組件當前暫不支援直接更新。
解決方案
按照以下流程升級組件。
備份當前組件配置。
卸載舊版本組件。
使用備份配置安裝最新版本組件。
組件卸載重裝過程中,相關的HPA會因為監控資料擷取停止而暫停擴縮行為。