你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。

快速入门:使用 Azure CLI 创建基于 GPU Linux 的Azure Kubernetes 服务 (AKS)群集

Azure Kubernetes 服务 (AKS)是一种托管的 Kubernetes 服务,可用于快速部署和管理群集。 在此快速入门中,您将学习如何:

  • 使用 Azure CLI 部署 AKS 群集。
  • 添加启用了托管 GPU 节点的基于 Linux 的 GPU 节点池。
  • 验证 AKS 是否已安装并配置好用于调度的 GPU 软件栈。

完全托管的 GPU 节点是一项预览功能。 启用托管 GPU 节点时,AKS 会安装和管理 NVIDIA GPU 驱动程序、NVIDIA Kubernetes 设备插件、数据中心 GPU 管理器(DCGM)指标导出者和 GPU 节点池的 GPU 运行状况监视组件。 托管 GPU 节点还集成实时 GPU 指标,以便在 Azure 托管 Prometheus 中引入,并为 Prometheus 集成 Azure Monitor 托管服务。 有关详细信息,请参阅在 Azure Kubernetes 服务 (AKS) 中创建完全托管的 GPU 节点池Azure Kubernetes 服务 (AKS)(预览版)和 GPU 可观测性。

注释

本文包含仅部署群集以用于评估目的的步骤。 在部署生产就绪群集之前,请熟悉 基线参考体系结构 ,以考虑它如何符合业务需求。

Important

AKS 预览功能可在自助服务和自愿选择的基础上启用。 预览版按“现状”和“视供应情况”提供,它们不包括在服务级别协议和有限保证范围内。 AKS 预览功能是由客户支持尽最大努力部分覆盖。 因此,这些功能并不适合用于生产。 有关详细信息,请参阅以下支持文章:

在您开始之前

本快速入门假设读者基本了解 Kubernetes 的概念。 有关详细信息,请参阅 Azure Kubernetes 服务 (AKS) 的 Kubernetes 核心概念。

  • 如果没有 Azure 帐户,请在开始前创建一个免费帐户。
  • 需要Azure CLI 2.85.0 或更高版本。 若要查找版本,请运行 az --version。 如果需要安装或升级 Azure CLI,请参阅安装 Azure CLI。
  • 确保用于创建群集的标识具有适当的最低权限。 有关 AKS 的访问和标识的详细信息,请参阅 Azure Kubernetes 服务 (AKS) 的访问和标识选项。
  • 如果有多个Azure订阅,请使用 az account set 命令选择相应的订阅 ID 进行计费。 有关详细信息,请参阅如何管理Azure订阅 - Azure CLI。
  • 视你的 Azure 订阅情况而定,你可能需要为本快速入门中使用的支持 GPU 的 VM 系列申请提高 vCPU 配额。 有关详细信息,请参阅增加 VM 系列 vCPU 配额。
  • 支持 GPU 的虚拟机规格配备专用硬件,价格较高,并受区域可用性限制。 有关详细信息,请参阅 GPU 优化虚拟机大小。

安装 aks-preview CLI 扩展

aks-preview使用 az extension add 命令安装 CLI 扩展。

az extension add --name aks-preview

更新扩展以确保使用 az extension update 命令获得最新版本。

az extension update --name aks-preview

注册预览功能

使用 az feature register 命令在你的订阅中注册 ManagedGPUExperiencePreview 功能标志。

az feature register --namespace Microsoft.ContainerService --name ManagedGPUExperiencePreview

需要几分钟,状态才会显示为已注册。 使用 az feature show 命令验证注册状态。

az feature show --namespace Microsoft.ContainerService --name ManagedGPUExperiencePreview --query properties.state

当状态显示已注册时,请使用 az provider register 命令刷新资源提供程序的Microsoft.ContainerService注册。

az provider register --namespace Microsoft.ContainerService

定义环境变量

定义以下环境变量,以便在本快速入门中使用。

export RANDOM_STRING=$(printf '%05d%05d' "$RANDOM" "$RANDOM")
export RESOURCE_GROUP="myAKSResourceGroup$RANDOM_STRING"
export CLUSTER_NAME="myAKSCluster$RANDOM_STRING"
export GPU_NP="gpunp"
export GPU_VM_SIZE="Standard_NC4as_T4_v3"
export LOCATION="westus"

