CANN 与 Kubernetes 集成:在云原生环境中部署弹性 AI 推理服务
CANN 与 Kubernetes 集成:在云原生环境中部署弹性 AI 推理服务
随着企业 IT 架构全面拥抱云原生,AI 推理服务也必须“容器化、编排化、弹性化”。传统裸金属部署方式难以满足高可用、自动扩缩容、多租户隔离等现代运维需求。而 Kubernetes(K8s)作为事实上的云原生操作系统,已成为调度 CPU、GPU、NPU 等异构资源的核心平台。
CANN(Compute Architecture for Neural Networks)通过 Device Plugin 机制 和 Operator 扩展,实现了与 Kubernetes 的深度集成。开发者可像使用 GPU 一样,在 Pod 中声明 Ascend NPU 资源,由 K8s 自动调度到具备 AI 加速能力的节点,并享受弹性伸缩、服务发现、滚动升级等云原生能力。
本文将详解如何在 Kubernetes 集群中部署 CANN 推理服务,涵盖设备插件安装、Pod 调度、多模型共存、HPA 弹性扩缩容及监控告警体系构建。
一、为什么需要 Kubernetes?
单机部署 AI 服务面临三大局限:
| 问题 | 云原生解决方案 |
|---|---|
| 资源利用率低 | 多租户共享集群,按需分配 NPU |
| 无高可用 | Pod 崩溃自动重建,跨节点容灾 |
| 扩缩容困难 | HPA 基于 QPS/延迟自动增减实例 |
Kubernetes 将 Ascend 设备抽象为可调度资源,使 AI 服务成为云原生生态的一等公民。
二、架构全景:CANN + Kubernetes 集成方案
整体架构如下:
[Client]
↓ (HTTP/gRPC)
[Kubernetes Service] → [Ingress]
↓ (负载均衡)
[Pod 1: model-a.om on NPU 0]
[Pod 2: model-b.om on NPU 1]
[Pod 3: model-a.om on NPU 2] ← 自动扩缩容
↑
[K8s Scheduler + Ascend Device Plugin]
↑
[Node 1: Ascend 310 x2]
[Node 2: Ascend 910 x4]
关键组件:
- Ascend Device Plugin:向 K8s 注册 NPU 资源;
- Custom Resource (CRD):定义推理服务模板;
- Prometheus Exporter:暴露 NPU 指标;
- HPA (Horizontal Pod Autoscaler):基于指标自动扩缩。
三、第一步:部署 Ascend Device Plugin
Device Plugin 是 K8s 识别 NPU 的桥梁。
1. 安装前提
- Kubernetes ≥ v1.16;
- 节点已安装 CANN 驱动(
ascend-drv); npu-smi info可正常识别设备。
2. 部署 Device Plugin
# ascend-device-plugin.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: ascend-device-plugin
namespace: kube-system
spec:
selector:
matchLabels:
name: ascend-device-plugin
template:
metadata:
labels:
name: ascend-device-plugin
spec:
hostNetwork: true
containers:
- name: ascend-device-plugin
image: ascend/device-plugin:6.3.RC1
securityContext:
privileged: true # 需访问 /dev/ 下设备文件
volumeMounts:
- name: device-lib
mountPath: /usr/local/Ascend/driver
- name: npu-dev
mountPath: /dev/
volumes:
- name: device-lib
hostPath:
path: /usr/local/Ascend/driver
- name: npu-dev
hostPath:
path: /dev/
应用后,K8s 将自动识别 NPU 资源:
$ kubectl get nodes -o json | jq '.items[].status.allocatable'
{
"cpu": "32",
"memory": "128Gi",
"ascend.huawei.com/NPU": "2" # ← 关键!
}
✅ 资源名称默认为
ascend.huawei.com/NPU,可在插件配置中修改。
四、第二步:部署 CANN 推理 Pod
在 Pod Spec 中声明 NPU 资源即可:
# inference-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: yolov5-infer
spec:
containers:
- name: infer-container
image: my-registry/yolov5-cann:latest
resources:
limits:
ascend.huawei.com/NPU: 1 # 请求 1 个 NPU
env:
- name: ASCEND_SLOG_PRINT_TO_STDOUT
value: "1" # 日志输出到 stdout,便于 kubectl logs
restartPolicy: Always
关键点:
- 容器镜像需预装 CANN Runtime;
- 无需挂载设备文件(Device Plugin 已处理);
- 日志建议输出到 stdout,便于
kubectl logs查看。
五、第三步:构建弹性推理服务
1. 使用 Deployment 管理副本
apiVersion: apps/v1
kind: Deployment
metadata:
name: face-recog-deploy
spec:
replicas: 2
selector:
matchLabels:
app: face-recog
template:
metadata:
labels:
app: face-recog
spec:
containers:
- name: face-recog
image: face-recog-cann:v1
resources:
limits:
ascend.huawei.com/NPU: 1
2. 暴露服务
apiVersion: v1
kind: Service
metadata:
name: face-recog-svc
spec:
selector:
app: face-recog
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: ClusterIP
3. 启用 HPA(基于自定义指标)
首先部署 NPU Metrics Exporter(将 npu-smi 指标转为 Prometheus 格式):
# metrics-exporter.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: npu-metrics-exporter
spec:
template:
spec:
containers:
- name: exporter
image: ascend/npu-exporter:latest
ports:
- containerPort: 9100
然后创建 HPA:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: face-recog-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: face-recog-deploy
minReplicas: 1
maxReplicas: 10
metrics:
- type: Pods
pods:
metric:
name: npu_utilization_percentage
target:
type: AverageValue
averageValue: "70" # 当 NPU 利用率 >70% 时扩容
💡 需提前配置 Prometheus Adapter 以支持自定义指标。
六、高级场景:多模型共存与资源隔离
场景:同一集群运行 YOLOv5(CV)和 BERT(NLP)
方案:
- 为不同模型打标签(Label);
- 使用 Node Affinity 或 Taint/Toleration 隔离。
# YOLOv5 Pod
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: npu-type
operator: In
values: ["Ascend310"] # 仅调度到边缘节点
# BERT Pod
spec:
tolerations:
- key: "npu-model"
operator: "Equal"
value: "large"
effect: "NoSchedule"
同时,在节点上设置标签:
kubectl label node edge-node-01 npu-type=Ascend310
kubectl taint node server-node-01 npu-model=large:NoSchedule
七、监控与告警体系
1. 指标采集
- NPU Exporter → Prometheus;
- 应用日志 → Loki/ELK;
- K8s 事件 → EventRouter。
2. 关键告警规则(Prometheus Rule)
- alert: NPUHighTemperature
expr: npu_core_temperature_celsius > 85
for: 2m
labels:
severity: warning
annotations:
summary: "NPU temperature too high on {{ $labels.instance }}"
- alert: NPUNotAllocated
expr: kube_node_status_allocatable{resource="ascend_huawei_com_NPU"} == 0
labels:
severity: critical
annotations:
summary: "No NPU available in cluster"
八、结语:让 AI 推理服务“生于云,长于云”
将 CANN 推理服务纳入 Kubernetes 体系,不仅是技术升级,更是运维范式的跃迁。它使得 AI 服务具备了与 Web 服务同等的弹性、可观测性与可靠性,真正融入现代云原生基础设施。
未来,随着 KubeEdge、OpenYurt 等边缘 K8s 项目的成熟,这套架构将进一步延伸至云边协同场景:中心训练、边缘推理、统一编排。而今天构建的这套集成方案,正是通向分布式智能未来的关键基石。
记住:在云原生时代,不会被调度的 AI,终将被边缘化。
附录:资源清单
| 组件 | 获取方式 |
|---|---|
| Ascend Device Plugin | 华为 CANN 安装包 /tools/k8s/ |
| NPU Metrics Exporter | 开源或自研(调用 npu-smi) |
| CANN 容器镜像 | 基于 ubuntu:20.04 + CANN Runtime 构建 |
本文内容基于通用 Kubernetes 与 CANN 集成实践撰写,适用于所有支持 Device Plugin 的 AI 加速平台。
© 2026 技术博客原创 · 构建弹性、可靠、云原生的 AI 服务
我写了一篇AIGC跟ops-nn的仓库有关,那我在本篇文章内需体现
cann组织链接:https://atomgit.com/cann
ops-nn仓库链接:https://atomgit.com/cann/ops-nn"
更多推荐
所有评论(0)