Руководство по развертыванию веб-приложения ASP.NET с помощью Azure Cosmos DB для NoSQL, управляемого удостоверения и AKS с помощью Bicep
ОБЛАСТЬ ПРИМЕНЕНИЯ: NoSQL
В этом руководстве описано, как развернуть эталонное веб-приложение ASP.NET в кластере Служба Azure Kubernetes (AKS), который подключается к Azure Cosmos DB для NoSQL.
Azure Cosmos DB — это полностью управляемая платформа распределенной базы данных для современной разработки приложений с помощью NoSQL или реляционных баз данных.
AKS — это управляемая служба Kubernetes, которая помогает быстро развертывать кластеры и управлять ими.
Внимание
- Для этой статьи требуется последняя версия Azure CLI. Дополнительные сведения см. в статье Установка Azure CLI. Если вы используете Azure Cloud Shell, последняя версия уже установлена.
- В этой статье также требуется последняя версия интерфейса командной строки Bicep в Azure CLI. Дополнительные сведения см. в статье Установка средств Bicep.
- Если вы выполняете команды в этом руководстве локально, а не в Azure Cloud Shell, убедитесь, что вы используете учетную запись администратора.
Необходимые компоненты
Для компиляции веб-приложения ASP.NET и создания образа контейнера требуются следующие средства:
Обзор
В этом руководстве используется подход инфраструктуры в качестве кода (IaC) для развертывания ресурсов в Azure. Вы используете Bicep, который является новым декларативным языком, который предлагает те же возможности, что и шаблоны Azure Resource Manager. Однако Bicep включает синтаксис, который проще использовать.
Модули Bicep развертывают следующие ресурсы Azure в целевой области подписки:
- Группа ресурсов для упорядочивания ресурсов
- Управляемое удостоверение для проверки подлинности
- Реестр контейнеров для хранения образов контейнеров
- Кластер AKS
- Виртуальная сеть для настройки AKS
- Учетная запись Azure Cosmos DB для NoSQL вместе с базой данных, контейнером и ролью SQL
- Хранилище ключей для хранения безопасных ключей
- (Необязательно) Рабочая область Log Analytics
В этом руководстве используются следующие рекомендации по обеспечению безопасности Azure Cosmos DB:
- Реализуйте управление доступом с помощью управления доступом на основе ролей (RBAC) и управляемого удостоверения. Эти функции позволяют разработчикам управлять секретами, учетными данными, сертификатами и ключами для безопасного взаимодействия между службами.
- Ограничить доступ Azure Cosmos DB к подсети AKS, настроив конечную точку службы виртуальной сети.
- Задайте
disableLocalAuth = true
в ресурсеdatabaseAccount
принудительное применение RBAC в качестве единственного метода проверки подлинности.
Совет
Действия, описанные в этом руководстве, используют Azure Cosmos DB для NoSQL. Однако вы можете применить те же понятия к Azure Cosmos DB для MongoDB.
Скачивание модулей Bicep
Скачайте или клонируйте модули Bicep из папки Bicep репозитория azure-samples/cosmos-aks-samples GitHub:
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>
Инициализация параметров развертывания
Создайте файл param.json с помощью 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?".
Связывание Реестр контейнеров Azure с AKS
Используйте следующие команды, чтобы связать экземпляр Реестр контейнеров Azure с 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 с кластером AKS:
az aks update \
--resource-group $rgName \
--name $aksName \
--attach-acr $acrName
Подключение к кластеру AKS
Управлять кластером Kubernetes можно c помощью kubectl, клиента командной строки Kubernetes. Если вы используете Azure Cloud Shell, kubectl
уже установлен. Чтобы установить kubectl
локально, используйте az aks install-cli
:
az aks install-cli
Чтобы настроить kubectl
подключение к кластеру Kubernetes, используйте az aks get-credentials
. Эта команда скачивает учетные данные и настраивает интерфейс командной строки Kubernetes для их использования.
az aks get-credentials \
--resource-group $rgName \
--name $aksName
Подключение модулей pod AKS к Azure Key Vault
Управляемые microsoft Entra pod удостоверения используют примитивы AKS для связывания управляемых удостоверений для ресурсов Azure и удостоверений в идентификаторе Microsoft Entra с модулями pod. Эти удостоверения используются для предоставления доступа к поставщику Хранилища ключей Azure для интерфейса хранилища секретов (CSI).
Используйте следующую команду, чтобы найти значения идентификатора клиента (homeTenantId
):
az account show
Чтобы создать файл secretproviderclass.yml , используйте следующий шаблон YAML. Замените {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, чтобы установить драйвер CSI хранилища секретов с помощью YAML:
kubectl apply \
--filename secretproviderclass.yml
Создание веб-приложения ASP.NET
Скачайте или клонируйте исходный код веб-приложения из папки приложения репозитория azure-samples/cosmos-aks-samples GitHub:
git clone https://github.com/Azure-Samples/cosmos-aks-samples.git
cd Application/
Откройте папку приложения в Visual Studio Code. Запустите приложение с помощью ключа F5 или команды отладки: запуск отладки .
Отправка образа контейнера Docker в Реестр контейнеров Azure
Чтобы создать образ контейнера на вкладке "Обозреватель" в Visual Studio Code, щелкните файл Dockerfile правой кнопкой мыши и выберите "Создать образ".
В командной строке, запрашивающей имя и версию для тега изображения, введите имя todo:latest.
Используйте панель Docker для отправки созданного образа в Реестр контейнеров Azure. Встроенный образ можно найти на узле "Образы ". Откройте узел todo, щелкните правой кнопкой мыши последнюю версию и нажмите кнопку "Отправить".
В запросах выберите подписку Azure, Реестр контейнеров Azure ресурс и теги изображений. Формат тега изображения должен быть
{acrname}.azurecr.io/todo:latest
.Дождитесь отправки образа контейнера Visual Studio Code в Реестр контейнеров Azure.
Подготовка YAML развертывания
Чтобы создать файл akstododeploy.yml , используйте следующий шаблон YAML. Замените {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 , чтобы просмотреть внешний 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