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

如果您的业务需要快速启动而无需考虑节点资源问题,你可以考虑使用ack-autoscaling-placeholder组件。ack-autoscaling-placeholder为集群的自动扩展提供缓冲区,当节点资源不足时,实际的工作负载会将提前预留的资源抢占,实现快速启动,然后结合使用节点自动伸缩功能,迫使集群进行节点维度的扩展。本文介绍如何使用ack-autoscaling-placeholder实现容器秒级伸缩。

操作流程

image

前提条件

  • 您已为ACK集群开通自动伸缩并配置了开启弹性的节点池,请参见启用节点自动伸缩

  • 为开启弹性的节点池设置节点标签,用于将工作负载调度到指定的节点池,便于验证结果。请参见创建和管理节点池

    本文操作以设置demo=yes标签为例。

步骤一:部署ack-autoscaling-placeholder组件并创建占位工作负载

ack-autoscaling-placeholder能够为集群的自动扩展提供一个缓冲区,使得集群的节点能够超量配置,提前预热。保证了工作负载能够快速扩展,无需等待节点创建并加入集群。

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

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

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

  4. 在创建面板,按照提示完成配置,然后单击确定

    参数配置页签中的参数内容替换为如下YAML示例。

    查看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: {}

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

步骤二:创建实际负载的PriorityClass

  1. 使用以下YAML示例,创建名为priorityClass.yaml的文件。

    apiVersion: scheduling.k8s.io/v1
    kind: PriorityClass
    metadata:
      name: high-priority
    value: 1000000       #配置优先级,比上一步骤占位Pod的默认优先级要高。
    globalDefault: false
    description: "This priority class should be used for XYZ service pods only."
  2. 执行以下命令部署实际工作负载的PriorityClass。

    kubectl apply -f priorityClass.yaml

    预期输出如下:

    priorityclass.scheduling.k8s.io/high-priority created

步骤三:创建实际工作负载

  1. 使用以下YAML示例,创建名为workload.yaml的文件。

    查看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     # 需要设置为上一步骤配置的PriorityClass名称。
          containers:
          - name: nginx
            image: anolis-registry.cn-zhangjiakou.cr.aliyuncs.com/openanolis/nginx:1.14.1-8.6 
            ports:
            - containerPort: 80
            resources:       
              requests:      
                cpu: 3         #实际负载的资源需求。
                memory: 5
  2. 执行以下命令部署实际的工作负载。

    kubectl apply -f workload.yaml

    预期输出如下:

    deployment.apps/placeholder-test created

结果验证

  1. 占位工作负载ack-place-holder创建成功后,Pod状态为running。

    image

  2. 实际工作负载部署时,由于配置了高优先级的PriorityClass,会将占位工作负载资源抢占过来实现快速启动,同时占位工作负载的Pod被驱逐,且因为节点资源不足处于Pending状态。

    • 实际工作负载placeholder-test快速部署在占位工作负载所在的节点

      image

    • 占位工作负载被驱逐,且处于Pending状态

      image

  3. 由于节点池开启了自动弹性功能,节点资源不足触发了节点扩容,占位工作负载被调度到新弹出来的节点上,状态为runing。

    image

相关文档

高可用场景下,实现多可用区部署的弹性扩容,请参见多可用区同时快速弹性扩容