该 RANDOM_STRING 变量存储随机 10 位字符串。 变量RESOURCE_GROUPCLUSTER_NAME值与RANDOM_STRING值连接以创建唯一名称。 该 GPU_NP 变量存储托管 GPU 节点池的名称。 该 GPU_VM_SIZE 变量存储节点池的已启用 GPU 的 VM 大小。 变量 LOCATION 具有 westus 值。 可以使用这些变量值或创建自己的变量值。 使用echo命令查看变量值,例如echo $RANDOM_STRING。

创建资源组

Azure资源组是用于部署和管理Azure资源的逻辑组。 创建资源组时,请指定位置。 此位置是存储资源组元数据的位置,如果在创建资源期间未指定另一个区域,则资源在Azure中运行的位置。

使用 az group create 命令创建资源组。

az group create --name $RESOURCE_GROUP --location $LOCATION

以下示例显示了结果。

{
  "id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myAKSResourceGroup<randomStringValue>",
  "location": "westus",
  "managedBy": null,
  "name": "myAKSResourceGroup<randomStringValue>",
  "properties": {
    "provisioningState": "Succeeded"
  },
  "tags": null,
  "type": "Microsoft.Resources/resourceGroups"
}

创建 AKS 群集

使用 az aks create 命令创建 AKS 群集。 以下示例创建一个包含一个系统节点的群集,并启用系统分配的托管标识。

az aks create \
  --resource-group $RESOURCE_GROUP \
  --name $CLUSTER_NAME \
  --node-count 1 \
  --generate-ssh-keys

当你创建新群集时,AKS 会自动创建第二个资源组来存储 AKS 资源。 有关详细信息,请参阅为什么使用 AKS 创建两个资源组?

此示例中的群集指定一个节点计数,用于节省时间和资源。 在生产环境中,使用三个或多个节点的节点计数。 如果未指定节点计数,则 az aks create 命令默认为三个节点。

添加托管 GPU 节点池

使用 az aks nodepool add 命令将基于 Linux 的托管 GPU 节点池添加到群集。 该 --enable-managed-gpu=true 参数将 AKS 配置为在节点池上安装和管理 NVIDIA GPU 驱动程序、NVIDIA Kubernetes 设备插件、DCGM 指标导出者和 GPU 运行状况监视组件。

以下示例使用默认 Ubuntu Linux 操作系统添加托管 GPU 节点池。

az aks nodepool add \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $GPU_NP \
  --node-count 1 \
  --node-vm-size $GPU_VM_SIZE \
  --node-taints sku=gpu:NoSchedule \
  --enable-managed-gpu=true

--node-taints sku=gpu:NoSchedule 参数会阻止非 GPU 工作负载调度到 GPU 节点池,除非这些工作负载包含匹配的容忍度。

创建节点池后,请使用 az aks nodepool show 命令确认已启用托管 GPU 配置文件。

az aks nodepool show \
  --resource-group $RESOURCE_GROUP \
  --cluster-name $CLUSTER_NAME \
  --name $GPU_NP \
  --query "{Name:name, Mode:mode, VmSize:vmSize, Taints:nodeTaints, GpuProfile:gpuProfile}"

输出应包含以下值。

{
  "GpuProfile": {
    "driver": "Install",
    "driverType": "",
    "nvidia": {
      "managementMode": "Managed",
      "migStrategy": null
    }
  },
  "Mode": "User",
  "Name": "gpunp",
  "Taints": [
    "sku=gpu:NoSchedule"
  ],
  "VmSize": "Standard_NC4as_T4_v3"
}

连接至群集

