共用方式為


教學課程:使用 Azure Cosmos DB for NoSQL、受控識別和透過 AKS 的 Bicep 來部署 ASP.NET Web 應用程式

適用於:NoSQL

在本教學課程中,您會在連線至 Azure Cosmos DB for NoSQL 的 Azure Kubernetes Service (AKS) 叢集上部署參考 ASP.NET Web 應用程式。

Azure Cosmos DB 是完全受控的分散式資料庫平台,適用於使用 NoSQL 或關聯式資料庫進行新式應用程式開發。

AKS 是一項受控 Kubernetes 服務,可協助您快速部署及管理叢集。

重要

  • 本文需要最新版本的 Azure CLI。 如需詳細資訊,請參閱 安裝 Azure CLI。 若您使用的是 Azure Cloud Shell,即已安裝最新版本。
  • 本文也需要 Azure CLI 內最新版的 Bicep CLI。 如需詳細資訊,請參閱安裝 Bicep 工具
  • 如果您在本機執行本教學課程中的命令,而非在 Azure Cloud Shell 中執行命令,請確定您使用系統管理員帳戶。

必要條件

編譯 ASP.NET Web 應用程式並建立其容器映像時需要下列工具:

概觀

本教學課程使用 基礎結構即程式碼 (IaC) 方法將資源部署至 Azure。 會使用新的宣告式語言 Bicep,其可提供與 Azure Resource Manager 範本相同的功能。 不過,Bicep 包含更簡潔且更容易使用的語法。

Bicep 模組會在目標訂用帳戶範圍內部署下列 Azure 資源:

本教學課程使用下列適用於 Azure Cosmos DB 安全性的最佳做法:

提示

本教學課程中的步驟使用 Azure Cosmos DB for NoSQL。 不過,您可以將相同的概念套用至 Azure Cosmos DB for MongoDB

下載 Bicep 模組

azure-samples/cosmos-aks-samples GitHub 存放庫的 Bicep 資料夾中下載或複製 Bicep 模組:

git clone https://github.com/Azure-Samples/cosmos-aks-samples.git

cd Bicep/

連接到 Azure 訂用帳戶

使用 az sign in 連線至預設 Azure 訂用帳戶:

az login

或者,如果您有多個訂用帳戶,請使用 az account set 搭配特定訂用帳戶的名稱或識別碼來設定使用中的訂用帳戶:

az account set \
  --subscription <subscription-id>

初始化部署參數

使用下列範例中的 JSON 建立 param.json 檔案。 以您自己的值取代 {resource group name}{Azure Cosmos DB account name}{Azure Container Registry instance name} 預留位置。

重要

您在下列程式碼中使用的所有資源名稱都應該符合 Azure 資源的命名規則和限制。 此外,請確定預留位置值會一致地取代,並符合 param.json 中的值。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "value": "{resource group name}"
    },    
    "cosmosName" :{
      "value": "{Azure Cosmos DB account name}"
    },
    "acrName" :{
      "value": "{Azure Container Registry instance name}"
    }
  }
}

建立 Bicep 部署

使用下列命令設定殼層變數。 以您自己的值取代 {deployment name}{location} 預留位置。

deploymentName='{deployment name}'  # Name of the deployment
location='{location}' # Location for deploying the resources

Bicep 資料夾中,使用 az deployment sub create 將範本部署至目前的訂用帳戶範圍:

az deployment sub create \
  --name $deploymentName \
  --location $location \
  --template-file main.bicep \
  --parameters @param.json

在部署期間,主控台會輸出訊息,指出部署仍在執行中:

 / Running ..

部署最多可能需要 20-30 分鐘。 佈建完成後,主控台會輸出 JSON 且佈建狀態為 Succeeded

      }
    ],
    "provisioningState": "Succeeded",
    "templateHash": "0000000000000000",
    "templateLink": null,
    "timestamp": "2022-01-01T00:00:00.000000+00:00",
    "validatedResources": null
  },
  "tags": null,
  "type": "Microsoft.Resources/deployments"
}

您也可以在資源群組中查看部署狀態:

Azure 入口網站中資源群組的部署狀態螢幕擷取畫面。

注意

建立 AKS 叢集時,系統會自動建立第二個資源群組來儲存 AKS 資源。 如需詳細資訊,請參閱為何會使用 AKS 建立兩個資源群組?

使用下列命令,將 Azure Container Registry 執行個體與 AKS 連結。 以您自己的值取代 {Azure Container Registry instance name}{resource group name} 預留位置。

acrName='{Azure Container Registry instance name}'
rgName='{resource group name}'
aksName=$rgName'aks'

執行 az aks update 以連結現有的 Azure Container Registry 資源與 AKS 叢集:

az aks update \
  --resource-group $rgName \
  --name $aksName \
  --attach-acr $acrName

連線到 AKS 叢集

若要管理 Kubernetes 叢集,請使用 kubectl (Kubernetes 命令列用戶端)。 如果您使用 Azure Cloud Shell,則 kubectl 已安裝。 若要在本機安裝 kubectl,請使用 az aks install-cli

az aks install-cli

若要設定 kubectl 並連線至 Kubernetes 叢集,請使用 az aks get-credentials。 此命令會下載憑證並設定 Kubernetes CLI 以供使用。

