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

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

容器计算服务 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注册集群并接入数据中心或者其他云厂商的Kubernetes集群(建议版本为1.24及以上)。具体操作,请参见创建ACK One注册集群

  • 已安装ACK Virtual Node组件,且组件版本为2.13.0及以上。具体操作,请参见安装ack-virtual-node组件

ack-virtual-node组件配置RAM权限

通过onectl配置

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

  2. 执行以下命令,为ack-virtual-node组件配置RAM权限。

    onectl ram-user grant --addon ack-virtual-node

    预期输出:

    Ram policy ack-one-registered-cluster-policy-ack-virtual-node granted to ram user ack-one-user-ce313528c3 successfully.

通过控制台配置

在注册集群安装组件之前,您需要在接入集群中设置AccessKey用来访问云服务的权限。设置AccessKey之前,您需要创建RAM用户并为其添加访问相关云资源的权限。

  1. 创建RAM用户

  2. 可选:创建自定义权限策略,策略内容如下。

    展开查看自定义策略模板

    {
        "Version": "1",
        "Statement": [
            {
                "Action": [
                    "vpc:DescribeVSwitches",
                    "vpc:DescribeVpcs"
                ],
                "Resource": "*",
                "Effect": "Allow"
            },
            {
                "Action": [
                    "eci:CreateContainerGroup",
                    "eci:DeleteContainerGroup",
                    "eci:DescribeContainerGroups",
                    "eci:DescribeContainerGroupStatus",
                    "eci:DescribeContainerGroupEvents",
                    "eci:DescribeContainerLog",
                    "eci:UpdateContainerGroup",
                    "eci:UpdateContainerGroupByTemplate",
                    "eci:CreateContainerGroupFromTemplate",
                    "eci:RestartContainerGroup",
                    "eci:ExportContainerGroupTemplate",
                    "eci:DescribeContainerGroupMetric",
                    "eci:DescribeMultiContainerGroupMetric",
                    "eci:ExecContainerCommand",
                    "eci:CreateImageCache",
                    "eci:DescribeImageCaches",
                    "eci:DeleteImageCache",
                    "eci:DescribeContainerGroupMetaInfos",
                    "eci:UpdateImageCache",
                    "eci:RestartContainer",
                    "eci:RestartContainers"
                ],
                "Resource": [
                    "*"
                ],
                "Effect": "Allow"
            },
            {
                "Action": [
                    "acc:DescribeZones",
                    "acc:CreateInstance",
                    "acc:UpdateInstance",
                    "acc:DeleteInstance",
                    "acc:RestartInstance",
                    "acc:DescribeInstances",
                    "acc:DescribeInstanceStatus",
                    "acc:DescribeInstanceEvents",
                    "acc:DescribeInstanceDetail",
                    "acc:DescribeMultiInstanceMetric",
                    "acc:DescribeContainerLog",
                    "acc:ResizeInstanceVolume",
                    "acc:CreateCustomResource",
                    "acc:UpdateCustomResource",
                    "acc:DeleteCustomResource",
                    "acc:DescribeCustomResources",
                    "acc:DescribeCustomResourceDetail"
                ],
                "Resource": "*",
                "Effect": "Allow"
            }
        ]
    }
  3. RAM用户授权

    可选择添加AliyunECIFullAccess、AliyunVPCReadOnlyAccessAliyunAccFullAccess系统策略或自定义权限策略为RAM用户授权。

  4. RAM用户创建AccessKey

    警告

    建议您参见AccessKey网络访问限制策略配置网络策略,将AccessKey调用来源控制在可信的网络环境内,提升AccessKey的安全性。

  5. 使用AccessKey在注册集群中创建名为alibaba-addon-secretSecret资源。

    安装ack-virtual-node组件时将自动引用此AccessKey访问对应的云服务资源。

    kubectl -n kube-system create secret generic alibaba-addon-secret --from-literal='access-key-id=<your access key id>' --from-literal='access-key-secret=<your access key secret>'
    说明

    <your access key id><your access key secret>为上一步获取的AccessKey信息。

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

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

说明

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

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

  1. 更新注册集群安全组配置。

    1. 在集群的基本信息页面,单击控制面安全组后方的安全组ID。

    2. 在安全组详情页,单击添加规则。按照下表内容填写。

      规则类型

      协议

      端口范围

      IP范围

      描述

      入方向

      TCP

      80

      IDC集群CIDR,例如192.168.1.0/24。

      用于配置ACS终端节点场景。

      入方向

      TCP

      443

      IDC集群CIDR,例如192.168.1.0/24。

      用于配置ACS终端节点场景。

      入方向

      TCP

      10250

      IDC集群CIDR,例如192.168.1.0/24。

      Serverless kubelet服务监听的端口号 。

  2. 使用以下内容,创建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的算力类型。
            alibabacloud.com/compute-qos: default # 配置ACS Pod的算力质量。
        spec:
          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应用。

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

    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的节点上。

  5. 执行以下命令,查看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: GN8IS  # GPU卡型,请按照实际情况替换
...
说明
  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"

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

ACS GPU HPN算力的使用与ACS CPU算力的主要链路和使用流程相同,但存在以下使用要求:

  • 需提前购买GPU-HPN容量预留,并关联到集群。

  • 若需使用ACS GPU HPN算力,需升级ACK Virtual Node组件版本。对应组件版本处于邀测阶段,请提交工单申请。

使用方法

...     
labels:
  # label中声明acs GPU资源需求
  alibabacloud.com/compute-class: gpu-hpn     #固定为gpu-hpn类型
  alibabacloud.com/compute-qos: default    #计算qos类型,含义与普通acs算力相同
  alibabacloud.com/acs: "true"           # 配置使用ACS算力标签
...
说明
  • 关于ACS的算力类型和算力质量,请参见计算类型与算力质量的对应关系

  • 关于ACS Pod的其他功能参数配置,请参见ACS Pod

  • ACS GPU HPN类型Node仅能调度gpu-hpn计算类的Pod(Pod资源声明中可以不填写GPU资源需求),不能调度其他计算类或者未声明计算类的Pod。

  1. 您可以使用K8sNodeSelector配置,将Pod指定调度到GPU HPN节点上。

    重要

    ACS GPU HPN类型Pod请重点关注以下字段配置:

    • 指定计算类:alibabacloud.com/compute-class: gpu-hpn

    • 指定预留节点标签:alibabacloud.com/node-type: reserved

    • 资源规格的requestslimits字段的设备资源名称,请参考实际的设备卡型填写,例如NVIDIA或其他。

    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-hpn
            alibabacloud.com/compute-qos: default
            alibabacloud.com/acs: "true" 
        spec:
          # 指定gpu-hpn预留节点标签
          nodeSelector:
            alibabacloud.com/node-type: reserved
          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"