MOFFETT Device Plugin 用户手册
MOFFETT Device Plugin 基于 Kubernetes 设备插件框架实现,用于将墨芯 SPU(Sparse Processing Unit,稀疏处理单元)设备资源注册到 Kubelet。该组件以 DaemonSet 形式部署在 Kubernetes 集群的各个节点上,负责注册墨芯 SPU 设备、跟踪 SPU 设备状态,并运行支持 SPU 设备的容器。
须知
Device Plugin 是 Kubernetes 的设备调度组件,单机或裸金属容器环境不涉及本组件。在 Kubernetes 集群中,推荐通过 SPU Operator 统一部署,详见《MOFFETT SPU Operator 用户手册》;仅在集群不使用 Operator、需手动管理时参照本手册单独部署。两种方式任选其一,以避免冲突。
部署 Device Plugin
前提条件
安装 SOLA Toolkit,详见 《SOLA Toolkit 安装指南》。
部署可用的 Kubernetes 集群 ≥ 1.10,详见 使用部署工具安装 Kubernetes。如需使用 CDI 功能,Kubernetes 集群 ≥ 1.28。
安装 Kubernetes 命令行工具
kubectl,详见 安装工具 - kubectl。安装容器运行时,详见容器运行时。
操作步骤
选择以下任一方式获取 Device Plugin 容器镜像。
在线拉取
docker pull moffett/k8s-device-plugin:v0.3.0
离线导入
wget https://moffett-oss-bucket.tos-cn-shanghai.volces.com/macs/v1.11/device-plugin/moffett-k8s-device-plugin-v0.3.0.tar docker load -i moffett-k8s-device-plugin-v0.3.0.tar
创建
moffett-device-plugin.yaml部署文件。apiVersion: apps/v1 kind: DaemonSet metadata: name: moffett-device-plugin-daemonset namespace: kube-system spec: selector: matchLabels: name: moffett-device-plugin-ds updateStrategy: type: RollingUpdate template: metadata: labels: name: moffett-device-plugin-ds spec: tolerations: - key: moffett.ai/spu operator: Exists effect: NoSchedule priorityClassName: "system-node-critical" containers: - image: moffett/k8s-device-plugin:v0.3.0 name: moffett-device-plugin-ctr securityContext: privileged: true volumeMounts: - name: device-plugin mountPath: /var/lib/kubelet/device-plugins volumes: - name: device-plugin hostPath: path: /var/lib/kubelet/device-plugins
部署 Device Plugin。
kubectl create -f moffett-device-plugin.yaml
查看 Device Plugin 部署状态。
kubectl get pod -n kube-system -l name=moffett-device-plugin-ds # STATUS = Running(READY = 1/1)表示 Pod 正常启动
运行示例
以下示例基于 Docker 容器运行时。
创建 Pod 配置文件
mx-qual-list.yml,定义请求 2 个 SPU 设备并执行mx-qual list命令的 Pod。apiVersion: v1 kind: Pod metadata: name: qual-list-pod spec: restartPolicy: Never containers: - name: sola-container image: moffett/macs-base:sola-3.12.0 # 自定义镜像,包含 SOLA Toolkit 3.12.0 版本 args: ['mx-qual', 'list'] # 容器启动参数,即运行 mx-qual list 命令 resources: requests: moffett.ai/spu: 2 # 申请使用 2 个 device limits: moffett.ai/spu: 2 # 限制最多使用 2 个 device tolerations: - key: moffett.ai/spu operator: Exists effect: NoSchedule
创建并运行 Pod。
kubectl create -f mx-qual-list.yml
查看 Pod 状态。
kubectl get pod qual-list-pod
# STATUS = Completed 表示任务已完成 NAME READY STATUS RESTARTS AGE qual-list-pod 0/1 Completed 0 11m
查看 Pod 日志中
mx-qual list命令运行的结果。kubectl logs qual-list-pod
删除 Pod。
kubectl delete pod qual-list-pod
卸载 Device Plugin
kubectl delete -f moffett-device-plugin.yaml
kubectl delete daemonset moffett-device-plugin-daemonset -n kube-system
更新 SOLA Toolkit 时停用节点上的 Device Plugin
当更新 SOLA Toolkit 时,Device Plugin 服务会影响 SOLA Toolkit 卸载,需通过以下步骤在指定节点停用 Device Plugin:
查询集群中部署的 Device Plugin 所有 Pod 的详细信息。
kubectl get pod -l name=moffett-device-plugin-ds -n kube-system -o wide
为集群的指定节点添加污点(Taint)并删除该节点上 Device Plugin 相关 Pod。
kubectl taint nodes <node_name> NeedFix=true:NoSchedule # 为指定节点添加 Taint,标记为不可调度 kubectl describe node <node_name> | grep Taints # 验证节点 Taint 是否生效 kubectl get pod -n kube-system -o wide # 查看指定节点上的 Pod 信息 kubectl delete pod <pod_name> -n kube-system # 删除指定节点上 Device Plugin 的 Pod
当 SOLA Toolkit 更新完成后,如需 Kubernetes 重新调度 Device Plugin 的 Pod,移除 Taint。
kubectl taint nodes <node_name> NeedFix=true:NoSchedule-