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 AffinityTaint/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"

更多推荐