若要管理 Kubernetes 群集,请使用 Kubernetes 命令行客户端 kubectl。 如果使用的是 Azure Cloud Shell,则 kubectl 已安装。 若要在本地安装 kubectl,请使用 az aks install-cli 命令。

  1. 配置 kubectl 以使用 az aks get-credentials 命令连接到 Kubernetes 群集。 此命令将下载凭据,并将 Kubernetes CLI 配置为使用这些凭据。

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. 使用 kubectl get 命令验证与群集的连接。 此命令返回群集节点的列表,并显示每个节点的节点池。

    kubectl get nodes -L kubernetes.azure.com/agentpool,kubernetes.azure.com/mode
    
    NAME                                STATUS   ROLES    AGE     VERSION   AGENTPOOL   MODE
    aks-nodepool1-123456789-vmss000000  Ready    <none>   20m     v1.34.4   nodepool1   system
    aks-gpunp-123456789-vmss000000      Ready    <none>   5m36s   v1.34.4   gpunp       user
    
  3. 验证 Kubernetes 是否可以在托管 GPU 节点池上计划 GPU 工作负荷。

    kubectl get nodes -l kubernetes.azure.com/agentpool=$GPU_NP -o=jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.allocatable.nvidia\.com/gpu}{"\n"}{end}'
    

    输出显示托管 GPU 节点池中每个节点的可分配 GPU 计数。

    aks-gpunp-123456789-vmss000000  1
    

启用 GPU 指标收集

托管 GPU 节点池包括 DCGM 指标导出程序。 若要将 GPU 指标引入 Azure 托管 Prometheus,请先在 AKS 群集上为 Prometheus 启用Azure Monitor托管服务。 然后,创建一个 ConfigMap,以便在 Azure Monitor 代理中启用 dcgmexporter 抓取配置。

cat <<EOF | kubectl create -f -
kind: ConfigMap
apiVersion: v1
data:
  schema-version:
    v1
  config-version:
    ver1
  default-scrape-settings-enabled: |-
    dcgmexporter = true
metadata:
  name: ama-metrics-settings-configmap
  namespace: kube-system
EOF

应用此 ConfigMap 后,群集上的所有现有和新 NVIDIA GPU 节点池都会自动报废。 若要查看Azure 托管 Grafana中的 GPU 指标,请参阅 Azure Kubernetes 服务 (AKS) 中的 GPU 可观测性。

部署应用程序

部署 GPU 工作负荷以确认托管 GPU 节点池可以运行实际应用程序。 此示例运行 Ollama,它通过与 OpenAI 兼容的 API 提供小型开源大型语言模型(Llama 3.2 1B)。 Ollama 基于 llama.cpp 构建,而后者支持本快速入门中使用的 Standard_NC4as_T4_v3 节点池中的 NVIDIA T4 GPU。

以下清单会创建一个 Deployment 和一个 Service。 Deployment 请求一个 GPU(nvidia.com/gpu: 1),包含针对 sku=gpu:NoSchedule 污点的容忍,并使用节点选择器来定位托管 GPU 节点池。 容器启动时,它会启动 Ollama 服务器并拉取 llama3.2:1b 模型,以便 Pod 准备好处理请求。

使用以下命令部署应用程序。

cat <<'EOF' | kubectl apply -f -
apiVersion: apps/v1
kind: Deployment
metadata:
  name: ollama
  labels:
    app: ollama
spec:
  replicas: 1
  selector:
    matchLabels:
      app: ollama
  template:
    metadata:
      labels:
        app: ollama
    spec:
      # Schedule onto the managed GPU node pool created in this quickstart.
      nodeSelector:
        kubernetes.azure.com/agentpool: gpunp
      # Tolerate the GPU node pool taint (sku=gpu:NoSchedule).
      tolerations:
        - key: "sku"
          operator: "Equal"
          value: "gpu"
          effect: "NoSchedule"
      containers:
        - name: ollama
          image: ollama/ollama:0.30.10
          ports:
            - name: http
              containerPort: 11434
          env:
            # Listen on all interfaces so the Service and kubelet probes can reach it.
            - name: OLLAMA_HOST
              value: "0.0.0.0:11434"
            # Model to pull and serve on startup. Fits comfortably on a 16-GB T4.
            - name: MODEL
              value: "llama3.2:1b"
          # Start the server, wait until it's ready, and then pull the model so the
          # pod is self-contained (no manual "ollama pull" step required).
          command: ["/bin/sh", "-c"]
          args:
            - |
              ollama serve &
              pid=$!
              echo "Waiting for the Ollama server to be ready..."
              until ollama list >/dev/null 2>&1; do sleep 2; done
              echo "Server ready. Pulling model: $MODEL"
              ollama pull "$MODEL" || echo "WARN: pull failed; run 'kubectl exec deploy/ollama -- ollama pull $MODEL' manually"
              echo "Model $MODEL is ready to serve."
              wait $pid
          resources:
            requests:
              cpu: "1"
              memory: 4Gi
            limits:
              cpu: "4"
              memory: 16Gi
              nvidia.com/gpu: 1
          startupProbe:
            httpGet:
              path: /api/tags
              port: http
            periodSeconds: 5
            failureThreshold: 60
          readinessProbe:
            httpGet:
              path: /api/tags
              port: http
            periodSeconds: 10
          livenessProbe:
            httpGet:
              path: /
              port: http
            periodSeconds: 20
          volumeMounts:
            - name: ollama-data
              mountPath: /root/.ollama
      volumes:
        - name: ollama-data
          emptyDir: {}
