You need to enable JavaScript to run this app.
导航

弹性资源优先级调度

最近更新时间2024.01.05 14:29:49

首次发布时间2023.02.27 15:04:26

容器服务提供弹性资源优先级调度策略,支持通过自定义资源策略(ResourcePolicy),设置工作负载的 Pod 被弹性调度到不同类型节点(例如包年包月 ECS、按量付费 ECS、虚拟节点)的顺序。本文主要介绍通过自定义资源策略(ResourcePolicy),设置弹性资源优先级调度的方法。

说明

邀测·申请试用】:该功能目前处于邀测阶段,如需使用,请提交申请。

前提条件

已安装 scheduler-plugin 组件。详细操作,请参见 scheduler-plugin 组件

使用限制

  • 目前仅支持在如下 Kubernetes 版本的集群中使用弹性资源优先级调度功能:
  • 该功能与 Kubernetes 的 pod-deletion-cost 冲突,不能同时使用。pod-deletion-cost 相关信息,请参见 pod-deletion-cost
  • 创建 ResourcePolicy 时,请确保目标命名空间下已调度的 Pod 没有被 ResourcePolicy 管理,否则已调度的 Pod 将会被优先缩容。
  • 修改已有的 ResourcePolicy 时,已调度的 Pod 会按照原 ResourcePolicy 的顺序进行缩容,新建的 Pod 会按照更新后 ResourcePolicy 的顺序进行缩容。
  • 仅 Deployment 支持通过 ResourcePolicy 实现逆序缩容,其余工作负载不支持逆序缩容。

    说明

    逆序缩容:指设置了 ResourcePolicy 的工作负载在缩容时,从 ResourcePolicy 中设置的优先级最低的资源池开始缩容。

  • 在弹性容器实例(VCI)场景中使用该功能时,请先了解 什么是弹性容器实例VCI 使用限制

使用方法

在 ResourcePolicy 中定义弹性资源优先级。

说明

  • ResourcePolicy 作用于同命名空间下符合指定 Label 的所有工作负载相关 Pod。
  • 下文中的 资源池 与 VKE 中定义的 节点池 不同,资源池 是集群中符合某一筛选条件的所有节点集合。
    例如下文中vci-pool为当前集群中,所有符合type=virtual-kubelet的节点集合。
apiVersion: scheduling.vke.volcengine.com/v1beta1
kind: ResourcePolicy
metadata:
  name: vke-resourcepolicy   # ResourcePolicy 对象名称。
  namespace: default   # ResourcePolicy 所属命名空间。
spec:
  selector:   # 被 ResourcePolicy 管理的 Pod 的 Label 选择器。
    app: nginx
  strategy: prefer   # 调度策略,有 require、prefer 两种策略。
  subsets:   # 资源池配置。
  - name: pool-1
    type: ecs 
    maxReplicas: 100 
    nodeSelectorTerm: 
    - key: cluster.vke.volcengine.com/machinepool-name
      operator: In
      values:
      - node-pool-1
      - node-pool-2
  - name: vci-pool   # 资源池名称。
    type: vci
    nodeSelectorTerm:
    - key: type
      operator: In
      values:
      - virtual-kubelet

status:   # ResourcePolicy 的当前状态。
  policyStatuses:  # 各个资源池对应的可调度 Pod 情况。
  - name: pool-1
    missingReplicas: 50
  - name: vci-pool
    missingReplicas: "-"

重点参数说明如下所示。

参数描述
selector被 ResourcePolicy 管理的 Pod 的 Label 选择器。表示该 ResourcePolicy 作用于同命名空间下指定 Label 的 Pod。

strategy

调度策略,有如下两种策略:

  • require:表示 Pod 只能调度到 subsets 中配置的资源池节点上。
  • prefer:表示 Pod 优先调度到 subsets 中配置的资源池节点上,如果资源池节点不足,则调度到 subsets 中配置的资源池以外的节点。

subsets

目标资源池。顺序越靠前,Pod 会优先调度到该资源池节点;Pod 缩容时,优先从最靠后的资源池节点进行缩容。
子参数说明如下:

  • name:资源池名称。
  • type:资源池类型。有如下两种类型:
    • ecs:表示云服务器节点资源池。
    • vci:表示弹性容器实例资源池。
  • maxReplicas:调度到该资源池的 Pod 数量上限。不设置表示不限制。
  • nodeSelectorTerm:通过 Label 选择可调度的节点池。

policyStatuses

各个资源池对应的可调度 Pod 情况。

  • name:资源池名称。
  • missingReplicas:该资源池剩余可调度的 Pod 数量。missingReplicas: "-"表示您在创建该 ResourcePolicy 时,没有设置 maxReplicas。

使用示例

本文以如下场景为例,描述创建 ResourcePolicy,定义弹性资源优先级的方法:

您的集群中同时存在云服务器(ECS)节点类型资源和弹性容器实例 VCI 资源。在该集群中部署一个工作负载(例如 Deployment)时,为了降低资源使用成本,您希望:

  • 部署的 Pod 优先调度的顺序依次为:云服务器节点类型资源 > 弹性容器实例 VCI 资源。
  • 在缩容时优先删除 VCI 上的 Pod,释放 VCI 资源,再删除 ECS 上的 Pod,释放 ECS 资源。

