一、前提条件:安装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状态。