Blog

实现服务的动态扩缩容是提升系统弹性和资源利用率的关键手段。阿里云容器服务 ACK(Alibaba Cloud Container Service for Kubernetes)结合水平自动扩缩容(HPA,Horizontal Pod Autoscaler)与智能托管节点池,为用户提供了一套高效、智能的弹性伸缩解决方案。通过 HPA 根据应用负载自动调整 Pod 副本数,配合智能托管节点池自动管理底层计算资源,ACK 集群能够实现从应用层到基础设施层的全链路动态扩缩容,确保服务在负载波动时平稳运行,既满足业务需求,又优化了成本效益。本文将深入解析基于阿里云 ACK 集群的 HPA 与智能托管节点池的协同工作机制。


主要作用:

  • 使用 Horizontal Pod Autoscaler (HPA) 进行 Pod 的自动扩缩容,并结合扩缩容节点池(Managed Node Pool)来动态调整集群的计算资源,以应对突发流量波动或大量的HTTP短连接请求。

前置条件

    1. 拥有有效的阿里云账号,并具备创建和管理容器服务、弹性伸缩及云服务器相关资源的权限。
    1. 一个稳定运行的阿里云 ACK 集群,版本建议为支持 HPA 和智能托管节点池功能的较新版本(如 1.33 及以上)
    1. ACK 集群中已启用并配置智能托管节点池,节点池具备自动弹性伸缩能力,并可根据负载自动调整节点数量。

1. 配置容缩池污点和标签

  1. 污点(Taints) 1. 名称:node.demo.com/os 2. Effect:NoSchedule 3. 值: containeros
  2. 节点标签(Labels) 1. 名称:alibabacloud.com/os 2. 值: containeros

2. 配置服务的HPA容缩策略

apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
  namespace: default
spec:
  minReplicas: 1
  maxReplicas: 2 # 测试2/生产5-6
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: nginx
  metrics:
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 100 # 所需资源达到100%
  behavior:                          # 扩缩策略
    scaleUp:
      stabilizationWindowSeconds: 60   # 扩容前观察 30 秒,避免抖动
      policies:
      - type: Percent
        value: 50
        periodSeconds: 30     # 每 60 秒执行一次
      - type: Pods
        value: 1     # 或者每次最多扩容 1 个 Pod
        periodSeconds: 30     
      selectPolicy: Min              # 选择扩容数量最少的策略
    scaleDown:                       # 缩容策略
      stabilizationWindowSeconds: 60
      policies:
      - type: Pods
        value: 1
        periodSeconds: 30     
      selectPolicy: Min

3. 配置节点软亲和度和反亲和度

spec:
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
            - preference:
                matchExpressions:
                  - key: alibabacloud.com/os
                    operator: NotIn
                    values:
                      - containeros
              weight: 100
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchExpressions:
                  - key: app
                    operator: In
                    values:
                      - nginx
              topologyKey: kubernetes.io/hostname

4. 配置容忍度

tolerations:
  - key: node.demo.com/os
    operator: Equal
    value: containeros
    effect: NoSchedule

5. 扩容阐述

    1. 当前使用率 > 目标使用率 时,服务会先监听30s看阈值是否一直占用(stabilizationWindowSeconds: 30),之后会自动进行扩容,默认为:1
    1. 当前使用率 < 目标使用率 时,根据 期望副本数 = [当前副本数 × (当前指标值 / 目标指标值)] 进行自动缩容 《阿里云ACK集群HPA+智能托管节点池,实现服务动态扩缩容》文章正文配图 — STARBUCKET BLOG
    1. 当默认节点池的资源不足以创建新的pod时,缩容节点池会自动创建新节点。 《阿里云ACK集群HPA+智能托管节点池,实现服务动态扩缩容》文章正文配图(配图 2)— STARBUCKET BLOG

《阿里云ACK集群HPA+智能托管节点池,实现服务动态扩缩容》文章正文配图(配图 3)— STARBUCKET BLOG

    1. 当前使用率 < 目标使用率 时,副本数会自动缩减小副本数并且优先将pod转移到旧节点池,然后把扩容节点自动释放 《阿里云ACK集群HPA+智能托管节点池,实现服务动态扩缩容》文章正文配图(配图 4)— STARBUCKET BLOG

6. 参数指标

    1. 所需资源,根据具体服务使用量定,默认750M
    1. 期望副本数 = [当前副本数 × (当前使用率 / 目标使用率)]
    1. 当前使用率 = ( 所有 Pod 实际资源使用量之和 / 所有 Pod 的 Request 之和 ) × 100%
    1. 目标平均用量(M)= Request(M) × ( 目标使用率% / 100 )
    1. 目标使用率 = ( 希望的平均用量 / 所需资源 ) x 100%

Comments & discussion

The first comment in each thread opens a topic. Signed-in readers can keep the conversation going under that topic.

No comments yet. Sign in to start a topic.

Start a new topic

Sign in to start a topic or join the discussion.