常见问题

问题 1:在安装/卸载 SOLA-toolkit 时,提示 moffett 模块被占用 报错信息如下:

rmmod: ERROR: Module moffett is in use
Error, uninstall moffett driver fail

解决方法

  1. 查看是否有进程占用 moffett 设备。

    $ mx-smi list  
    
  2. 查看打开的文件及进程。

    $ sudo lsof | grep mf- 
    
  3. 结束正在运行的用卡任务/进程。

    $ kill -9 ${PID}
    
  4. 检查 moffett 的系统 module 的个数是否为 0。

    $ lsmod | grep moffett
    moffett               278528  1
    
  5. 移除已加载的 moffett 系统 module。

    $ sudo rmmod moffett
    
  6. 重试尝试卸载 SOLA toolkit 操作,若仍未正常安装/卸载 SOLA,请重启服务器后再次卸载。

问题 2:卸载 SOLA 时,提示程序在使用,不能卸载。报错信息如下:

There is a program in use and can not be uninstalled. Please try again later.

解决方法

  1. 查看是否有进程占用 moffett 设备。

    $ mx-smi list  
    
  2. 请确认结束任何占用 moffett 设备的任务或进程。

  3. 分别排查是否有 dcsm、k8s plugin、dcsm exporter 服务在运行,如果服务在运行,请停止相应服务。

    • moffett device plugin 使用设备场景

    # 查询集群中是否部署 moffett device plugin
    $ kubectl get pods -l name=moffett-device-plugin-ds -n kube-system -o wide
    # 集群中卸载 moffett device plugin,后续可参考 墨芯 Kubernetes 设备插件使用说明 重新部署
    $ kubectl delete daemonset moffett-device-plugin-daemonset -n kube-system
    # 只驱逐特定节点  ${node-name} 上的 moffett device plugin,为该节点添加污点,避免调度器启动新的 daemonset
    $ kubectl taint nodes  ${node-name} NeedFix=true:NoSchedule
    $ kubectl describe node  ${node-name} |grep Taints 
    $ kubectl delete pod -l name=moffett-device-plugin-ds -n kube-system --field-selector spec.nodeName= ${node-name}
    $ kubectl get pod -n kube-system -o wide
    # 移除污点,让 kubernetes 重新调度
    $ kubectl taint nodes  ${node-name} NeedFix=true:NoSchedule-
    
    • dcsm 使用设备场景

    # 查询 mx-hostengine 是否正在运行
    $ ps -ef | grep mx-hostengine
    # 查询是否以 systemd service 的方式启动
    $ systemctl status dcsm
    # 暂停 dcsm 服务
    $ sudo systemctl stop dcsm
    # 若涉及系统重启的操作,避免 dcsm 开机自启,停止并禁止 dcsm 开机自启。 
    # 非 systemd service 启动的 mx-hostengine,可以通过 kill 命令终止进程
    $ sudo systemctl --now disable dcsm
    
    • dcsm exporter 使用设备场景

    解决方案一:通过标记节点为 Taints

    # 检查是否单机容器化启动,以docker为例
    $ docker ps | grep dcsm-exporter
    # 使用 docker stop 命令停掉 dcsm exporter容器
    # 查询集群中是否部署 dcsm exporter
    $ kubectl get pods -l app.kubernetes.io/name=dcsm-exporter -n moffett-monitoring -o wide
    #  集群中卸载 dcsm exporter
    $ kubectl delete daemonset dcsm-exporter -n moffett-monitoring
    # 只驱逐特定节点  ${node-name} 上的 dcsm exporter,为该节点添加污点,避免调度器启动新的 daemonset
    $ kubectl taint nodes  ${node-name} NeedFix=true:NoSchedule
    $ kubectl describe node  ${node-name} |grep Taints
    $ kubectl delete pod -l app.kubernetes.io/name=dcsm-exporter -n moffett-monitoring --field-selector spec.nodeName= ${node-name}
    $ kubectl get pod -n moffett-monitoring -o wide
    # 移除污点,让 kubernetes 重新调度
    $ kubectl taint nodes  ${node-name} NeedFix=true:NoSchedule-
    

    解决方案二:通过节点亲和性

    如果需要仅删除某个节点上的 dcsm-exporter 而不影响集群中其他服务,可通过给节点添加 Taint 的方式。我们也推荐使用通过添加给节点打特殊标签并使用 nodeSelector 方式。

    a. 为节点加标签:给需要移除 dcsm-exporter 的节点打上一个独特的标签。

    # ${node-name} 替换为实际节点名称       
    $ kubectl label node ${node-name} dcsm-exporter-disabled=true    
    

    b. 查看标签。

    # ${node-name} 替换为实际节点名称  
    $ kubectl get nodes --show-labels |grep ${node-name}  
    

    c. 添加配置:在 dcsm-exporter.yaml 文件 spec 中添加如下配置:

    affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: dcsm-exporter-disabled
                operator: NotIn
                values:
                - "true"
    

    d. 应用配置:更新 DCSM Exporter 的 DaemonSet 配置。

    $ kubectl apply -f dcsm-exporter.yaml
    

    e. 验证效果:检查目标节点上的 dcsm-exporter Pod 是否被删除。

    $ kubectl get pods -o wide -n moffett-monitoring
    

    f.恢复节点:恢复该节点运行 dcsm-exporter,删除标签即可。

    $ kubectl label node ${node-name} dcsm-exporter-disabled-