通过ACK集群管理AI节点
您可以使用ACK(Container Service for Kubernetes,简称容器服务 ACK)管理购买的AI节点,包括在ACK集群中查看AI节点信息,使用AI节点的GPU资源部署推理服务等工作负载。本文为您介绍ACK集群与AI节点绑定与解绑的相关操作。
前提条件
AI节点配置:已为集群添加AI节点。开启AI节点功能、添加或删除AI节点,请参见AI节点变更配置。
ACK集群配置:
权限准备:如果您使用RAM用户操作,需要授予RAM用户ACK访问权限(AliyunCSReadOnlyAccess)。
功能开通:该功能处于公测阶段,请提交工单联系技术支持开通此功能。
注意事项
AI节点与原生K8s(Kubernetes)功能及使用基本一致,但部分功能存在一定差异:
费用说明
创建AI节点与ACK集群会收取费用,通过ACK集群绑定AI节点等管理操作不收取额外费用。
绑定ACK集群与AI节点
步骤一:导入ACK集群配置
登录云原生数据仓库AnalyticDB PostgreSQL版控制台,找到目标实例,单击实例ID。
单击左侧菜单栏的AI节点。
单击导入ACK配置。
在弹出框中选择要导入的ACK集群,单击确定。
步骤二:绑定AI节点
AI节点会挂载ACK VPC网段的ENI作为其IP地址,即每个AI节点都会占用一个用户VPC IP地址。
单击编辑AI节点。
在弹出框左侧未绑定区域中,选择已创建的AI节点,并移动到右侧已绑定区域,单击确定。
步骤三:查看绑定关系
您可以通过以下方式查看绑定关系:
通过控制台查看
通过kubectl命令查看
kubectl get node
创建工作负载
可以通过指定nodeSelector或者nodeName的方式,将工作负载(Pod/Deployment/StatefulSet)部署在AI节点上。
以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
查看Pod部署信息。
查看Pod的状态、IP等信息。
kubectl get pod -o wide
该Pod申请了一张gpu卡(nvidia.com/gpu=1),执行以下命令进入该Pod查看详细信息。
kubectl exec -it ray-gpu -- bash nvidia-smi
解绑AI节点
单击编辑AI节点。
在弹出框右侧已绑定区域,选择已绑定的AI节点,并移动到左侧未绑定区域中,单击确定。
删除ACK配置
删除ACK配置前,需要解绑该配置下所有关联的AI节点。
找到待删除ACK配置所在行,单击操作列的删除。
附录
使用说明
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 spec的limit中和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的方式进行挂载,示例如下:
创建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
。
创建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。
创建工作负载,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服务器:
通过配置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 |
| 无。 |
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节点自带污点(如 |