云服务器自动扩缩容:K8s HPA 与云厂商弹性伸缩联动配置

在云原生环境中,Kubernetes (K8s) 的 Horizontal Pod Autoscaler (HPA) 负责自动调整 Pod 数量(应用层扩缩容),而云服务提供商(如 AWS、Azure 或 GCP)的弹性伸缩服务(如 AWS Auto Scaling Groups、Azure VM Scale Sets 或 GCP Managed Instance Groups)负责调整节点数量(基础设施层扩缩容)。联动配置的核心是通过 K8s Cluster Autoscaler 组件实现无缝集成:Cluster Autoscaler 监控集群资源需求,当 Pod 因资源不足无法调度时,自动触发云厂商的弹性伸缩服务添加节点;当节点空闲时,自动移除节点。这能优化资源利用率,降低成本。

下面我将逐步解释配置过程,确保结构清晰、真实可靠。配置基于 Kubernetes 官方文档和主流云服务商最佳实践(版本无关,适用于 K8s 1.18+)。


步骤 1: 配置 K8s HPA(Horizontal Pod Autoscaler)

HPA 根据指标(如 CPU、内存或自定义指标)自动扩缩 Pod。假设您已部署一个应用(例如 Nginx),以下是基本配置:

  • HPA YAML 示例:创建一个 HPA 资源文件(如 hpa.yaml)。
    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: nginx-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: nginx-deployment
      minReplicas: 2
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50  # 目标 CPU 利用率 $50\%$
    

    • 关键参数
      • scaleTargetRef: 指定要扩缩的 Deployment 或 StatefulSet。
      • metrics: 定义扩缩指标,这里使用 CPU 利用率目标 $50%$(即当平均 CPU 使用率超过 $50%$ 时扩容)。
      • minReplicasmaxReplicas: 设置 Pod 的最小和最大副本数。
    • 应用配置
      kubectl apply -f hpa.yaml
      

    • 验证:运行 kubectl get hpa 检查状态。

步骤 2: 配置 Cluster Autoscaler

Cluster Autoscaler 是联动核心,它监听未调度的 Pod,并通过云厂商 API 添加或移除节点。配置需根据云平台定制:

  • 通用原理
    • Cluster Autoscaler 检查节点资源池(如 Node Group)。
    • 当 Pod 因资源不足无法调度时(例如,CPU 请求 $ \sum \text{Pod CPU request} > \text{Node available CPU} $),触发扩容。
    • 当节点利用率低于阈值(通常 $< 50%$)且持续一段时间,触发缩容。
  • 安装 Cluster Autoscaler
    • 使用 Helm 或直接部署 YAML。以下是通用部署文件(cluster-autoscaler.yaml):
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: cluster-autoscaler
        namespace: kube-system
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: cluster-autoscaler
        template:
          metadata:
            labels:
              app: cluster-autoscaler
          spec:
            containers:
            - name: cluster-autoscaler
              image: k8s.gcr.io/autoscaling/cluster-autoscaler:v1.25.0  # 使用最新稳定版
              command:
              - ./cluster-autoscaler
              - --cloud-provider=<cloud-provider>  # 替换为云平台,如 aws, azure, gcp
              - --nodes=<min-node>:<max-node>  # 例如 1:10
              - --scale-down-utilization-threshold=0.5  # 缩容阈值 $50\%$
              - --scale-down-delay-after-add=10m  # 添加节点后延迟缩容
              resources:
                limits:
                  cpu: 100m
                  memory: 300Mi
                requests:
                  cpu: 100m
                  memory: 300Mi
      


步骤 3: 与云厂商弹性伸缩服务集成

不同云平台需额外配置,确保 Cluster Autoscaler 有权限调用云 API。以下是主流平台指南:

  • AWS
    • 前提:在 AWS 创建 Auto Scaling Group (ASG),并启用 K8s 节点标签。
    • 配置
      • 修改 Cluster Autoscaler 的 command 参数:
        command:
        - ./cluster-autoscaler
        - --cloud-provider=aws
        - --node-group-auto-discovery=asg:tag=k8s.io/cluster-autoscaler/enabled,<cluster-name>
        

      • 为 ASG 添加 IAM 角色,赋予 autoscaling:DescribeAutoScalingGroups 等权限。
    • 验证:当 HPA 扩容 Pod 导致节点不足时,AWS ASG 自动添加 EC2 实例。
  • Azure
    • 前提:使用 Azure VM Scale Sets 并配置 K8s 集群。
    • 配置
      • 设置 Cluster Autoscaler 参数:
        command:
        - ./cluster-autoscaler
        - --cloud-provider=azure
        - --node-group-auto-discovery=scale-set:name=<scale-set-name>,resource-group=<rg-name>
        

      • 通过 Azure Service Principal 授权访问。
    • 注意:确保 Scale Set 的 autoscaling 模式启用。
  • GCP
    • 前提:在 GCP 创建 Managed Instance Group (MIG)。
    • 配置
      command:
      - ./cluster-autoscaler
      - --cloud-provider=gcp
      - --node-group-auto-discovery=mig:prefix=<mig-prefix>
      

      • 为 GCP 服务账号添加 compute.instances.list 权限。
  • 通用最佳实践
    • 监控指标:使用 Prometheus 和 Grafana 监控 HPA 和 Cluster Autoscaler 指标,如 Pod 调度延迟 $ \text{delay} = t_{\text{scheduled}} - t_{\text{created}} $。
    • 资源请求设置:在 Pod 模板中定义资源请求(如 resources.requests.cpu),确保 Cluster Autoscaler 能准确计算需求。例如:
      resources:
        requests:
          cpu: "100m"  # $0.1$ 个 CPU 核心
          memory: "128Mi"
      

    • 测试联动
      • 模拟负载:使用 kubectl run 创建高 CPU 任务,观察 HPA 扩容 Pod,然后 Cluster Autoscaler 触发云厂商添加节点。
      • 缩容测试:降低负载后,节点应在延迟后自动移除。

注意事项

  • 成本优化:设置合理的 minReplicas(HPA)和节点最小数(Cluster Autoscaler),避免过度扩容。例如,在低峰期设置较低最小值。
  • 故障排查
    • 如果联动失败,检查 Cluster Autoscaler 日志:kubectl logs -n kube-system deploy/cluster-autoscaler
    • 确保云厂商 IAM 权限正确,避免 API 调用错误。
    • 验证指标源:HPA 依赖 Metrics Server,运行 kubectl top pods 确认。
  • 高级场景:支持自定义指标(如 QPS),需额外配置 Prometheus Adapter。

通过以上配置,HPA 和云厂商弹性伸缩实现自动联动:应用负载增加时,HPA 扩容 Pod;当节点资源不足,Cluster Autoscaler 调用云服务扩容节点;负载降低时,自动缩容。这提升了系统的弹性和效率。如果您有具体云平台或场景细节,我可以提供更针对性的建议!

更多推荐