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 帳戶,請在開始之前建立 免費帳戶 。
在 Azure Cloud Shell 中使用 Bash 環境。 欲了解更多資訊,請參見開始使用 Azure Cloud Shell。
若要在本地執行 CLI 參考命令,請安裝 Azure CLI。 如果你是在 Windows 或 macOS 上運行,可以考慮在 Docker 容器中執行 Azure CLI。 如需詳細資訊,請參閱 如何在 Docker 容器中執行 Azure CLI。
如果您使用的是本機安裝,請使用 az login 命令,透過 Azure CLI 來登入。 請遵循您終端機上顯示的步驟,完成驗證程序。 如需其他登入選項,請參閱 使用 Azure CLI 向 Azure 進行驗證。
出現提示時,請在第一次使用時安裝 Azure CLI 延伸模組。 如需擴充功能的詳細資訊,請參閱 使用和管理 Azure CLI 的擴充功能。
執行 az version 以尋找已安裝的版本和相依程式庫。 若要升級至最新版本,請執行 az upgrade。
- 你需要 Azure CLI 2.85.0 或更新版本。 若要尋找版本,請執行
az --version。 如果您需要安裝或升級 Azure CLI,請參閱 Install Azure CLI。 - 確保你用來建立叢集的身份擁有適當的最低權限。 如需 AKS 存取和身分識別的詳細資訊,請參閱 Azure Kubernetes Service (AKS) 的存取與身分識別選項。
- 如果你有多個 Azure 訂閱,請使用 az account set 指令選擇正確的帳單訂閱 ID。 欲了解更多資訊,請參閱如何管理 Azure 訂閱 - Azure CLI。
- 視您的 Azure 訂用帳戶而定,您可能需要為本快速入門中使用的支援 GPU 的虛擬機器系列申請提高 vCPU 配額。 如需詳細資訊,請參閱 增加虛擬機器系列 vCPU 配額。
- 支援 GPU 的虛擬機容量包含專用硬體,受較高價格及區域供應條件限制。 欲了解更多資訊,請參閱 GPU 最佳化虛擬機大小。
安裝 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_GROUP和CLUSTER_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 命令。
使用 az aks get-credentials 指令設定
kubectl連接你的 Kubernetes 叢集。 此命令會下載認證,並設定 Kubernetes CLI 來使用這些認證。az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME用 kubectl get 指令驗證你叢集的連線。 此指令會回傳叢集節點的清單,並顯示每個節點的節點池。
kubectl get nodes -L kubernetes.azure.com/agentpool,kubernetes.azure.com/modeNAME 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確認 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 和一個 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
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 指標的資訊,請參閱以下文章:
- 在 Azure Kubernetes Service (AKS) (preview)上建立一個完全管理的 GPU node pool。
- Azure Kubernetes Service (AKS) 中的 GPU 可觀察性
若要深入瞭解 AKS 並執行完整的程式代碼到部署範例,請繼續進行 Kubernetes 叢集教學課程。