前言:为什么需要自动扩缩容?

在云原生时代,业务流量波动频繁,手动调整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,实现节点级别的自动伸缩,彻底解决资源天花板问题。

如需更完整的配置示例,欢迎访问天亿互联官网文档中心获取。