一、前提條件:安裝Metrics Server
HPA(Horizontal Pod Autoscaler)依賴Metrics Server收集Pod的CPU、內存等資源使用數據。在CentOS上安裝Metrics Server的步驟如下:
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
安裝后檢查Metrics Server狀態,確保其正常運行:
kubectl get pods -n kube-system | grep metrics-server
若未正常運行,可刪除對應Pod觸發重啟:
kubectl delete pod -n kube-system <metrics-server-pod-name>
二、配置HPA(Horizontal Pod Autoscaler)
HPA是Kubernetes實現Pod水平自動擴縮容的核心資源,以下是詳細配置步驟:
HPA需根據Pod的資源請求(requests
)計算利用率,因此必須在Deployment中定義容器的resources.requests
和resources.limits
。示例如下:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
replicas: 1 # 初始副本數,HPA會動態調整
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-container
image: nginx:latest
ports:
- containerPort: 80
resources:
requests: # 調度依據,必須設置
cpu: "100m" # 0.1核
memory: "64Mi"
limits: # 資源上限,防止Pod被OOM Kill
cpu: "200m" # 0.2核
memory: "128Mi"
將上述內容保存為deployment.yaml
,應用到集群:
kubectl apply -f deployment.yaml
通過HPA配置自動擴縮容規則,以下是一個基于CPU利用率的示例(支持v2beta2及以上API版本):
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa
spec:
scaleTargetRef: # 指定擴縮容目標(Deployment/ReplicaSet/StatefulSet)
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 1 # 最小副本數(避免縮容至0)
maxReplicas: 10 # 最大副本數(集群資源上限)
metrics:
- type: Resource # 資源指標(支持CPU、內存)
resource:
name: cpu # 指標名稱(CPU/memory)
target:
type: Utilization # 目標類型(Utilization/AverageValue)
averageUtilization: 50 # 目標利用率(如50%)
將上述內容保存為hpa.yaml
,應用到集群:
kubectl apply -f hpa.yaml
說明:
scaleTargetRef
:指定要擴縮容的對象(如Deployment),需與已有資源名稱一致;minReplicas
/maxReplicas
:限制Pod數量范圍,避免過度擴縮容;metrics
:可配置多個指標(如CPU+內存),支持Utilization
(利用率)或AverageValue
(絕對值)。使用以下命令查看HPA的當前狀態(包括副本數、目標利用率、當前利用率):
kubectl get hpa
輸出示例:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
my-hpa Deployment/my-app 30%/50% 1 10 1 2m
TARGETS
:顯示當前利用率/目標利用率(如30%表示當前CPU利用率為30%,目標為50%);REPLICAS
:當前Pod副本數。查看詳細信息(包括擴縮容決策記錄):
kubectl describe hpa my-hpa
三、測試自動擴縮容
通過模擬負載觸發HPA自動調整Pod數量,常用工具如hey
(快速HTTP壓測工具):
# 安裝hey(若未安裝)
wget https://github.com/rakyll/hey/releases/download/v0.0.0/hey_linux_amd64 -O hey
chmod +x hey
mv hey /usr/local/bin/
# 發起壓測(向my-app發送10個并發請求,持續30秒)
hey -c 10 -z 30s http://<my-app-service-ip>
隨著負載增加,HPA會根據CPU利用率自動增加Pod副本數(不超過maxReplicas
);負載降低時,自動減少副本數(不低于minReplicas
)。
四、可選:基于自定義指標的自動擴縮容
若需根據非資源指標(如QPS、隊列長度)擴縮容,需安裝Custom Metrics Adapter(如Prometheus Adapter),并配置HPA使用自定義指標。示例如下:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: my-hpa-custom
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: my-app
minReplicas: 1
maxReplicas: 20
metrics:
- type: External # 自定義指標
external:
metric:
name: requests_per_second # 自定義指標名稱(需與Prometheus Adapter配置一致)
target:
type: Value
value: "100" # 目標值(每秒100個請求)
需提前部署Prometheus Adapter并將自定義指標暴露給Kubernetes集群。
五、注意事項
resources.requests
計算利用率,未設置則無法正常工作;targetUtilization
(如50%-80%),避免因閾值過低導致頻繁擴縮容(可能影響應用穩定性);kubectl get hpa -w
實時監控HPA狀態,或結合Prometheus+Granafa實現可視化;maxReplicas
),否則可能導致Pod處于Pending狀態。