通过ACK集群管理AI节点

更新时间:

您可以使用ACK(Container Service for Kubernetes,简称容器服务 ACK)管理购买的AI节点,包括在ACK集群中查看AI节点信息,使用AI节点的GPU资源部署推理服务等工作负载。本文为您介绍ACK集群与AI节点绑定与解绑的相关操作。

前提条件

  • AI节点配置:已为集群添加AI节点。开启AI节点功能、添加或删除AI节点,请参见AI节点变更配置

  • ACK集群配置

    • 创建ACK集群

    • 配置集群安全组。ACK所在的安全组,入方向开放ACK交换机对应网段的6443端口,出方向开放10450端口。如果ACK集群配置了访问控制,请将ACK交换机对应的IP地址加入到访问控制白名单中。

  • 权限准备:如果您使用RAM用户操作,需要授予RAM用户ACK访问权限(AliyunCSReadOnlyAccess)。

  • 功能开通:该功能处于公测阶段,请提交工单联系技术支持开通此功能。

注意事项

AI节点与原生K8s(Kubernetes)功能及使用基本一致,但部分功能存在一定差异:

费用说明

创建AI节点与ACK集群会收取费用,通过ACK集群绑定AI节点等管理操作不收取额外费用。

绑定ACK集群与AI节点

步骤一:导入ACK集群配置

  1. 登录云原生数据仓库AnalyticDB PostgreSQL版控制台,找到目标实例,单击实例ID。

  2. 单击左侧菜单栏的AI节点

  3. 单击导入ACK配置

    image

  4. 在弹出框中选择要导入的ACK集群,单击确定

步骤二:绑定AI节点

重要

AI节点会挂载ACK VPC网段的ENI作为其IP地址,即每个AI节点都会占用一个用户VPC IP地址。

  1. 单击编辑AI节点

    image

  2. 在弹出框左侧未绑定区域中,选择已创建的AI节点,并移动到右侧已绑定区域,单击确定

    image

步骤三:查看绑定关系

您可以通过以下方式查看绑定关系:

  • 通过控制台查看

    image

  • 通过kubectl命令查看

    kubectl get node

创建工作负载

可以通过指定nodeSelector或者nodeName的方式,将工作负载(Pod/Deployment/StatefulSet)部署在AI节点上。

  1. Pod为例,YAML配置内容如下。通过kubectl部署应用的具体操作,请参见部署应用

    apiVersion: v1
    kind: Pod
    metadata:
      name: ray-gpu
      namespace: default
    spec:
      containers:
      - command:
        - sh
        - -c
        - while true;do sleep 1000; done
        image: ${image}
        imagePullPolicy: Always
        name: ray-gpu
        resources:
          limits:
            cpu: "4"
            memory: 12Gi
            nvidia.com/gpu: "1"
          requests:
            cpu: "4"
            memory: 12Gi
            nvidia.com/gpu: "1"
        securityContext:
          runAsGroup: 0
          runAsUser: 0
        volumeMounts:
        - mountPath: dev/shm
          name: sharememory
        - name: oss-volume
          mountPath: /oss-data/
      dnsPolicy: Default
      imagePullSecrets:
      - name: ${imagePullSecrets}
      restartPolicy: Always
      tolerations:
      - effect: NoSchedule
        key: virtual-kubelet.io/provider
        value: aliclouddb
      nodeSelector: 
        alibabacloud.com/virtual-node: "true"
      volumes:
      - emptyDir:
          medium: Memory
        name: sharememory
      - name: oss-volume
        persistentVolumeClaim:
          claimName: oss-test
  2. 查看Pod部署信息。

    • 查看Pod的状态、IP等信息。

      kubectl get pod -o wide
    • Pod申请了一张gpu卡(nvidia.com/gpu=1),执行以下命令进入该Pod查看详细信息。

      kubectl exec -it ray-gpu -- bash
      nvidia-smi

解绑AI节点

  1. 单击编辑AI节点

    image

  2. 在弹出框右侧已绑定区域,选择已绑定的AI节点,并移动到左侧未绑定区域中,单击确定

    image

删除ACK配置

重要

删除ACK配置前,需要解绑该配置下所有关联的AI节点。

找到待删除ACK配置所在行,单击操作列的删除

image

附录

使用说明

AI节点功能使用上与原生K8s(Kubernetes)使用方式基本一致,但有以下几点需要注意。

AI节点调度

  • 通过nodeName或者nodeSelector进行节点筛选。

    // 方式1
    nodeSelector:
      alibabacloud.com/virtual-node: "true"
    
    // 方式2
    nodeName: "ai-xxx"
  • 需要容忍污点:virtual-kubelet.io/provider

    tolerations:
    - effect: NoSchedule
      key: virtual-kubelet.io/provider
      value: aliclouddb

GPU使用

Pod speclimit中和requests中需要添加nvidia.com/gpu(gpu卡的数量),例如:

resources:
  limits:
    cpu: "4"
    memory: 12Gi
    nvidia.com/gpu: "1"
  requests:
    cpu: "4"
    memory: 12Gi
    nvidia.com/gpu: "1"

对象存储OSS挂载

