天亿互联:5步搞定Kubernetes集群自动扩缩容与资源优化
前言:为什么需要自动扩缩容?
在云原生时代,业务流量波动频繁,手动调整Pod副本数不仅效率低下,还容易造成资源浪费或服务过载。Kubernetes提供Horizontal Pod Autoscaler(HPA),能够根据CPU、内存或自定义指标自动调整工作负载的副本数。本文基于天亿互联的实战经验,总结5个关键步骤,助你快速实现稳定高效的自动扩缩容。
步骤一:部署Metrics Server(监控数据源)
HPA依赖Metrics API获取Pod资源使用率,因此必须先安装Metrics Server。执行以下命令(适用于K8s v1.19+):
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
验证是否正常运行:
kubectl get apiservice | grep metrics
# 输出应包含 v1beta1.metrics.k8s.io
如果集群使用自签名证书,需在部署参数中添加--kubelet-insecure-tls。
步骤二:为工作负载配置资源请求与限制
HPA需要依据资源请求(requests)计算使用率,因此每个容器必须定义requests。示例Deployment配置:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 2
template:
spec:
containers:
- name: nginx
image: nginx:1.25
resources:
requests:
cpu: 200m
memory: 256Mi
limits:
cpu: 500m
memory: 512Mi
注意:如果未设置requests,HPA将无法计算指标。
步骤三:创建HPA对象(基于CPU/内存)
用kubectl命令行创建最简单的HPA,目标CPU使用率50%:
kubectl autoscale deployment web-app --cpu-percent=50 --min=2 --max=10
或者使用YAML文件更灵活地定义:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: web-app-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: web-app
minReplicas: 2
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80
应用配置:kubectl apply -f hpa.yaml
步骤四:使用自定义指标(进阶:基于QPS或并发数)
仅靠CPU/内存可能无法反映真实业务压力。可集成Prometheus Adapter,实现基于请求QPS的扩缩容。先安装Prometheus,然后部署Adapter并配置规则:
# prometheus-adapter-values.yaml
rules:
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
resources:
overrides:
namespace: {resource: "namespace"}
pod: {resource: "pod"}
metricsQuery: 'sum(rate(http_requests_total{<<.LabelMatchers>>}[1m])) by (<<.GroupBy>>)'
然后定义HPA引用该指标:
metrics:
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 100
这样当每个Pod平均QPS超过100时,HPA自动扩容。
步骤五:优化与监控(防止抖动和资源浪费)
1. 设置冷却时间:在HPA中增加behavior字段,避免频繁扩缩:
behavior:
scaleDown:
stabilizationWindowSeconds: 300
policies:
- type: Percent
value: 10
periodSeconds: 60
scaleUp:
stabilizationWindowSeconds: 0
policies:
- type: Percent
value: 100
periodSeconds: 15
2. 结合VPA(垂直扩缩容):为无状态应用同时部署VPA,调整requests值,使HPA计算更准确。
3. 监控面板:使用Grafana + Prometheus展示HPA实时状态和Pod资源趋势。
kubectl get hpa -w
总结与最佳实践
自动扩缩容是Kubernetes弹性能力的核心。通过以上5步,你已经能在天亿互联的集群上实现基于CPU/内存及自定义指标的自动扩缩容。注意定期检查HPA事件(kubectl describe hpa),并结合集群总资源限额(ResourceQuota)防止扩容失控。最后,建议在生产环境启用Cluster Autoscaler,实现节点级别的自动伸缩,彻底解决资源天花板问题。
如需更完整的配置示例,欢迎访问天亿互联官网文档中心获取。