文档

通过注册集群实现IDC中K8s集群以Serverless方式使用云上CPU和GPU资源

更新时间:

IDC中K8s集群通过Serverless方式使用阿里云弹性容器实例ECI运行业务Pod。您可以在K8s集群直接提交业务Pod,使Pod运行在ECI上,无需额外运维云上节点池,更加灵活、高效、弹性地使用云上CPU和GPU资源。本文介绍如何基于注册集群实现IDC中K8s集群以Serverless方式使用云上CPU和GPU资源。

背景信息

为IDC中K8s集群直接添加云上节点或GPU节点的方式,适用于需要自定义配置的节点(runtime、kubelet、NVIDIA等)和特定的ECS实例规格等场景,该方式需要自行维护云上节点池,增加额外成本。您可以选择Serverless方式使用阿里云弹性容器实例ECI运行业务Pod,无需额外运维云上节点池,可以更加高效弹性的使用云上CPU和GPU资源。

前提条件

使用场景

通过Serverless方式使用云上CPU和GPU资源,解决的依然是IDC中K8s集群的弹性能力不足,不能满足业务的快速增长、周期性业务增长和突发业务流量的问题。

通过Serverless方式,您可以在K8s集群直接提交业务Pod,该Pod将使用阿里云弹性容器实例ECI运行,弹性容器实例ECI启动速度快,与业务Pod的生命周期一致,按Pod运行时间计费。从而不需要为IDC中K8s集群创建云上节点,无需规划云上资源容量,也不需要等待ECS创建完成,实现了极致弹性,并节省了节点的运维成本。通过Serverless方式使用云上CPU和GPU资源的方式如下图所示。

image

IDC中K8s集群以Serverless方式使用云上CPU和GPU资源适合以下业务场景。

  • 在线业务的波峰波谷弹性伸缩:例如,在线教育、电商等行业有着明显的波峰波谷计算特征。使用Serverless ECI可以显著减少固定资源池的维护,降低计算成本。

  • 数据计算:使用Serverless ECI承载Spark、Presto、ArgoWorkflow等计算场景,按Pod运行时间计费,有效降低计算成本。

  • CI/CD Pipeline:Jenkins、Gitlab-Runner。

  • Job任务:定时任务、AI。

步骤一:安装相关组件

通过注册集群实现IDC中K8s集群以Serverless方式使用云上CPU和GPU资源,您需要安装以下组件。

  • ack-virtual-node:使用虚拟节点和ECI的极致弹性能力。

  • ack-co-scheduler:通过该组件,您可以自定义ResourcePolicy CR对象,使用多级弹性调度功能。

您可以通过以下两种方式安装组件。

通过onectl安装

  1. 在本地安装配置onectl。具体操作,请参见通过onectl管理注册集群

  2. 执行以下命令,安装ack-virtual-node和ack-co-scheduler组件。

    onectl addon install ack-virtual-node
    onectl addon install ack-co-scheduler

    预期输出:

    Addon ack-virtual-node, version **** installed.
    Addon ack-co-scheduler, version **** installed.

通过控制台安装

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,单击其他页签,找到ack-virtual-node和ack-co-scheduler组件,在卡片右下方单击安装

  4. 在提示对话框中单击确定

步骤二:查看节点

ack-virtual-node组件安装完成后,您可以通过注册集群kubeconfig查看集群节点池。virtual-kubelet为虚拟节点,对接阿里云Serverless ECI。

执行以下命令,查看节点。

kubectl get node

预期输出:

NAME                               STATUS   ROLES    AGE    VERSION
iz8vb1xtnuu0ne6b58hvx0z            Ready    master   4d3h   v1.20.9   # IDC集群节点,示例只有1个Master节点,同时也是Worker节点,可以运行业务容器。
virtual-kubelet-cn-zhangjiakou-a   Ready    agent    99s    v1.20.9。 # 安装ack-virtual-node组件生产的虚拟节点。

步骤三:使用Serverless ECI运行Pod(CPU和GPU任务)

您可以通过以下两种方式进行配置,使用Serverless ECI运行Pod。

方式一:配置Pod标签

如下示例中,使用GPU ECI实例运行CUDA任务。您无需安装配置NVIDIA driver和runtime,真正做到Serverless化运行。

