通过虚拟节点将Pod调度到ACS上运行

更新时间:2025-03-11 02:56:40

容器计算服务 ACS(Container Compute Service)已集成至ACK One注册集群,您可以通过ACK One注册集群快速使用ACS提供的容器算力。本文介绍ACK One注册集群如何接入ACS算力。

ACK One注册集群对接方式

容器计算服务 ACS(Container Compute Service)是以Kubernetes为用户界面的容器服务产品,提供符合容器规范的算力资源。ACSKubernetes管控和容器算力分层设计,为Kubernetes提供一种层次化的解决方案:ACS的计算资源层负责底层Pod容器资源的调度和分配,而Kubernetes则在此基础上负载业务负载管理,例如管理Deployment、Service、StatefulSet、CronJob等。

ACS容器算力可以通过虚拟节点(Virtual Node)的形式接入到Kubernetes集群中,使得集群可以轻松获得极大的弹性能力,而不必受限于集群的节点计算容量。ACS在接管Pod容器底层基础设施的管理工作后,Kubernetes不再需要直接负责单个Pod的放置、启动等工作,也不再需要关心底层虚拟机的资源情况,通过ACS即可确保Pod需要的资源随时可用。

ACK One注册集群中,需要先通过组件中心安装ack-virtual-node组件,以便部署虚拟节点并创建ACS Pod。当集群需要扩容时,可以直接在虚拟节点下按需创建ACS Pod,无需规划节点的计算容量,且ACS Pod与集群中真实节点上的Pod之间网络互通。为了更有效地利用资源、缩短扩容时间并降低成本,建议将部分长时间运行且流量弹性变化的业务负载调度至虚拟节点。随着业务流量的减少,可以迅速释放虚拟节点上的Pod,以减少使用成本。虚拟节点上的Pod均基于ACS运行在安全隔离的容器运行环境中,每个Pod对应一个ACS实例。更多信息,请参见注册集群概述

image

前提条件

ACK One注册集群使用ACS CPU算力示例

ACK Virtual Node组件安装或升级到2.13.0及以上版本后,将同时支持ACSECI两种算力。

说明

Pod调度到虚拟节点的场景中,如果没有指定为ACS的算力类型,则默认会优先使用ECI弹性实例。

ACK使用ACS CPU算力可以通过以下步骤实现:

  1. 通过NodeSelector、亲和性和反亲和性、ResourcePolicy和配置标签alibabacloud.com/acs: true等调度方式将Pod调度到虚拟节点。具体步骤,请参见节点亲和性调度

  2. 通过标签(alibabacloud.com/compute-class:计算类型)指定创建ACS Pod的实例类型。关于ACS实例类型的介绍,请参见ACS Pod实例概述

具体操作步骤如下:

  1. 部署Deployment。

    NodeSelector
    标签调度
    1. 执行以下命令,查看虚拟节点的标签。命令中的virtual-kubelet-cn-shanghai-l请按实际内容修改。

      kubectl get node virtual-kubelet-cn-shanghai-l -oyaml

      预期输出:

      apiVersion: v1
      kind: Node
      metadata:
        labels:
         beta.kubernetes.io/arch: amd64
          beta.kubernetes.io/os: linux
          kubernetes.io/arch: amd64
          kubernetes.io/hostname: virtual-kubelet-cn-shanghai-l
          kubernetes.io/os: linux
          kubernetes.io/role: agent
          service.alibabacloud.com/exclude-node: "true"
          topology.diskplugin.csi.alibabacloud.com/zone: cn-shanghai-l
          topology.kubernetes.io/region: cn-shanghai
          topology.kubernetes.io/zone: cn-shanghai-l
          type: virtual-kubelet # 所有虚拟节点都存在该标签,可以使用该标签实现Pod定向调度到虚拟节点。
        name: virtual-kubelet-cn-shanghai-l
      spec:
        taints:
        - effect: NoSchedule
          key: virtual-kubelet.io/provider
          value: alibabacloud
    2. 使用以下YAML内容创建nginx.yaml,部署2Pod。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx
        labels:
          app: nginx
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            name: nginx
            labels:
              app: nginx 
              alibabacloud.com/compute-class: general-purpose # 配置ACS Pod的算力类型,未配置默认general-purpose
              alibabacloud.com/compute-qos: default # 配置ACS Pod的算力质量,未配置默认default
          spec:
            nodeSelector:
              type: virtual-kubelet #定向调度到虚拟节点
            tolerations:
            - key: "virtual-kubelet.io/provider" # 容忍虚拟节点的污点
              operator: "Exists"
              effect: "NoSchedule"
            containers:
            - name: nginx
              image: mirrors-ssl.aliyuncs.com/nginx:stable-alpine
              ports:
                - containerPort: 80
                  protocol: TCP        
              resources:
                limits:
                  cpu: 2
                requests:
                  cpu: 2
    3. 创建应用Nginx并查看部署结果。

      1. 执行以下命令,创建Nginx应用。

        kubectl apply -f nginx.yaml 
      2. 执行以下命令,查看部署结果。

        kubectl get pods -o wide

        预期输出:

        NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE                            NOMINATED NODE   READINESS GATES
        nginx-54bcbc9b66-****   1/1     Running   0          3m29s   192.168.XX.XXX   virtual-kubelet-cn-shanghai-l   <none>           <none>
        nginx-54bcbc9b66-****   1/1     Running   0          3m29s   192.168.XX.XXX   virtual-kubelet-cn-shanghai-l   <none>           <none>

        可以看到,这两个Pod通过nodeSelector被调度到labeltype=virtual-kubelet的节点上。

    1. 使用以下内容,创建nginx.yaml。

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: nginx
        labels:
          app: nginx
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: nginx
        template:
          metadata:
            labels:
              app: nginx 
              alibabacloud.com/acs: "true" # 配置使用ACS算力
              alibabacloud.com/compute-class: general-purpose # 配置ACS Pod的算力类型,未配置默认general-purpose
              alibabacloud.com/compute-qos: default # 配置ACS Pod的算力质量,未配置默认default
          spec:
            containers:
            - name: nginx
              image: mirrors-ssl.aliyuncs.com/nginx:stable-alpine
              ports:
                - containerPort: 80
                  protocol: TCP 
              resources:
                limits:
                  cpu: 2
                requests:
                  cpu: 2
    2. 执行以下命令,创建Nginx应用。

      kubectl apply -f nginx.yaml 
    3. 执行以下命令,查看部署结果。

      kubectl get pods -o wide

      预期输出:

      NAME                     READY   STATUS    RESTARTS   AGE     IP               NODE                            NOMINATED NODE   READINESS GATES
      nginx-54bcbc9b66-****   1/1     Running   0          3m29s   192.168.XX.XXX   virtual-kubelet-cn-shanghai-l   <none>           <none>
      nginx-54bcbc9b66-****   1/1     Running   0          3m29s   192.168.XX.XXX   virtual-kubelet-cn-shanghai-l   <none>           <none>

      可以看到,这两个Pod通过nodeSelector被调度到labeltype=virtual-kubelet的节点上。

  2. 执行以下命令,查看Nginx Pod详情。

    kubectl describe pod nginx-54bcbc9b66-**** 

    预期输出:

    Annotations:  ProviderCreate: done
                  alibabacloud.com/instance-id: acs-uf6008giwgjxlvn*****
                  alibabacloud.com/pod-ephemeral-storage: 30Gi
                  alibabacloud.com/pod-use-spec: 2-2Gi
                  kubernetes.io/pod-stream-port: 10250
                  network.alibabacloud.com/enable-dns-cache: false
                  topology.kubernetes.io/region: cn-shanghai

    输出的Pod内容中存在注解alibabacloud.com/instance-id: acs-uf6008giwgjxlvn*****则可确认该PodACS Pod实例。

