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

前提条件

操作步骤

  1. 选择以下任一方式获取 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
      
  2. 创建 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
    
  3. 部署 Device Plugin。

    kubectl create -f moffett-device-plugin.yaml
    
  4. 查看 Device Plugin 部署状态。

    kubectl get pod -n kube-system -l name=moffett-device-plugin-ds # STATUS = Running(READY = 1/1)表示 Pod 正常启动
    

运行示例

以下示例基于 Docker 容器运行时。

  1. 创建 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
    
  2. 创建并运行 Pod。

    kubectl create -f mx-qual-list.yml
    
  3. 查看 Pod 状态。

    kubectl get pod qual-list-pod
    
    # STATUS = Completed 表示任务已完成
    NAME            READY   STATUS      RESTARTS   AGE
    qual-list-pod   0/1     Completed   0          11m
    
  4. 查看 Pod 日志中 mx-qual list 命令运行的结果。

    kubectl logs qual-list-pod
    
  5. 删除 Pod。

    kubectl delete pod qual-list-pod
    

卸载 Device Plugin

kubectl delete -f moffett-device-plugin.yaml

更新 SOLA Toolkit 时停用节点上的 Device Plugin

当更新 SOLA Toolkit 时,Device Plugin 服务会影响 SOLA Toolkit 卸载,需通过以下步骤在指定节点停用 Device Plugin:

  1. 查询集群中部署的 Device Plugin 所有 Pod 的详细信息。

    kubectl get pod -l name=moffett-device-plugin-ds -n kube-system -o wide
    
  2. 为集群的指定节点添加污点(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
    
  3. 当 SOLA Toolkit 更新完成后,如需 Kubernetes 重新调度 Device Plugin 的 Pod,移除 Taint。

    kubectl taint nodes <node_name> NeedFix=true:NoSchedule-