Руководство по развертыванию веб-приложения 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 в целевой области подписки:

В этом руководстве используются следующие рекомендации по обеспечению безопасности в Azure Cosmos DB:

Совет

Действия, описанные в этом руководстве, используют 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 login для подключения к вашей подписке 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"
}

Вы также можете увидеть состояние развертывания в группе ресурсов:

Снимок экрана: состояние развертывания для группы ресурсов в портал Azure.

Примечание.

При создании кластера AKS автоматически создается вторая группа ресурсов для хранения ресурсов AKS. Дополнительные сведения см. в статье "Почему создаются две группы ресурсов с помощью 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 Key Vault для драйвера 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

  1. Чтобы создать образ контейнера на вкладке "Обозреватель" в Visual Studio Code, щелкните файл Dockerfile правой кнопкой мыши и выберите "Создать образ".

    Снимок экрана: контекстное меню в Visual Studio Code с выбранным параметром

  2. В командной строке, запрашивающей имя и версию для тега изображения, введите имя todo:latest.

  3. Используйте панель Docker для отправки созданного образа в Реестр контейнеров Azure. Вы найдете встроенный образ в узле "Образы ". Откройте узел todo, щелкните правой кнопкой мыши последнюю версию и нажмите кнопку "Отправить".

    Снимок экрана: контекстное меню в Visual Studio Code с выбранным параметром

  4. В запросах выберите подписку Azure, Реестр контейнеров Azure ресурс и теги изображений. Формат тега изображения должен быть {acrname}.azurecr.io/todo:latest.

  5. Дождитесь отправки образа контейнера 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

Следующие шаги