对象存储OSS采用标准PVC的方式进行挂载,示例如下:

  1. 创建PV

    PV示例:

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      labels:
        alicloud-pvname: oss-test
      name: oss-test
    spec:
      accessModes:
      - ReadWriteMany
      capacity:
        storage: 50Gi
      csi:
        driver: ossplugin.csi.alibabacloud.com
        volumeAttributes:
          akId: ${用户账号AccessKey ID}
          akSecret: ${用户账号AccessKey Secret}
          bucket: ${OSS bucket名称}
          otherOpts: ${OSS配置参数}
          url: ${OSS endpoint}
        volumeHandle: oss-csi-pv
      storageClassName: oss
      persistentVolumeReclaimPolicy: Retain
      volumeMode: Filesystem

    说明:

    • 用户账号AccessKey:需要至少有OSS bucket读权限。

    • OSS bucket访问配置参数:例如-o max_stat_cache_size=0 -o allow_other

    • OSS endpoint:一般为内网地址,例如oss-cn-beijing-internal.aliyuncs.com

  2. 创建PVC

    PVC示例:

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: oss-test
      namespace: default
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 50Gi
      storageClassName: oss
      volumeMode: Filesystem
      volumeName: ${pv名称}

    参数说明:

    volumeName:需要静态绑定的pv名称,本示例为上文中的oss-test。

  3. 创建工作负载,volume使用上文中的PVC

    Pod示例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: ray-gpu
      namespace: default
    spec:
      containers:
      - command:
        - sh
        - -c
        - while true;do sleep 1000; done
        image: ${image}
        imagePullPolicy: Always
        name: ray-gpu
        resources:
          limits:
            cpu: "4"
            memory: 12Gi
            nvidia.com/gpu: "1"
          requests:
            cpu: "4"
            memory: 12Gi
            nvidia.com/gpu: "1"
        volumeMounts:
        - name: oss-volume
          mountPath: /oss-data/
      dnsPolicy: Default
      imagePullSecrets:
      - name: ${imagePullSecrets}
      restartPolicy: Always
      tolerations:
      - effect: NoSchedule
        key: virtual-kubelet.io/provider
        value: aliclouddb
      nodeSelector: 
        alibabacloud.com/virtual-node: "true"
      volumes:
      - name: oss-volume
        persistentVolumeClaim:
          claimName: oss-test

    说明:

    volume使用上文中的PVC。

使用限制

与原生K8s的功能相比,AI节点功能存在一定使用限制,功能对比及具体支持情况如下。

功能对比

维度

AI节点Pod

标准Node Pod

核心功能

基础生命周期管理。

完整的Kubernetes原生能力。

网络

受限(依赖外部平台)。

支持Service、NetworkPolicy等。

存储

可使用部分存储资源。

所有用户集群可被使用的存储资源。

调度

无拓扑感知、亲和性受限。

完整的调度策略支持。

监控与安全

依赖平台工具,SecurityContext受限。

原生集成Prometheus、RABC等。

WorkLoad支持

能力

支持情况(AI节点Pod)

说明

Deployment

支持

无。

Statefulset

支持

无。

Pod

支持

无。

Daemonset

不支持

AI节点本身不支持Daemonset类型的Workload。

基础生命周期管理

能力

支持情况(AI节点Pod)

说明

Pod创建与删除

支持

无。

Pod状态上报

支持

无。

资源请求(CPU/内存/GPU)

支持

无。

标签(Labels)

不支持

会忽略用户自定义的标签。

注解(Annotations)

不支持

会忽略用户自定义的注解。

网络

能力

支持情况(AI节点Pod)

说明

Pod IP分配

支持

IP为用户VPC弹性网卡ENI,可能与集群内IP不互通(需依赖VPC对等连接)。

DNS解析

部分支持

提供默认DNS服务器:

  • NameServer 100.100.2.136

  • NameServer 100.100.2.138

通过配置DNSConfig可解析集群自定义域名。

Service访问

  • 入方向:支持

  • 出方向:不支持

作为Endpoint,可被其他的服务通过Service访问;但是不支持在AI节点上的pod里面通过Service访问其他服务。

HostNetwork

不支持

AI节点不支持主机网络模式。

NodePort

不支持

AI节点无真实端口映射能力。

NetworkPolicy

不支持

依赖CNI插件实现,AI节点不支持。

存储

能力

支持情况(VK Pod)

说明

EmptyDir

不支持

无。

ConfigMap/Secret

部分支持

不支持sa以及token之类的ConfigMap/Secret。

PersistentVolume/PersistentVolumeClaim

  • 用户OSS:支持

  • 云盘挂载:支持

无。

HostPath

不支持

AI节点不支持挂载主机目录。

Pod Disruption Budget

不支持

AI节点Pod不受PDB保护(因节点本身不可被驱逐)。

监控与日志

能力

支持情况(VK Pod)

说明

kubectl logs/exec

支持

无。

Metrics API

部分支持

需保证监控服务能访问Pod网络。

高级运行时特性

能力

支持情况(VK Pod)

说明

Init 容器

支持

无。

存活/就绪探针(Probes)

支持

无。

SecurityContext

不支持

无。

HostPID/HostIPC

不支持

无。

调度与拓扑

能力

支持情况(VK Pod)

说明

节点亲和性(Node Affinity)

部分支持

用户侧只能亲和到AI节点,感知不到实际物理资源。

Pod 亲和性(Pod Affinity)

部分支持

用户侧只能根据AI节点的topology去做亲和与反亲和,感知不到实际物理节点的拓扑。

污点与容忍(Taints/Tolerations)

部分支持

AI节点自带污点(如 virtual-node=true:NoSchedule),其他污点无效。