az aks get-credentials \
  --resource-group $rgName \
  --name $aksName

將 AKS Pod 連線至 Azure Key Vault

Microsoft Entra Pod 受控識別會使用 AKS 基本類型,以將 Azure 資源的受控識別與具有 Pod 的 Microsoft Entra ID 中的身分識別建立關聯。 您會使用這些身分識別來授與祕密存放區 容器儲存體介面(CSI) 驅動程式的 Azure Key Vault 提供者的存取權。

使用下列命令來尋找租用戶識別碼 (homeTenantId) 的值:

az account show

使用下列 YAML 範本建立 secretproviderclass.yml 檔案。 以您自己的值取代 {Tenant Id}{resource group name} 預留位置。 此外,請確定 {resource group name} 的值符合 param.json 中的值。

# This is a SecretProviderClass example that uses aad-pod-identity to access the key vault
apiVersion: secrets-store.csi.x-k8s.io/v1
kind: SecretProviderClass
metadata:
  name: azure-kvname-podid
spec:
  provider: azure
  parameters:
    usePodIdentity: "true"               
    keyvaultName: "{resource group name}kv"       # Replace resource group name. Bicep generates the key vault name.
    tenantId: "{Tenant Id}"              # The tenant ID of your account. Use the 'homeTenantId' attribute value from  the 'az account show' command output.

將 SecretProviderClass 套用至 AKS 叢集

使用 kubectl apply 以使用 YAML 安裝祕密存放區 CSI 驅動程式:

kubectl apply \
  --filename secretproviderclass.yml

建置 ASP.NET Web 應用程式

azure-samples/cosmos-aks-samples GitHub 存放庫的 [應用程式] 資料夾下載或複製 Web 應用程式的原始程式碼:

git clone https://github.com/Azure-Samples/cosmos-aks-samples.git

cd Application/

在 Visual Studio Code 中開啟 [應用程式] 資料夾。 使用 F5 鍵或 [偵錯:開始偵錯] 命令來執行應用程式。

將 Docker 容器映像推送至 Azure Container Registry

  1. 若要從 Visual Studio Code 的 [總管] 索引標籤建立容器映像,請以滑鼠右鍵按一下 [Dockerfile],然後選取 [建置映像]

    Visual Studio Code 中捷徑功能表的螢幕擷取畫面,其中已選取 [建置映像] 選項。

  2. 在要求名稱和版本以標記映像的提示中,輸入名稱 todo:latest

  3. 使用 [Docker] 窗格,將建置的映像推送至 Azure Container Registry。 您會在 [影像] 節點下找到已建置的影像。 開啟 [待辦事項] 節點,以滑鼠右鍵按一下 [最新],然後選取 [推送]

    Visual Studio Code 中捷徑功能表的螢幕擷取畫面,其中已選取 [推送] 選項。

  4. 在提示中,選取您的 Azure 訂用帳戶、Azure Container Registry 資源和映像標籤。 影像標籤格式應該是 {acrname}.azurecr.io/todo:latest

  5. 等候 Visual Studio Code 將容器映像推送至 Azure Container Registry。

準備部署 YAML

使用下列 YAML 範本來建立 akstododeploy.yml 檔案。 以您自己的值取代 {ACR name}{Image name}{Version}{resource group name} 預留位置。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: todo
  labels:
    aadpodidbinding: "cosmostodo-apppodidentity"
    app: todo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: todo
  template:
    metadata:
      labels:
        app: todo
        aadpodidbinding: "cosmostodo-apppodidentity"
    spec:
      containers:
      - name: mycontainer
        image: "{ACR name}/{Image name}:{Version}"   # Update per your environment; for example, myacrname.azurecr.io/todo:latest. Do not add https:// in ACR Name.
        ports:
        - containerPort: 80
        env:
        - name: KeyVaultName
          value: "{resource group name}kv"       # Replace resource group name. Key Vault name is generated by Bicep.
      nodeSelector:
        kubernetes.io/os: linux
      volumes:
        - name: secrets-store01-inline
          csi:
            driver: secrets-store.csi.k8s.io
            readOnly: true
            volumeAttributes:
              secretProviderClass: "azure-kvname-podid"       
---
    
kind: Service
apiVersion: v1
metadata:
  name: todo
spec:
  selector:
    app: todo
    aadpodidbinding: "cosmostodo-apppodidentity"    
  type: LoadBalancer
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

套用部署 YAML

再次使用 kubectl apply 來部署應用程式 Pod,並透過負載平衡器公開 Pod:

kubectl apply \
  --filename akstododeploy.yml \
  --namespace 'my-app'

測試應用程式

執行應用程式時,Kubernetes 服務會向網際網路公開應用程式的前端。 此程序可能需要幾分鐘才能完成。

使用 kubectl get 來檢視負載平衡器公開的外部 IP:

kubectl get services \
  --namespace "my-app"

若要存取應用程式,請開啟您在瀏覽器中以輸出方式收到的 IP 位址。

清除資源

若要避免 Azure 費用,當您不再需要叢集時,請清除不需要的資源。 分別使用 az group deleteaz deployment sub delete 來刪除資源群組和訂用帳戶部署:

az group delete \
  --resource-group $rgName 
  --yes

az deployment sub delete \
  --name $deploymentName