透過使用 Azure CLI 部署 AKS 叢集,開始使用 Azure Container Linux (ACL) for AKS。
在這個快速入門中,你將學習如何:
- 用 ACL 來建立 AKS 叢集。
- 用 Azure CLI 部署叢集。
- 使用一組微服務和 Web 前端來執行範例多容器應用程式,以模擬零售案例。
Note
本文包含僅針對評估目的使用預設設定部署叢集的步驟。 部署生產環境就緒的叢集之前,建議您先熟悉基準 參考架構 ,以考慮其如何符合您的業務需求。
Important
如果你在 AKS 上使用 Azure 容器 Linux (ACL),請務必檢視以下考量與限制:
- ACL 通常從 AKS v1.34 開始提供。
- ACL 需要啟用 Trusted Launch,並搭配安全開機和 vTPM。 無法取得非可信啟動變體。
- 在 Arm64 上,ACL 若要啟用 Trusted Launch 相容性,必須使用 Cobalt 型(v6)SKU。
-
NodeImage並且None是唯一支援的 作業系統升級通道。Unmanaged且SecurityPatch因目錄不可變/usr而與 ACL 不相容。 - 不支援工件串流。
- 不支援 Pod 沙箱。
- 不支援機密虛擬機器 (CVM)。
- 第一代虛擬機不被支援。
先決條件
本快速入門假設您已有 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 的擴充功能。
- 你需要 Azure CLI 2.86.0 或更新版本。 執行
az version以尋找已安裝的版本和相依連結庫。 若要升級至最新版本,請執行az upgrade。
- 如果你使用本地安裝,請使用
請確保您用來建立叢集的身分識別擁有適當的最低權限。 如需 AKS 存取和身分識別的詳細資訊,請參閱 Azure Kubernetes Service (AKS) 的存取與身分識別選項。
如果您有多個 Azure 訂用帳戶,請使用命令
az account set選取適當的訂用帳戶識別碼,以計費資源。 如需詳細資訊,請參閱 如何管理 Azure 訂用帳戶 – Azure CLI。視您的 Azure 訂用帳戶而定,您可能需要要求增加 vCPU 配額。 如需詳細資訊,請參閱 增加虛擬機器系列 vCPU 配額。
註冊所需的資源提供者
你可能需要在Azure訂閱中註冊所需的資源提供者,例如 Microsoft.ContainerService。
檢查註冊狀態
使用命令 az provider show 檢查註冊狀態。
az provider show --namespace Microsoft.ContainerService --query registrationState
註冊資源提供者
如有需要,請使用 Microsoft.ContainerService 指令註冊 az provider register 資源提供者。
az provider register --namespace Microsoft.ContainerService
定義環境變數
定義下列環境變數,以供在本快速入門中使用。 如果你願意,也可以用你自己的自訂名稱替換這些數值。
export RESOURCE_GROUP="myAKSResourceGroup"
export REGION="westus"
export CLUSTER_NAME="myAKSCluster"
建立資源群組
Azure 資源群組是部署及管理 Azure 資源所在的邏輯群組。 建立資源群組時,系統會提示您指定位置。 此位置是資源群組中繼資料的儲存位置,如果未在資源建立期間指定另一個區域,此位置也會是您在 Azure 中執行資源的位置。
使用 az group create 命令建立資源群組。
az group create \
--name $RESOURCE_GROUP \
--location $REGION
輸出範例:
{
"id": "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myAKSResourceGroup",
"location": "westus",
"managedBy": null,
"name": "myAKSResourceGroup",
"properties": {
"provisioningState": "Succeeded"
},
"tags": null,
"type": "Microsoft.Resources/resourceGroups"
}
建立 AKS 叢集
使用 az aks create 命令建立 AKS 叢集。 參數 --os-sku AzureContainerLinux 會設定系統節點池以 ACL 作為節點作業系統。 下列範例會建立具有一個節點的叢集,並啟用系統指派的受控識別:
az aks create \
--resource-group $RESOURCE_GROUP \
--name $CLUSTER_NAME \
--os-sku AzureContainerLinux \
--node-count 1 \
--generate-ssh-keys
Note
建立新叢集時,AKS 會自動建立第二個資源群組來儲存 AKS 資源。 如需詳細資訊,請參閱為何會使用 AKS 建立兩個資源群組?
連線至叢集
若要管理 Kubernetes 叢集,請使用 Kubernetes 命令列用戶端 kubectl。 如果您使用 Azure Cloud Shell,則 kubectl 已安裝。 若要在本機安裝 kubectl,請使用 az aks install-cli 命令。
設定
kubectl使用az aks get-credentials命令連線到 Kubernetes 叢集。 此命令會下載認證,並設定 Kubernetes CLI 來使用這些認證。az aks get-credentials \ --resource-group $RESOURCE_GROUP \ --name $CLUSTER_NAME使用
kubectl get命令確認叢集的連線。 此命令會傳回叢集節點的清單。kubectl get nodes
部署應用程式
要部署應用程式,你使用清單檔案建立執行 AKS Store 應用程式所需的所有物件。 Kube 資訊清單檔會定義叢集所需的狀態,例如要執行哪些容器映像。 清單包含下列 Kubernetes 部署和服務:
- 市集前端:供客戶檢視產品和下單的 Web 應用程式。
- 產品服務:顯示產品資訊。
- 訂單服務:下單。
-
RabbitMQ:訂單佇列的訊息佇列。
Note
不建議在生產環境中執行具狀態的容器,例如 RabbitMQ,而不使用持續儲存。 為了簡單起見,我們在這裡使用它,但建議您使用受控服務,例如 Azure Cosmos DB 或 Azure 服務匯流排。
建立一個名為 aks-store-quickstart.yaml 的檔案,並複製到以下清單中:
apiVersion: apps/v1 kind: StatefulSet metadata: name: rabbitmq spec: serviceName: rabbitmq replicas: 1 selector: matchLabels: app: rabbitmq template: metadata: labels: app: rabbitmq spec: nodeSelector: "kubernetes.io/os": linux containers: - name: rabbitmq image: mcr.microsoft.com/mirror/docker/library/rabbitmq:3.10-management-alpine ports: - containerPort: 5672 name: rabbitmq-amqp - containerPort: 15672 name: rabbitmq-http env: - name: RABBITMQ_DEFAULT_USER value: "username" - name: RABBITMQ_DEFAULT_PASS value: "password" resources: requests: cpu: 10m memory: 128Mi limits: cpu: 250m memory: 256Mi volumeMounts: - name: rabbitmq-enabled-plugins mountPath: /etc/rabbitmq/enabled_plugins subPath: enabled_plugins volumes: - name: rabbitmq-enabled-plugins configMap: name: rabbitmq-enabled-plugins items: - key: rabbitmq_enabled_plugins path: enabled_plugins --- apiVersion: v1 data: rabbitmq_enabled_plugins: | [rabbitmq_management,rabbitmq_prometheus,rabbitmq_amqp1_0]. kind: ConfigMap metadata: name: rabbitmq-enabled-plugins --- apiVersion: v1 kind: Service metadata: name: rabbitmq spec: selector: app: rabbitmq ports: - name: rabbitmq-amqp port: 5672 targetPort: 5672 - name: rabbitmq-http port: 15672 targetPort: 15672 type: ClusterIP --- apiVersion: apps/v1 kind: Deployment metadata: name: order-service spec: replicas: 1 selector: matchLabels: app: order-service template: metadata: labels: app: order-service spec: nodeSelector: "kubernetes.io/os": linux containers: - name: order-service image: ghcr.io/azure-samples/aks-store-demo/order-service:latest ports: - containerPort: 3000 env: - name: ORDER_QUEUE_HOSTNAME value: "rabbitmq" - name: ORDER_QUEUE_PORT value: "5672" - name: ORDER_QUEUE_USERNAME value: "username" - name: ORDER_QUEUE_PASSWORD value: "password" - name: ORDER_QUEUE_NAME value: "orders" - name: FASTIFY_ADDRESS value: "0.0.0.0" resources: requests: cpu: 1m memory: 50Mi limits: cpu: 75m memory: 128Mi startupProbe: httpGet: path: /health port: 3000 failureThreshold: 5 initialDelaySeconds: 20 periodSeconds: 10 readinessProbe: httpGet: path: /health port: 3000 failureThreshold: 3 initialDelaySeconds: 3 periodSeconds: 5 livenessProbe: httpGet: path: /health port: 3000 failureThreshold: 5 initialDelaySeconds: 3 periodSeconds: 3 initContainers: - name: wait-for-rabbitmq image: busybox command: ['sh', '-c', 'until nc -zv rabbitmq 5672; do echo waiting for rabbitmq; sleep 2; done;'] resources: requests: cpu: 1m memory: 50Mi limits: cpu: 75m memory: 128Mi --- apiVersion: v1 kind: Service metadata: name: order-service spec: type: ClusterIP ports: - name: http port: 3000 targetPort: 3000 selector: app: order-service --- apiVersion: apps/v1 kind: Deployment metadata: name: product-service spec: replicas: 1 selector: matchLabels: app: product-service template: metadata: labels: app: product-service spec: nodeSelector: "kubernetes.io/os": linux containers: - name: product-service image: ghcr.io/azure-samples/aks-store-demo/product-service:latest ports: - containerPort: 3002 env: - name: AI_SERVICE_URL value: "http://ai-service:5001/" resources: requests: cpu: 1m memory: 1Mi limits: cpu: 2m memory: 20Mi readinessProbe: httpGet: path: /health port: 3002 failureThreshold: 3 initialDelaySeconds: 3 periodSeconds: 5 livenessProbe: httpGet: path: /health port: 3002 failureThreshold: 5 initialDelaySeconds: 3 periodSeconds: 3 --- apiVersion: v1 kind: Service metadata: name: product-service spec: type: ClusterIP ports: - name: http port: 3002 targetPort: 3002 selector: app: product-service --- apiVersion: apps/v1 kind: Deployment metadata: name: store-front spec: replicas: 1 selector: matchLabels: app: store-front template: metadata: labels: app: store-front spec: nodeSelector: "kubernetes.io/os": linux containers: - name: store-front image: ghcr.io/azure-samples/aks-store-demo/store-front:latest ports: - containerPort: 8080 name: store-front env: - name: VUE_APP_ORDER_SERVICE_URL value: "http://order-service:3000/" - name: VUE_APP_PRODUCT_SERVICE_URL value: "http://product-service:3002/" resources: requests: cpu: 1m memory: 200Mi limits: cpu: 1000m memory: 512Mi startupProbe: httpGet: path: /health port: 8080 failureThreshold: 3 initialDelaySeconds: 5 periodSeconds: 5 readinessProbe: httpGet: path: /health port: 8080 failureThreshold: 3 initialDelaySeconds: 3 periodSeconds: 3 livenessProbe: httpGet: path: /health port: 8080 failureThreshold: 5 initialDelaySeconds: 3 periodSeconds: 3 --- apiVersion: v1 kind: Service metadata: name: store-front spec: ports: - port: 80 targetPort: 8080 selector: app: store-front type: LoadBalancer如需 YAML 資訊清單檔案的詳細資訊,請參閱部署和 YAML 資訊清單。
如果您在本機建立並儲存 YAML 檔案,則可以選取 [ 上傳/下載檔案 ] 按鈕,然後從本機文件系統選取檔案,將指令清單檔案上傳至 Cloud Shell 中的預設目錄。
使用
kubectl apply命令來部署應用程式,並指定 YAML 資訊清單的名稱。kubectl apply -f aks-store-quickstart.yaml下列範例輸出會顯示部署和服務:
deployment.apps/rabbitmq created service/rabbitmq created deployment.apps/order-service created service/order-service created deployment.apps/product-service created service/product-service created deployment.apps/store-front created service/store-front created
測試應用程式
當應用程式執行時,Kubernetes 服務會將應用程式前端公開至網際網路。 此程序可能需要幾分鐘才能完成。
使用
kubectl get pods命令檢視已部署 Pod 的狀態。 請先確認全部 Pod 都是Running後再繼續進行。kubectl get pods檢查
store-front應用程式的公用 IP 位址。 使用kubectl get service命令搭配--watch引數來監視進度。kubectl get service store-front --watch服務的
store-front輸出一開始會顯示為擱置:NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 <pending> 80:30025/TCP 4h4m當 EXTERNAL-IP 位址從暫止變成實際的公用 IP 位址時,請使用
CTRL-C停止kubectl監看處理程序。下列範例輸出顯示指派給服務的有效公用 IP 位址:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE store-front LoadBalancer 10.0.100.10 20.62.159.19 80:30025/TCP 4h5m若要查看 Azure 市集應用程式的實際運作情況,請開啟網頁瀏覽器並瀏覽至服務的外部 IP 位址。
刪除叢集
如果您不打算進行 AKS 教學課程,請清除不必要的資源,以避免 Azure 計費費用。
使用 az group delete 命令移除資源群組、容器服務和所有相關資源。
az group delete --name $RESOURCE_GROUP
在本快速入門中,是以系統指派的受控識別 (預設身分識別選項) 來建立 AKS 叢集。 平台會管理這個身分識別,您不需要手動移除它。
相關內容
在本快速入門中,你已使用 Azure CLI 部署了啟用 ACL for AKS 的 AKS 叢集。 若要深入了解 AKS 的 ACL,請參閱 適用於 Azure Kubernetes Service (AKS) 的 Azure Container Linux (ACL)。