Ручное развертывание облачно-нативного приложения в 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. Затем на вашем новом ответвлении:
- Выберите код .
- Выберите вкладку Codespaces.
- Щелкните значок +, чтобы создать пространство кода.
GitHub занимает несколько минут, чтобы создать и настроить пространство кода. По завершении процесса вы увидите файлы кода для упражнения.
Опционально: Настройка Visual Studio Code
Чтобы использовать Visual Studio Code, создайте форк репозитория https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops в своей учетной записи GitHub и клонируйте его локально. Тогда:
- Установите любые системные требования для запуска Dev Container в 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. Необходимо изменить location на регион 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 на панели обозревателя выберите файл 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
команда
kubectl
apply развертывает приложение 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 используются учетные данные для взаимодействия с реестром контейнеров и AKS. Служебный принципал и учетные данные реестра контейнеров являются чувствительной информацией. Лучше всего хранить конфиденциальную информацию в виде зашифрованных секретов в безопасном расположении. GitHub предоставляет встроенное расположение для хранения секретов и других переменных.
Выполните следующие действия, чтобы безопасно хранить конфиденциальную информацию в качестве переменных среды в репозитории. Администраторы репозитория должны управлять секретами, к которым может получить доступ runner GitHub Actions.
В вашем ответвлённом репозитории GitHub перейдите к Settings>Secrets and variables>Actions.
На странице Actions secrets and variables выберите New repository secret.
На странице New secret в разделе Nameвведите AZURE_CREDENTIALSи в разделе Secretвведите выходные данные JSON, скопированные из терминала.
Параметры должны выглядеть следующим образом:
Выберите Add secret.
Этот секрет GitHub будет использоваться в следующем разделе, чтобы создать действие GitHub для создания образа контейнера.