教學課程:使用 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 應用程式並建立其容器映像時需要下列工具:
- Docker Desktop
- Visual Studio Code
- 適用於 Visual Studio Code 的 C# 延伸模組
- 適用於 Visual Studio Code 的 Docker 延伸模組
- 適用於 Visual Studio Code 的 Azure 帳戶延伸模組
概觀
本教學課程使用 基礎結構即程式碼 (IaC) 方法將資源部署至 Azure。 會使用新的宣告式語言 Bicep,其可提供與 Azure Resource Manager 範本相同的功能。 不過,Bicep 包含更簡潔且更容易使用的語法。
Bicep 模組會在目標訂用帳戶範圍內部署下列 Azure 資源:
- 用於組織資源的資源群組
- 用於驗證的受控識別
- 用於儲存容器映像的容器登錄
- AKS 叢集
- 用於設定 AKS 的虛擬網路
- Azure Cosmos DB for NoSQL 帳戶,以及資料庫、容器和 SQL 角色
- 用於儲存安全金鑰的金鑰保存庫
- (選擇性) Log Analytics 工作區
本教學課程使用下列適用於 Azure Cosmos DB 安全性的最佳做法:
- 使用角色型存取控制 (RBAC) 和受控識別實作存取控制。 這些功能不需要開發人員管理祕密、認證、憑證和金鑰,即可保護服務之間的通訊。
- 設定虛擬網路服務端點,以限制對 AKS 子網域的 Azure Cosmos DB 存取。
- 在
databaseAccount
資源中設定disableLocalAuth = true
,以強制 RBAC 作為唯一的驗證方法。
提示
本教學課程中的步驟使用 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"
}
您也可以在資源群組中查看部署狀態:
注意
建立 AKS 叢集時,系統會自動建立第二個資源群組來儲存 AKS 資源。 如需詳細資訊,請參閱為何會使用 AKS 建立兩個資源群組?。
使用 AKS 連結 Azure Container Registry
使用下列命令,將 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
若要從 Visual Studio Code 的 [總管] 索引標籤建立容器映像,請以滑鼠右鍵按一下 [Dockerfile],然後選取 [建置映像]。
在要求名稱和版本以標記映像的提示中,輸入名稱 todo:latest。
使用 [Docker] 窗格,將建置的映像推送至 Azure Container Registry。 您會在 [影像] 節點下找到已建置的影像。 開啟 [待辦事項] 節點,以滑鼠右鍵按一下 [最新],然後選取 [推送]。
在提示中,選取您的 Azure 訂用帳戶、Azure Container Registry 資源和映像標籤。 影像標籤格式應該是
{acrname}.azurecr.io/todo:latest
。等候 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 delete 和 az deployment sub delete 來刪除資源群組和訂用帳戶部署:
az group delete \
--resource-group $rgName
--yes
az deployment sub delete \
--name $deploymentName