基于ack-autoscaling-placeholder实现容器秒级伸缩

当您需要工作负载快速启动而无需考虑节点资源问题时,可以考虑使用ack-autoscaling-placeholder组件。ack-autoscaling-placeholder为集群的自动扩展提供了缓冲区,使用优先级非常低(负数)的占位容器来超额配置,以保留其他Pod可以使用的资源。如果集群没有可用的资源,真正的工作负载也会将占位容器所占用的资源抢占,实现快速启动,然后结合使用Cluster-Autoscaler,迫使集群进行节点维度的扩展。本文介绍如何使用ack-autoscaling-placeholder实现容器秒级伸缩。

前提条件

您已为ACK集群开通自动伸缩。关于开通自动伸缩的操作步骤,请参见节点自动伸缩

操作步骤

  1. 登录容器服务管理控制台,在左侧导航栏选择市场 > 应用市场

  2. 应用目录页签,搜索ack-autoscaling-placeholder,然后单击ack-autoscaling-placeholder

  3. ack-autoscaling-placeholder页面,单击一键部署

  4. 创建面板,选择集群命名空间,然后单击下一步。选择Chart版本,编辑参数,然后单击确定

    创建成功后,在应用 > Helm页面,可查看到该应用状态为已部署

  5. 在集群管理页左侧导航栏,选择应用 > Helm

  6. Helm页面,单击ack-autoscaling-placeholder操作列的更新。然后在更新发布面板中,更新YAML,然后单击确定

    nameOverride: ""
    fullnameOverride: ""
    ##
    priorityClassDefault:
      enabled: true
      name: default-priority-class
      value: -1
    
    ##
    deployments:
       - name: ack-place-holder
         replicaCount: 1
         containers:
           - name: placeholder
             image: registry-vpc.cn-shenzhen.aliyuncs.com/acs/pause:3.1
             pullPolicy: IfNotPresent
             resources:
               requests:
                 cpu: 4                  #资源占位4C8G。
                 memory: 8               
         imagePullSecrets: {}
         annotations: {}
         nodeSelector:                   #节点选择。
           demo: "yes"  
         tolerations: []
         affinity: {}
         labels: {}
  7. 部署工作负载的PriorityClass。

    本文示例定义一个优先级较高的PriorityClass。

    kubectl apply -f priorityClass.yaml
    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: high-priority
    value: 1000000              #配置优先级。
    globalDefault: false
    description: "This priority class should be used for XYZ service pods only."
  8. 部署实际的工作负载。

    kubectl apply -f workload.yaml
    apiVersion: apps/v1 
    kind: Deployment
    metadata:
      name: placeholder-test
      labels:
        app: nginx
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          nodeSelector:                        #节点选择。
            demo: "yes"
          priorityClassName: high-priority     #这里写入第8步配置的PriorityClass名称。
          containers:
          - name: nginx
            image: nginx:1.7.9 
            ports:
            - containerPort: 80
            resources:       
              requests:      
                cpu: 3                         #实际负载的资源需求。
                memory: 5

    从下图可以看到,实际工作负载由于Pod配置了高优先级的PriorityClass。当节点资源不足时,会将占位容器placeHolder进行驱逐,此时占位容器placeHolder处于Pending状态。由于集群开通了自动伸缩,此状态会触发ACK集群进行扩容。实现了工作负载的秒级弹出pendingrun

相关文档

多可用区均衡是数据类型业务在高可用场景下常用的部署方式。当业务压力增大时,有多可用区均衡调度策略的应用希望可以自动扩容出多个可用区的实例来满足集群的调度水位。详细信息,请参见多可用区实现同时快速弹性扩容