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"

更多推荐