---
apiVersion: v1
kind: Service
metadata:
  name: ollama
  labels:
    app: ollama
spec:
  type: ClusterIP
  selector:
    app: ollama
  ports:
    - name: http
      port: 11434
      targetPort: http
EOF

注释

此清单针对 gpunp 节点池。 如果为 GPU_NP 变量使用了其他值,请在 kubernetes.azure.com/agentpool 应用清单之前更新节点选择器值以匹配。

使用 kubectl rollout status 命令确认部署已准备就绪。 初始模型下载可能需要几分钟时间。

kubectl rollout status deployment/ollama --timeout=600s

使用 kubectl get 命令验证 Pod 是否在托管 GPU 节点池上运行。

kubectl get pods -l app=ollama -o wide

输出应显示该 Pod 正在 gpunp 节点池中的某个节点上运行。

NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE                            NOMINATED NODE   READINESS GATES
ollama-5b8f6c9d4f-2xq7p   1/1     Running   0          5m    10.244.1.10   aks-gpunp-12345678-vmss000000   <none>           <none>

测试应用程序

使用 Service 命令将本地端口转发到 。 使此命令保持运行状态,并为剩余步骤打开第二个终端。

kubectl port-forward svc/ollama 11434:11434

在第二个终端中,使用与 OpenAI 兼容的聊天完成终结点向模型发送提示。

curl http://localhost:11434/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "model": "llama3.2:1b",
    "messages": [{"role": "user", "content": "In one sentence, what is Azure Kubernetes Service?"}]
  }'

模型返回一个 JSON 响应,其中包含生成的答案,该响应确认工作负荷正在从托管 GPU 节点池提供推理。

使用 ollama ps 命令确认模型在 GPU 上加载。 当模型在 T4 上运行时,PROCESSOR 列会显示 100% GPU。

kubectl exec deploy/ollama -- ollama ps
NAME          ID              SIZE      PROCESSOR    CONTEXT   UNTIL
llama3.2:1b   baf6a787fdff    1.5 GB    100% GPU     4096      4 minutes from now

还可以使用 nvidia-smi 命令直接从 Pod 内部查看 GPU。

kubectl exec deploy/ollama -- nvidia-smi

完成测试后,通过在终端中选择 Ctrl+C 来停止kubectl port-forward该过程。 在下一步中删除群集时,会删除该应用程序。

删除群集

如果不打算执行 AKS 教程,请清理不必要的资源以避免 Azure 计费费用。 可以使用 az group delete 命令删除资源组、容器服务和所有相关资源。

az group delete --name $RESOURCE_GROUP --no-wait --yes

使用系统分配的托管标识创建了 AKS 群集,这是本快速入门中使用的默认标识选项。 平台将负责管理此标识,因此你无需手动删除它。

后续步骤

在本快速入门中,你部署了 Kubernetes 群集,然后添加了基于 Linux 的托管 GPU 节点池。 有关托管 GPU 节点和 GPU 指标的详细信息,请参阅以下文章:

若要详细了解 AKS 并执行完整的代码到部署示例,请继续学习 Kubernetes 群集教程。