步骤一:创建集群并开启弹性资源优先级调度

  1. 登录 容器服务控制台
  2. 在容器服务的左侧导航栏,选择 集群
  3. 单击 创建集群,根据系统提示和实际需求配置集群参数。
    其中部分参数按如下说明配置,其余参数的详细配置说明,请参见 创建集群
    • 因为以集群中同时存在 ECS 和 VCI 资源的场景为例,所以在 ① 集群配置 步骤中 容器网络模型 选择 VPC-CNI
      alt
    • 在 ③ 组件配置 步骤的 scheduler-plugin 参数配置 中查看 弹性资源优先级调度 状态。

      说明

      当前新建集群时,默认开启弹性资源优先级调度。

      alt
  4. 确认配置并单击 确定,创建完成集群。

步骤二:创建 ResourcePolicy

  1. 通过 kubectl 连接 步骤一 中创建的 VPC-CNI 集群。具体操作说明,请参见 连接集群
  2. 创建 ResourcePolicy 的 YAML 文件。示例文件vke-demo-rp.yaml代码如下:
    apiVersion: scheduling.vke.volcengine.com/v1beta1
    kind: ResourcePolicy
    metadata:
      name: vke-demo-rp
      namespace: default
    spec:
      selector:
        app: demo-deployment-app  # Pod Label,与工作负载中的 Pod Label 相同。
      strategy: prefer
      subsets:
      - name: ecs-pool
        type: ecs
        maxReplicas: 2  # 最多调度 2 个 Pod 到 ECS 资源上。
        nodeSelectorTerm:  # 将符合 Label 为 app: demo-deployment-app 的 Pod,调度到 Label 为 cluster.vke.volcengine.com/machinepool-name: pcgc1omersf****** 的 ECS 资源上。
        - key: cluster.vke.volcengine.com/machinepool-name
          operator: In
          values:
          - pcgc1omersf******
      - name: vci-pool
        type: vci
        nodeSelectorTerm:  # 将符合 Label 为 app: demo-deployment-app 的 Pod,调度到 key 为 type,values 为 virtual-kubelet 的 VCI 资源上。
        - key: type
          operator: In
          values:
          - virtual-kubelet
    
  3. 执行以下命令,创建 ResourcePolicy。
    kubectl apply -f vke-demo-rp.yaml
    

步骤三:创建工作负载

本文以创建无状态负载(Deployment)为例,更多工作负载相关操作,请参见 工作负载

  1. 创建 Deployment 的 YAML 文件。示例文件demo-deployment-app.yaml代码如下:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: demo-deployment-app
  namespace: default
spec:
  replicas: 5  # Pod 数量。
  selector:
    matchLabels:
      app: demo-deployment-app
  template:
    metadata:
      labels:
        app: demo-deployment-app  # Pod Label,与 ResourcePolicy 的 Selector 中配置的 Label 相匹配。
    spec:
      schedulerName: default-scheduler
      containers:
      - image: nginx
        imagePullPolicy: IfNotPresent
        name: nginx-container
        resources:
          requests:
            cpu: 10m
            memory: 10Mi
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
  1. 执行以下命令,创建 Deployment。
    kubectl apply -f demo-deployment-app.yaml
    

步骤四:查看调度结果

  1. 执行如下命令,查看调度结果。
    kubectl get po -n default -o wide
    
    预期输出如下,2 个 Pod 被调度到 ECS 资源上,剩余的 Pod(3 个)被调度到 VCI 资源。
    NAME                                   READY   STATUS    RESTARTS   AGE   IP              NODE                      NOMINATED NODE   READINESS GATES
    demo-deployment-app-756c997756-56w4p   1/1     Running   0          15s   192.168.**.**   vci-node1-cn-shanghai-a   <none>           <none>
    demo-deployment-app-756c997756-d5p7r   1/1     Running   0          15s   192.168.**.**   192.168.**.**             <none>           <none>
    demo-deployment-app-756c997756-f7gx7   1/1     Running   0          15s   192.168.**.**   vci-node1-cn-shanghai-a   <none>           <none>
    demo-deployment-app-756c997756-f7w68   1/1     Running   0          15s   192.168.**.**   vci-node1-cn-shanghai-a   <none>           <none>
    demo-deployment-app-756c997756-fpd9w   1/1     Running   0          15s   192.168.**.**   192.168.**.**             <none>           <none>
    
    
  2. (可选)查看 Pod 缩容时,释放资源的情况。
    1. 执行如下命令,将 Deployment 的 Pod 数量(即 replicas 参数值)降到 3。
      kubectl scale --replicas=3 deployment/demo-deployment-app -n default
      
    2. 查看调度结果。
      kubectl get po -n default -o wide
      
      预期输出如下,VCI 资源上的 2 个 Pod 被优先缩容,释放 VCI 资源。
      NAME                                   READY   STATUS    RESTARTS   AGE   IP              NODE                      NOMINATED NODE   READINESS GATES
      demo-deployment-app-756c997756-56w4p   1/1     Running   0          40m   192.168.**.**   vci-node1-cn-shanghai-a   <none>           <none>
      demo-deployment-app-756c997756-d5p7r   1/1     Running   0          40m   192.168.**.**   192.168.**.**             <none>           <none>
      demo-deployment-app-756c997756-fpd9w   1/1     Running   0          40m   192.168.**.**   192.168.**.**             <none>           <none>