快速入門:使用 Azure PowerShell 部署 Azure Kubernetes Service (AKS) 叢集
Azure Kubernetes Service (AKS) 是受控 Kubernetes 服務,可讓您快速部署及管理叢集。 在本快速入門中,您將:
- 使用 Azure PowerShell 部署 AKS 叢集。
- 使用一組微服務和 Web 前端模擬零售情節,執行範例多容器應用程式。
注意
若要開始快速佈建 AKS 叢集,本文包含僅針對評估目的部署具有預設設定值之叢集的步驟。 在部署生產就緒叢集之前,建議您先熟悉我們的基準參考架構,考慮其如何符合您的業務需求。
開始之前
本文章假設您對 Kubernetes 概念有基本瞭解。 如需詳細資訊,請參閱 Azure Kubernetes Services (AKS) 的 Kubernetes 核心概念。
-
如果您沒有 Azure 訂用帳戶,請在開始之前先建立 Azure 免費帳戶。
為了方便使用,請在 Azure Cloud Shell 中試用 PowerShell 環境。 如需詳細資訊,請參閱 Azure Cloud Shell 快速入門。
如果您要本機使用 PowerShell locally,請安裝 Az PowerShell 模組,並使用 Connect-AzAccount cmdlet 連線至您的 Azure 帳戶。 確保您使用系統管理權限來執行命令。 如需詳細資訊,請參閱安裝 Azure PowerShell (英文)。
確保您用來建立叢集的身分識別擁有適當的最低權限。 如需 AKS 存取和身分識別的詳細資訊,請參閱 Azure Kubernetes Service (AKS) 的存取與身分識別選項。
如果您有多個 Azure 訂用帳戶,請呼叫 Set-AzContext cmdlet,以設定您想要用於快速入門的訂用帳戶。 如需詳細資訊,請參閱 使用 Azure PowerShell 管理 Azure 訂用帳戶。
建立資源群組
Azure 資源群組是部署及管理 Azure 資源所在的邏輯群組。 建立資源群組時,系統會提示您指定位置。 此位置是資源群組中繼資料的儲存位置,如果未在資源建立期間指定另一個區域,此位置也會是您在 Azure 中執行資源的位置。
下列範例會在 eastus 位置建立名為 myResourceGroup 的資源群組。
使用
New-AzResourceGroup
Cmdlet 建立資源群組。New-AzResourceGroup -Name myResourceGroup -Location eastus
下列範例輸出類似於成功建立資源群組:
ResourceGroupName : myResourceGroup Location : eastus ProvisioningState : Succeeded Tags : ResourceId : /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/myResourceGroup
建立 AKS 叢集
若要建立 AKS 叢集,請使用 New-AzAksCluster
Cmdlet。 下列範例會建立名為 myAKSCluster 且具有一個節點的叢集,並啟用系統指派的受控識別。
New-AzAksCluster -ResourceGroupName myResourceGroup `
-Name myAKSCluster `
-NodeCount 1 `
-EnableManagedIdentity `
-GenerateSshKey
在幾分鐘之後,此命令就會完成,並傳回叢集的相關資訊。
注意
當您建立 AKS 叢集時,會自動建立名為 節點資源群組的第二個資源群組 來儲存 AKS 資源。 如需詳細資訊,請參閱 節點資源群組。 當您 刪除 AKS 叢集的資源群組 時,也會刪除節點資源群組。 您也會看到預設建立的 NetworkWatcherRG 資源群組。 Azure 網路監看員 會使用此資源群組來儲存監視數據。 您可以放心地忽略此資源群組。 如需詳細資訊,請參閱啟用或停用 Azure 網路監看員。
連線至叢集
若要管理 Kubernetes 叢集,請使用 Kubernetes 命令列用戶端 kubectl。 如果您使用 Azure Cloud Shell,則 kubectl
已安裝。 若要在本機安裝 kubectl
,請呼叫 Install-AzAksCliTool
Cmdlet。
使用
Import-AzAksCredential
Cmdlet 設定kubectl
以連線至 Kube 叢集。 此命令會下載憑證並設定 Kubernetes CLI 以供使用。Import-AzAksCredential -ResourceGroupName myResourceGroup -Name myAKSCluster
使用
kubectl get
命令確認叢集的連線。 此命令會傳回叢集節點的清單。kubectl get nodes
下列輸出範例會顯示上一個步驟中建立的單一節點。 確定節點的狀態為就緒。
NAME STATUS ROLES AGE VERSION aks-nodepool1-11853318-vmss000000 Ready agent 2m26s v1.27.7
部署應用程式
若要部署應用程式,您可以使用資訊清單檔來建立執行 AKS 市集應用程式所需的所有物件。 Kubernetes 資訊清單檔會定義叢集所需的狀態,例如要執行哪些容器映像。 資訊清單包含下列 Kubernetes 部署和服務:
- 市集前端:供客戶檢視產品和下單的 Web 應用程式。
- 產品服務:顯示產品資訊。
- 訂單服務:下單。
- Rabbit MQ:訂單佇列的訊息佇列。
注意
除非是針對生產環境的永續性儲存,否則不建議執行具狀態容器,例如 Rabbit MQ。 這裡使用具狀態容器是為了簡單起見,但我們建議使用受管理的服務,例如 Azure CosmosDB 或 Azure 服務匯流排。
建立名為
aks-store-quickstart.yaml
的檔案,然後將下列資訊清單複製進來:apiVersion: apps/v1 kind: Deployment metadata: name: rabbitmq spec: 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 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 resources: requests: cpu: 1m memory: 1Mi limits: cpu: 1m memory: 7Mi --- 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 --- apiVersion: v1 kind: Service metadata: name: store-front spec: ports: - port: 80 targetPort: 8080 selector: app: store-front type: LoadBalancer
如需 YAML 資訊清單檔案的詳細資訊,請參閱部署和 YAML 資訊清單。
如果您在本地建立並儲存 YAML 檔案,則可以選取上傳/下載檔案按鈕,然後從本地文件系統選取檔案,將資訊清單檔上傳至 CloudShell 裡的預設目錄。
使用 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
檢查市集前端應用程式的公用 IP 位址。 使用 kubectl get service 命令搭配
--watch
引數來監視進度。kubectl get service store-front --watch
store-front
服務的 EXTERNAL-IP 輸出一開始會顯示為擱置: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 費用。 藉由呼叫 Remove-AzResourceGroup
Cmdlet 來移除資源群組、容器服務和所有相關資源。
Remove-AzResourceGroup -Name myResourceGroup
注意
已使用系統指派的受控身分識別建立 AKS 叢集 (本快速入門中所使用的預設身分識別選項),而身分識別是由平台管理,而且不需要移除。
下一步
在本快速入門中,您已部署 Kubernetes 叢集,接著將簡單多容器應用程式部署到此叢集。 這個範例應用程式僅供示範之用,並不代表 Kube 應用程式的全部最佳做法。 如需針對生產使用 AKS 建立完整解決方案的指引,請參閱 AKS 解決方案指引。
若要深入了解 AKS,並逐步完成部署範例的完整程式碼,請繼續 Kube 叢集教學課程。