Вручную разверните ваше облачное родное приложение в службе Azure Kubernetes Service
Прежде чем автоматизировать развертывания веб-сайтов, необходимо вручную развернуть существующее приложение eShop в службе Azure Kubernetes (AKS). Вы создаете ресурсы Azure и развертываете приложение в AKS с помощью команд Azure CLI и скриптов bash. Наконец, вы создадите основной объект службы Azure Active Directory (Azure AD), чтобы разрешить GitHub Actions выполнять развертывание в AKS и Azure Container Registry.
Команды создают следующие ресурсы для развертывания обновленной версии приложения eShop.
- Подготовьте реестр контейнеров Azure (ACR) и отправьте образы в реестр.
- Подготовьте кластер AKS и разверните контейнеры в кластере.
- Протестируйте развертывание.
- Создайте служебные принципы, чтобы позволить GitHub Actions развертывать на AKS и в Реестре контейнеров Azure.
Важный
Перед началом работы убедитесь, что вы выполнили необходимые условия .
Открытие среды разработки
Вы можете использовать пространство кода GitHub, в котором размещено упражнение, или выполнить упражнение локально в Visual Studio Code.
Настройка GitHub Codespaces
Создайте форк репозитория https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops в свою учетную запись на GitHub. Затем на вашем новом ответвлении:
- Выберите код .
- Перейдите на вкладку "Пространства кода ".
- Щелкните значок +, чтобы создать пространство кода.
GitHub занимает несколько минут, чтобы создать и настроить пространство кода. По завершении процесса вы увидите файлы кода для упражнения.
Опционально: Настройка Visual Studio Code
Чтобы использовать Visual Studio Code, форкните репозиторий https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops в свою учетную запись на GitHub и клонируйте его локально. Тогда:
- Установите все системные требования для запуска контейнера разработки в Visual Studio Code.
- Убедитесь, что Docker запущен.
- В новом окне Visual Studio Code откройте папку клонированного репозитория.
- Нажмите клавиши CTRL SHIFT++P, чтобы открыть палитру команд.
- Поиск: >Dev контейнеры: перестроение и повторное открытие в контейнере
- Visual Studio Code создает контейнер разработки локально.
Создание контейнеров
В панели терминала выполните команду dotnet CLI:
dotnet publish /p:PublishProfile=DefaultContainer
Создание ресурсов Azure
В области терминала войдите в Azure с помощью этой команды Azure CLI:
az login --use-device-codeПросмотрите выбранную подписку Azure.
az account show -o tableЕсли выбрана неправильная подписка, используйте команду az account set , чтобы выбрать правильную подписку.
Выполните следующую команду Azure CLI, чтобы получить список регионов Azure и имя, связанное с ним:
az account list-locations -o tableНайдите ближайший к вам регион и используйте его на следующем шаге, заменив
[Closest Azure region]Выполните следующие инструкции Bash:
export LOCATION=[Closest Azure region] export RESOURCE_GROUP=rg-eshop export CLUSTER_NAME=aks-eshop export ACR_NAME=acseshop$SRANDOMПредыдущие команды создают переменные среды, которые будут использоваться в следующих командах Azure CLI. Необходимо изменить расположение в регионе Azure, близком к вам, например eastus. Если вам нужно другое имя для группы ресурсов, кластера AKS или ACR, измените эти значения. Чтобы просмотреть новые репозитории на портале Azure, назначьте себя администратором службы автоматизации соответствия приложений в элементе управления доступом (IAM) реестра контейнеров.
Выполните следующие команды Azure CLI:
az group create --name $RESOURCE_GROUP --location $LOCATION az acr create --resource-group $RESOURCE_GROUP --name $ACR_NAME --sku Basic az acr login --name $ACR_NAMEЕсли при запуске
az acr login --name $ACR_Nameвозникает ошибка проверки подлинности, необходимо включить пользователя администратора в созданном реестре контейнеров в Azure в разделе "Параметры — ключи доступа". Azure предложит вам ввести эти учетные данные для продолжения. Возможно, вам также потребуется повторно выполнить проверку подлинности с помощьюaz login --use-device-code.Эти команды создают группу ресурсов для размещения ресурсов Azure, ACR для ваших образов, а затем вход в ACR. Это может занять несколько минут, пока вы не увидите эти выходные данные:
... }, "status": null, "systemData": { "createdAt": "2023-10-19T09:11:51.389157+00:00", "createdBy": "", "createdByType": "User", "lastModifiedAt": "2023-10-19T09:11:51.389157+00:00", "lastModifiedBy": "", "lastModifiedByType": "User" }, "tags": {}, "type": "Microsoft.ContainerRegistry/registries", "zoneRedundancy": "Disabled" } Login SucceededЧтобы пометить изображения и отправить их в созданный ACR, выполните следующие команды:
docker tag store $ACR_NAME.azurecr.io/storeimage:v1 docker tag products $ACR_NAME.azurecr.io/productservice:v1 docker push $ACR_NAME.azurecr.io/storeimage:v1 docker push $ACR_NAME.azurecr.io/productservice:v1Вы можете проверить успешное завершение отправки изображений с помощью следующей команды:
az acr repository list --name $ACR_NAME --output tableСоздайте AKS и подключите его к ACR с помощью следующих команд:
az aks create --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME --node-count 1 --generate-ssh-keys --node-vm-size Standard_B2s --network-plugin azure --attach-acr $ACR_NAME az aks get-credentials --name $CLUSTER_NAME --resource-group $RESOURCE_GROUPКоманды создают кластер AKS одного узла, подключают его к ACR, а затем подключают локальный компьютер к кластеру AKS. Командам может потребоваться несколько минут для выполнения.
Убедитесь, что новые AKS могут извлекать изображения из ACR с помощью следующей команды:
az aks check-acr --acr $ACR_NAME.azurecr.io --name $CLUSTER_NAME --resource-group $RESOURCE_GROUPВы должны увидеть аналогичные выходные данные для следующих сообщений:
[2023-10-19T13:33:09Z] Loading azure.json file from /etc/kubernetes/azure.json [2023-10-19T13:33:09Z] Checking managed identity... [2023-10-19T13:33:09Z] Cluster cloud name: AzurePublicCloud [2023-10-19T13:33:09Z] Kubelet managed identity client ID: 00001111-aaaa-2222-bbbb-3333cccc4444 [2023-10-19T13:33:09Z] Validating managed identity existance: SUCCEEDED [2023-10-19T13:33:09Z] Validating image pull permission: SUCCEEDED [2023-10-19T13:33:09Z] Your cluster can pull images from acseshop1251599299.azurecr.io!Теперь вы можете запускать команды kubectl в новом кластере AKS. Скопируйте полный URL-адрес ACR из выходных данных; например, над URL-адресом указано acseshop1251599299.
Проверьте состояние кластера AKS:
kubectl get nodes -AВы должны увидеть аналогичные выходные данные для следующих сообщений:
NAME STATUS ROLES AGE VERSION aks-nodepool1-37200563-vmss000000 Ready agent 3h44m v1.26.6
Настройка манифеста развертывания Kubernetes
Теперь образы eShop находятся в ACR, вы можете обновить манифест развертывания AKS, чтобы использовать эти новые образы.
В Visual Studio Code или Codespaces на панели обозревателя выберите файл deployment.yml в корне проекта.
Замените строку 17:
- image: [replace with your ACR name].azurecr.io/storeimage:v1Вставьте название ACR, скопированное на предыдущем шаге. Строка должна выглядеть примерно так:
- image: acseshop1251599299.azurecr.io/storeimage:v1Повторите следующие действия для строки 65:
- image: [replace with your ACR name].azurecr.io/productservice:v1Сохраните файл с помощью CTRL+S.
В области терминала разверните входной контроллер NGINX со следующей командой Kubernetes:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.9.3/deploy/static/provider/cloud/deploy.yamlКоманда
kubectlдобавляет службы и компоненты, чтобы разрешить входящий трафик в кластер AKS. Убедитесь, что ingress готов к выполнению с помощью следующей команды Kubernetes:kubectl get services --namespace ingress-nginxВы должны увидеть аналогичные выходные данные для следующих сообщений:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE ingress-nginx-controller LoadBalancer 10.0.135.51 20.26.154.64 80:32115/TCP,443:32254/TCP 58s ingress-nginx-controller-admission ClusterIP 10.0.137.137 <none> 443/TCP 58sРазверните приложение eShop с помощью этой команды:
kubectl apply -f deployment.ymlкоманда
kubectlapply развертывает приложение eShop, веб-приложение Blazor для интерфейса и службу продуктов REST API на серверной стороне, а также правило входа для маршрутизации трафика к правильным службам в вашем кластере AKS. Повторно выполните эту команду, если при развертывании возникает какая-либо ошибка.Вы должны увидеть аналогичные выходные данные для следующих сообщений:
deployment.apps/storeimage created service/eshop-website created deployment.apps/productservice created service/eshop-backend created ingress.networking.k8s.io/eshop-ingress createdУбедитесь, что две микрослужбы развернуты с помощью этой команды:
kubectl get pods -AВы должны увидеть аналогичные выходные данные для следующих сообщений:
NAMESPACE NAME READY STATUS RESTARTS AGE default productservice-7569b8c64-vfbfz 1/1 Running 0 3m56s default storeimage-6c7c999d7c-zsnxd 1/1 Running 0 3m56s ingress-nginx ingress-nginx-admission-create-szb8l 0/1 Completed 0 4m4s ingress-nginx ingress-nginx-admission-patch-czdbv 0/1 Completed 0 4m4s ingress-nginx ingress-nginx-controller-58bf5bf7dc-nwtsr 1/1 Running 0 4m4sПросмотрите развернутый eShop с помощью этой команды:
echo "http://$(kubectl get services --namespace ingress-nginx ingress-nginx-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}')"Команда возвращает внешний IP-адрес для веб-приложения. Удерживайте клавиши CTRL и щелкните ссылку, чтобы открыть приложение на новой вкладке.
Создайте учетную запись службы для развертывания с GitHub
GitHub Actions может публиковать образы контейнеров в реестре контейнеров Azure. Поэтому GitHub runner должен иметь разрешения для подключения к Azure. В следующих шагах создается учетная запись службы Azure AD, которая будет выступать в качестве удостоверения GitHub Actions в Azure.
Чтобы сохранить идентификатор подписки в переменной среды, выполните следующую команду в терминале:
export SUBS=$(az account show --query 'id' --output tsv)Чтобы создать учетную запись службы Azure AD для предоставления доступа из GitHub, выполните следующую команду:
az ad sp create-for-rbac --name "eShop" --role contributor --scopes /subscriptions/$SUBS/resourceGroups/$RESOURCE_GROUP --json-authПоявится вариант следующих выходных данных:
Creating 'Contributor' role assignment under scope '/subscriptions/ffffffff-aaaa-bbbb-6666-777777777777' The output includes credentials that you must protect. Be sure that you do not include these credentials in your code or check the credentials into your source control. For more information, see https://aka.ms/azadsp-cli { "clientId": "00001111-aaaa-2222-bbbb-3333cccc4444", "clientSecret": "abc1A~abc123ABC123abc123ABC123abc123ABC1", "subscriptionId": "00000000-0000-0000-0000-000000000000", "tenantId": "00000000-0000-0000-0000-000000000000", "activeDirectoryEndpointUrl": "https://login.microsoftonline.com", "resourceManagerEndpointUrl": "https://management.azure.com/", "activeDirectoryGraphResourceId": "https://graph.windows.net/", "sqlManagementEndpointUrl": "https://management.core.windows.net:8443/", "galleryEndpointUrl": "https://gallery.azure.com/", "managementEndpointUrl": "https://management.core.windows.net/" }Скопируйте выходные данные и скобки JSON, которые будут использоваться на следующем шаге.
Создание секретов GitHub
В GitHub Actions runner используются учетные данные для взаимодействия с Реестром контейнеров и службой Azure Kubernetes (AKS). Служебный принципал и учетные данные реестра контейнеров являются чувствительной информацией. Лучше всего хранить конфиденциальную информацию в виде зашифрованных секретов в безопасном расположении. GitHub предоставляет встроенное расположение для хранения секретов и других переменных.
Выполните следующие действия, чтобы безопасно хранить конфиденциальную информацию в качестве переменных среды в репозитории. Администраторы репозитория должны управлять секретами, к которым может получить доступ runner GitHub Actions.
В вашем ответвлённом репозитории GitHub перейдите к Settings>Secrets and variables>Actions.
На странице Actions secrets and variables выберите New repository secret.
New secret На странице введите NameAZURE_CREDENTIALS и в разделе Secretвведите выходные данные JSON, скопированные из терминала.
Параметры должны выглядеть следующим образом:
Выберите Add secret.
Этот секрет GitHub будет использоваться в следующем разделе, чтобы создать действие GitHub для создания образа контейнера.