ACK One注册集群使用ACS GPU算力示例

ACS CPU算力的主要链路和使用流程相同,但使用ACS GPU算力还需要确保调度相关的组件版本符合预期,并进行一些额外的配置。

开通方式

目前在ACK One注册集群使用ACS GPU算力处于邀测阶段,请提交工单申请。

使用方法

...     
     labels:
        # label中声明acs GPU资源需求
        alibabacloud.com/compute-class: gpu     #如为GPU类型,固定gpu即可
        alibabacloud.com/compute-qos: default   #计算qos类型,含义与普通acs算力相同
        alibabacloud.com/gpu-model-series: example-model  # GPU卡型,请按照实际情况替换,例如T4
...
说明
NodeSelector
标签调度
  1. 使用以下示例内容,创建GPU负载。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dep-node-selector-demo
      labels:
        app: node-selector-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: node-selector-demo
      template:
        metadata:
          labels:
            app: node-selector-demo
            # acs属性
            alibabacloud.com/compute-class: gpu
            alibabacloud.com/compute-qos: default
            alibabacloud.com/gpu-model-series: example-model  # GPU卡型,请按照实际情况替换,例如T4
        spec:
          # 指定vk的标签
          nodeSelector:
            type: virtual-kubelet
          # 容忍vk的taint
          tolerations:
          - key: "virtual-kubelet.io/provider" # 容忍虚拟节点的污点
            operator: "Exists"
            effect: "NoSchedule"
          containers:
          - name: node-selector-demo
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "1000h"
            resources:
              limits:
                cpu: 1
                memory: 1Gi
                nvidia.com/gpu: "1"
              requests:
                cpu: 1
                memory: 1Gi
                nvidia.com/gpu: "1"
  2. 执行以下命令,查看GPU负载运行状态。

    kubectl get pod node-selector-demo-9cdf7bbf9-s**** -oyaml

    预期输出:

        phase: Running
    
        resources:
          limits:
            #other resources
            nvidia.com/gpu: "1"
          requests:
            #other resources
            nvidia.com/gpu: "1"
  1. 使用以下示例内容,创建GPU负载。

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: dep-node-selector-demo
      labels:
        app: node-selector-demo
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: node-selector-demo
      template:
        metadata:
          labels:
            app: node-selector-demo
            # acs属性
            alibabacloud.com/acs: "true" # 配置使用ACS算力
            alibabacloud.com/compute-class: gpu
            alibabacloud.com/compute-qos: default
            alibabacloud.com/gpu-model-series: example-model  # GPU卡型,请按照实际情况替换,例如T4
        spec:
          containers:
          - name: node-selector-demo
            image: registry-cn-hangzhou.ack.aliyuncs.com/acs/stress:v1.0.4
            command:
            - "sleep"
            - "1000h"
            resources:
              limits:
                cpu: 1
                memory: 1Gi
                nvidia.com/gpu: "1"
              requests:
                cpu: 1
                memory: 1Gi
                nvidia.com/gpu: "1"
  2. 执行以下命令,查看GPU负载运行状态。

    kubectl get pod node-selector-demo-9cdf7bbf9-s**** -oyaml

    预期输出:

        phase: Running
    
        resources:
          limits:
            #other resources
            nvidia.com/gpu: "1"
          requests:
            #other resources
            nvidia.com/gpu: "1"
  • 本页导读 (0)
  • ACK One注册集群对接方式
  • 前提条件
  • ACK One注册集群使用ACS CPU算力示例
  • ACK One注册集群使用ACS GPU算力示例
  • 开通方式
  • 使用方法
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等