您可以为Pod添加标签alibabacloud.com/eci=true,使Pod以Serverless ECI的方式运行。

  1. 使用以下YAML内容,提交Pod,使用Serverless ECI运行。

    > cat <<EOF | kubectl apply -f -
    apiVersion: v1
    kind: Pod
    metadata:
      name: gpu-pod
      labels:
        alibabacloud.com/eci: "true"  # 指定Pod使用Serverless ECI运行。
      annotations:
        k8s.aliyun.com/eci-use-specs: ecs.gn5-c4g1.xlarge  # 指定支持的GPU规格,该规格具备1个NVIDIA P100 GPU。
    spec:
      restartPolicy: Never
      containers:
        - name: cuda-container
          image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/cuda10.2-vectoradd
          resources:
            limits:
              nvidia.com/gpu: 1 # 申请1个GPU。
    EOF
    
  2. 执行以下命令,查看Pod。

    kubectl get pod -o wide

    预期输出:

    NAME       READY   STATUS      RESTARTS   AGE     IP              NODE                               NOMINATED NODE   READINESS GATES
    gpu-pod    0/1     Completed   0          5m30s   172.16.XX.XX   virtual-kubelet-cn-zhangjiakou-a   <none>           <none>
    kubectl logs gpu-pod

    预期输出:

    Using CUDA Device [0]: Tesla P100-PCIE-16GB
    GPU Device has SM 6.0 compute capability
    [Vector addition of 50000 elements]
    Copy input data from the host memory to the CUDA device
    CUDA kernel launch with 196 blocks of 256 threads
    Copy output data from the CUDA device to the host memory
    Test PASSED
    Done

    预期输出表明,Pod运行在虚拟节点virtual-kubelet上,实际后台使用阿里云Serverless ECI运行。

方式二:配置命名空间标签

您可以通过以下命令,为命名空间添加标签alibabacloud.com/eci=true,该命名空间中所有新建的Pod,将以Serverless ECI方式运行。

kubectl label namespace <namespace-name> alibabacloud.com/eci=true

步骤四:使用多级弹性调度

参见步骤三使用Pod或命名空间的标签让Pod以Serverless ECI的方式运行后,您可以使用ACK One注册集群的多级弹性调度功能实现此效果:应用运行过程中优先使用IDC中的节点资源运行Pod,当IDC资源不足时,再使用阿里云Serverless ECI运行Pod。

通过ack-co-scheduler组件,可以自定义ResourcePolicy CR对象,从而使用多级弹性调度功能。ResourcePolicy CR为命名空间资源,主要参数说明如下。

参数

说明

selector

声明ResourcePolicy作用于同一命名空间下label上打了key1=value1的Pod。

strategy

调度策略选择,目前仅支持prefer

units

用户自定义的调度单元。应用扩容时,将按照units下资源的顺序选择资源运行;应用缩容时,将按照逆序进行缩容。

  • resource:弹性资源的类型,目前支持idcecseci三种类型。

  • nodeSelector:用nodelabel标识该调度单元下的节点,只对ecs弹性资源生效。

  • max:在该组资源最多部署多少个实例。

  1. 使用以下内容,定义ResourcePolicy CR,优先使用IDC中集群资源,再使用云上Serverless ECI资源。

    > cat << EOF | kubectl apply -f -
    apiVersion: scheduling.alibabacloud.com/v1alpha1
    kind: ResourcePolicy
    metadata:
      name: cost-balance-policy
    spec:
      selector:
        app: nginx           # 选择应用Pod。
        key1: value1
      strategy: prefer
      units:
      - resource: idc        # 优先使用IDC指定使用IDC中节点资源。
        max:3
      - resource: eci        # 当IDC节点资源不足时,使用Serverless ECI。
        nodeSelector:
          key2: value2
    EOF
  2. 使用以下内容,创建应用Deployment,启动2个副本,每个副本需要2个CPU。

    > cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          name: nginx
          annotations:
            addannotion: "true"
          labels:
            app: nginx      # 此处要与上一步创建的ResourcePolicy的selector相关联。
        spec:
          schedulerName: ack-co-scheduler
          containers:
          - name: nginx
            image: acr-multiple-clusters-registry.cn-hangzhou.cr.aliyuncs.com/ack-multiple-clusters/nginx
            resources:
              requests:
                cpu: 2
              limits:
                cpu: 2
    EOF
  3. 执行以下命令,对应用扩容4个副本。

    IDC中K8s集群只有一个6 CPU节点,最多启动2个Nginx Pod(系统资源预留,无法启动3个Pod),剩余的2个副本在IDC节点资源不足后,将自动使用阿里云Serverless ECI运行Pod。

    kubectl scale deployment nginx --replicas 4
  4. 执行以下命令,查看Pod运行情况。

    > kubectl get pod -o wide

    预期输出:

    NAME                     READY   STATUS    RESTARTS   AGE     IP              NODE                      
    nginx-79cd98b4b5-97s47   1/1     Running   0          84s     10.100.XX.XX    iz8vb1xtnuu0ne6b58h****   
    nginx-79cd98b4b5-gxd8z   1/1     Running   0          84s     10.100.XX.XX    iz8vb1xtnuu0ne6b58h****   
    nginx-79cd98b4b5-k55rb   1/1     Running   0          58s     10.100.XX.XX    virtual-kubelet-cn-zhangjiakou-a
    nginx-79cd98b4b5-m9jxm   1/1     Running   0          58s     10.100.XX.XX    virtual-kubelet-cn-zhangjiakou-a

    预期输出表明,2个Pod运行在IDC中的节点,2个Pod使用虚拟节点在阿里云Serverless ECI上运行。