快速入門:使用 Azure CLI 建立以 Linux 為基礎的 GPU Azure Kubernetes Service (AKS) 叢集

Azure Kubernetes Service (AKS) 是一個託管的 Kubernetes 服務,可以用來快速部署和管理叢集。 在這個快速入門中,你將學習如何:

  • 使用 Azure CLI 部署 AKS 叢集。
  • 新增一個基於 Linux 的 GPU 節點池,並啟用管理型 GPU 節點。
  • 確認 AKS 是否安裝並設定了 GPU 軟體堆疊以進行排程。

全受管 GPU 節點屬於預覽功能。 啟用受管 GPU 節點時,AKS 會安裝並管理 NVIDIA GPU 驅動程式、NVIDIA Kubernetes 裝置插件、資料中心 GPU 管理器(DCGM)指標匯出器,以及 GPU 節點池的健康監控元件。 受管理 GPU 節點也整合了 Azure Managed Prometheus 和 Azure 監視器 for Prometheus 管理服務中的即時 GPU 指標。 欲了解更多資訊,請參閱 Azure Kubernetes Service (AKS) 上建立全管理 GPU 節點池(預覽)Azure Kubernetes Service (AKS) 中的 GPU 可觀察性

Note

本文包含部署叢集的步驟,僅用於評估目的。 在部署生產環境就緒叢集前,先熟悉 基準參考架構 ,評估其如何符合您的業務需求。

Important

AKS 預覽功能以自助方式提供,並採選擇加入制。 預覽版本係依「現狀」及「可用情況」提供,且不適用於服務等級協定與有限保固。 客戶支援部門會盡最大努力,部分支援 AKS 預覽。 因此,這些功能不適合實際執行用途。 如需詳細資訊,請參閱下列支援文章:

開始之前

本快速入門假設您已有 Kubernetes 概念的基本知識。 如需詳細資訊,請參閱 Azure Kubernetes Services (AKS) 的 Kubernetes 核心概念

  • 如果您沒有 Azure 帳戶,請在開始之前建立 免費帳戶

安裝 aks-preview CLI 擴充功能

使用 aks-preview 指令安裝 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 的虛擬機大小。 變 LOCATION 數的值為 westus。 你可以使用這些變數值,或是自己建立。 使用echo命令來檢視變數值,例如echo $RANDOM_STRING

建立資源群組

Azure 資源群組是一個用於部署和管理 Azure 資源的邏輯群組。 建立資源群組時,請指定一個位置。 這個位置是資源群組元資料的儲存地點,如果你在建立資源時沒有指定其他區域,你的資源會在 Azure 中執行。

使用 az 群組 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. 使用 az aks get-credentials 指令設定kubectl連接你的 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 Managed Prometheus,首先在你的 AKS 叢集啟用 Azure 監視器 managed service for Prometheus。 接著,建立 ConfigMap,以啟用 Azure 監視器 代理程式中的 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 metrics ,請參閱 Azure Kubernetes Service (AKS) 中的 GPU observability

部署應用程式

部署一個 GPU 工作負載,以確認管理的 GPU 節點池能執行真實應用程式。 此範例運行 Ollama,透過 OpenAI 相容 API 服務一個小型開源大型語言模型(Llama 3.2 1B)。 Ollama 是以 llama.cpp 為基礎建置,而 llama.cpp 支援本快速入門所使用的 Standard_NC4as_T4_v3 節點集區中的 NVIDIA T4 GPU。

以下的顯現會產生一個 Deployment 和一個 ServiceDeployment 請求一個 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

Note

此資訊清單以 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 上。 欄位 PROCESSOR 顯示 100% GPU 模型在 T4 上運行的時間。

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

你也可以在 pod 內部使用 nvidia-smi 指令直接檢視 GPU。

kubectl exec deploy/ollama -- nvidia-smi

測試結束後,請在終端機中選擇 Ctrl+C 停止kubectl port-forward程序。 當你在下一步刪除叢集時,該應用程式會被移除。

刪除叢集

如果你不打算做 AKS 教學,請清理不必要的資源以避免 Azure 帳單費用。 你可以使用 az 群組刪除 指令移除資源群組、容器服務及所有相關資源。

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

你建立了 AKS 叢集,使用系統指派的管理身份,這是這個快速入門中使用的預設身份選項。 平台會管理這個身分識別,您不需要手動移除它。

下一步

在這個快速入門中,你部署了一個 Kubernetes 叢集,然後新增了一個基於 Linux 的管理型 GPU 節點池。 欲了解更多關於受管理 GPU 節點與 GPU 指標的資訊,請參閱以下文章:

若要深入瞭解 AKS 並執行完整的程式代碼到部署範例,請繼續進行 Kubernetes 叢集教學課程。