在安装NPU Exporter前,需要提前了解相关约束,具体说明请参见表1。
约束场景 |
约束说明 |
---|---|
NPU驱动 |
NPU Exporter会周期性调用NPU驱动的相关接口以检测NPU状态。如果要升级驱动,请先停止业务任务,再停止NPU Exporter容器服务。 |
K8s版本 |
使用NPU Exporter前需要确保环境的K8s版本,若K8s版本在1.24.x及以上版本,需要用户自行安装cri-dockerd依赖。 |
DCMI动态库 |
DCMI动态库目录权限要求如下: NPU Exporter调用的DCMI动态库其所有父目录,需要满足属主为root,其他属主程序无法运行;同时,这些文件及其目录需满足group和other不具备写权限。 |
DCMI动态库路径深度必须小于20。 |
|
如果通过设置LD_LIBRARY_PATH设置动态库路径,LD_LIBRARY_PATH环境变量总长度不能超过1024。 |
|
Atlas 200I SoC A1 核心板 |
Atlas 200I SoC A1 核心板使用NPU Exporter组件,需要确保Atlas 200I SoC A1 核心板的NPU驱动在23.0.RC2及以上版本。升级NPU驱动可参考《Atlas 200I SoC A1 核心板 25.0.RC1 NPU驱动和固件升级指导书》中“升级驱动”章节进行操作。 |
Atlas 200I SoC A1 核心板节点上使用容器化部署NPU Exporter,需要配置多容器共享模式,具体请参考《Atlas 200I SoC A1 核心板 25.0.RC1 NPU驱动和固件安装指南》中“容器内运行”章节。 |
|
虚拟机场景 |
如果在虚拟机场景下部署NPU Exporter,需要在NPU Exporter的镜像中安装systemd,推荐在Dockerfile中加入RUN apt-get update && apt-get install -y systemd命令进行安装。 |
NPU Exporter支持两种安装方式,用户可根据实际情况选择其中一种进行安装。该组件仅提供HTTP服务,如需使用更为安全的HTTPS服务,请自行修改源码进行适配。
docker images | grep npu-exporter
1 | npu-exporter v7.0.RC1 20185c45f1bc About an hour ago 90.1MB |
ctr -n k8s.io c ls | grep npu-exporter
回显示例如下。
docker.io/library/npu-exporter:v7.0.RC1 application/vnd.docker.distribution.manifest.v2+json sha256:38fd69ee9f5753e73a55a216d039f6ed4ea8a5de15c0e6b3bb503022db470c7b 91.5 MiB linux/arm64
如果使用默认的NPU Exporter启动参数“-containerMode=docker”时,可跳过本步骤。
apiVersion: apps/v1 kind: DaemonSet metadata: name: npu-exporter namespace: npu-exporter spec: selector: matchLabels: app: npu-exporter ... spec: ... args: [ "umask 027;npu-exporter -port=8082 -ip=0.0.0.0 -updateTime=5 -logFile=/var/log/mindx-dl/npu-exporter/npu-exporter.log -logLevel=0 -containerMode=containerd" ] ... volumeMounts: ... - name: docker-shim mountPath: /var/run/dockershim.sock readOnly: true - name: docker # 仅使用containerd时删除 mountPath: /var/run/docker readOnly: true - name: cri-dockerd mountPath: /var/run/cri-dockerd.sock readOnly: true - name: containerd mountPath: /run/containerd readOnly: true - name: isulad mountPath: /run/isulad.sock readOnly: true ... volumes: ... - name: docker-shim hostPath: path: /var/run/dockershim.sock - name: docker # 仅使用containerd时删除 hostPath: path: /var/run/docker - name: cri-dockerd hostPath: path: /var/run/cri-dockerd.sock - name: containerd hostPath: path: /run/containerd - name: isulad hostPath: path: /run/isulad.sock ...
该步骤可有效解决kubelet重启后,造成的NPU-Exporter数据丢失问题。新增挂载目录后,会同时新增很多挂载文件,如docker.sock,有容器逃逸的风险。
...
volumeMounts:
- name: log-npu-exporter
...
- name: sys
mountPath: /sys
readOnly: true
- name: docker-shim # 删除以下加粗字段
mountPath: /var/run/dockershim.sock
readOnly: true
- name: docker
mountPath: /var/run/docker
readOnly: true
- name: cri-dockerd
mountPath: /var/run/cri-dockerd.sock
readOnly: true
- name: sock # 新增以下加粗字段
mountPath: /var/run # 以实际的dockershim.sock文件目录为准
- name: containerd
mountPath: /run/containerd
...
volumes:
- name: log-npu-exporter
...
- name: sys
hostPath:
path: /sys
- name: docker-shim # 删除以下加粗字段
hostPath:
path: /var/run/dockershim.sock
- name: docker
hostPath:
path: /var/run/docker
- name: cri-dockerd
hostPath:
path: /var/run/cri-dockerd.sock
- name: sock # 新增以下加粗字段
hostPath:
path: /var/run # 以实际的dockershim.sock文件目录为准
- name: containerd
hostPath:
path: /run/containerd
...
kubectl apply -f npu-exporter-310P-1usoc-v{version}.yaml
kubectl apply -f npu-exporter-v{version}.yaml
namespace/npu-exporter unchanged networkpolicy.networking.K8s.io/exporter-network-policy unchanged daemonset.apps/npu-exporter created
kubectl get pod -n npu-exporter
回显示例如下,出现Running表示组件启动成功。若状态为CrashLoopBackOff,可能是因为目录权限不正确导致,可以参见NPU Exporter检查动态路径失败,日志出现check uid or mode failed章节进行处理。
1 2 3 | NAME READY STATUS RESTARTS AGE ... npu-exporter-hqpxl 1/1 Running 0 11s |
NPU Exporter组件以容器化方式运行时需使用特权容器、root用户和挂载了docker-shim或Containerd的socket文件,如果容器被人恶意利用,有容器逃逸风险。当安全性要求较高时,请直接在物理机上通过二进制方式运行。
以二进制方式运行NPU Exporter需要将日志目录权限修改为非root,可以执行chown hwMindX:hwMindX /var/log/mindx-dl/npu-exporter命令修改日志权限。
vi /home/ascend-npu-exporter/npu-exporter.service
参考如下内容,写入npu-exporter.service文件中。
[Unit] Description=Ascend npu exporter Documentation=hiascend.com [Service] ExecStart=/bin/bash -c "/usr/local/bin/npu-exporter -ip=127.0.0.1 -port=8082 -logFile=/var/log/mindx-dl/npu-exporter/npu-exporter.log>/dev/null 2>&1 &" Restart=always RestartSec=2 KillMode=process Environment="GOGC=50" Environment="GOMAXPROCS=2" Environment="GODEBUG=madvdontneed=1" Type=forking User=hwMindX Group=hwMindX [Install] WantedBy=multi-user.target
vi /home/ascend-npu-exporter/npu-exporter.timer
[Unit] Description=Timer for NPU Exporter Service [Timer] OnBootSec=60s # 设置NPU Exporter延时启动时间,请根据实际情况调整 Unit=npu-exporter.service [Install] WantedBy=timers.target
... [Service] ExecStart=/bin/bash -c "/usr/local/bin/npu-exporter -ip=127.0.0.1 -port=8082 -logFile=/var/log/mindx-dl/npu-exporter/npu-exporter.log &" Restart=always RestartSec=2 ...
usermod -a -G HwBaseUser hwMindX usermod -a -G HwDmUser hwMindX
cd /home/ascend-npu-exporter cp npu-exporter /usr/local/bin cp npu-exporter.service /etc/systemd/system chattr +i /etc/systemd/system/npu-exporter.service cp npu-exporter.timer /etc/systemd/system chattr +i /etc/systemd/system/npu-exporter.timer chmod 500 /usr/local/bin/npu-exporter chown hwMindX:hwMindX /usr/local/bin/npu-exporter chattr +i /usr/local/bin/npu-exporter systemctl enable npu-exporter.timer systemctl start npu-exporter systemctl start npu-exporter.timer
chattr -i /usr/local/bin/npu-exporter setcap cap_setuid+ep /usr/local/bin/npu-exporter chattr +i /usr/local/bin/npu-exporter systemctl restart npu-exporter
参数 |
类型 |
默认值 |
说明 |
---|---|---|---|
-port |
int |
8082 |
侦听端口,取值范围为1025~40000。 |
-updateTime |
int |
5 |
信息更新周期1~60秒。如果设置的时间过长,一些生存时间小于更新周期的容器可能无法上报。 |
-ip |
string |
无 |
参数无默认值,必须配置。 侦听IP地址,在多网卡主机上不建议配置成0.0.0.0。 |
-version |
bool |
false |
是否查询NPU Exporter版本号。
|
-concurrency |
int |
5 |
HTTP服务的限流大小,默认5个并发,取值范围为1~512。 |
-logLevel |
int |
0 |
日志级别:
|
-maxAge |
int |
7 |
日志备份时间,取值范围为7~700,单位为天。 |
-logFile |
string |
/var/log/mindx-dl/npu-exporter/npu-exporter.log |
日志文件。 说明:
单个日志文件超过20 MB时会触发自动转储功能,文件大小上限不支持修改。转储后文件的命名格式为:npu-exporter-触发转储的时间.log,如:npu-exporter-2023-10-07T03-38-24.402.log。 |
-maxBackups |
int |
30 |
转储后日志文件保留个数上限,取值范围为1~30,单位为个。 |
-containerMode |
string |
docker |
设置容器运行时类型。
|
-containerd |
string |
|
containerd daemon进程endpoint,用于与Containerd通信。
一般情况下使用默认值即可。若用户自行修改了Containerd的sock文件路径则需要进行相应路径的修改。 可通过ps aux | grep containerd命令查询Containerd的sock文件路径是否修改。 |
-endpoint |
string |
|
CRI server的sock地址:
一般情况下使用默认值即可,除非用户自行修改了dockershim或者Containerd的sock文件路径。 |
-limitIPConn |
int |
5 |
每个IP的TCP限制数的取值范围为1~128。 |
-limitTotalConn |
int |
20 |
程序总共的TCP限制数的取值范围为1~512。 |
-limitIPReq |
string |
20/1 |
每个IP的请求限制数,20/1表示1秒限制20个请求,“/”两侧最大只支持三位数。 |
-cacheSize |
int |
102400 |
缓存key的数量限制,取值范围为1~1024000。 |
-h或者-help |
无 |
无 |
显示帮助信息。 |
-platform |
string |
Prometheus |
指定对接平台。
|
-poll_interval |
duration(int) |
1 |
Telegraf数据上报的间隔时间,单位:秒。此参数在对接Telegraf平台时才起作用,即需要指定-platform=Telegraf时才生效,否则该参数不生效。 |
-profilingTime |
int |
200 |
配置采集PCIe带宽时间,单位:毫秒,取值范围为1~2000。 |
-hccsBWProfilingTime |
int |
200 |
HCCS链路带宽采样时长,取值范围1~1000,单位:毫秒。 |