Ручное развертывание облачно-нативного приложения в 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. Затем на вашем новом ответвлении:

  1. Выберите код .
  2. Выберите вкладку Codespaces.
  3. Щелкните значок +, чтобы создать пространство кода.

GitHub занимает несколько минут, чтобы создать и настроить пространство кода. По завершении процесса вы увидите файлы кода для упражнения.

Опционально: Настройка Visual Studio Code

Чтобы использовать Visual Studio Code, создайте форк репозитория https://github.com/MicrosoftDocs/mslearn-dotnet-cloudnative-devops в своей учетной записи GitHub и клонируйте его локально. Тогда:

  1. Установите любые системные требования для запуска Dev Container в Visual Studio Code.
  2. Убедитесь, что Docker запущен.
  3. В новом окне Visual Studio Code откройте папку клонированного репозитория
  4. Нажмите CTRL+SHIFT+P, чтобы открыть палитру команд.
  5. Поиск: >Dev контейнеры: перестроение и повторное открытие в контейнере
  6. Visual Studio Code создает контейнер разработки локально.

Сборка контейнеров

  1. В панели терминала выполните команду dotnet CLI:

    dotnet publish /p:PublishProfile=DefaultContainer 
    

Создание ресурсов Azure

  1. В области терминала войдите в Azure с помощью этой команды Azure CLI:

    az login --use-device-code
    
  2. Просмотрите выбранную подписку Azure.

    az account show -o table
    

    Если выбрана неправильная подписка, используйте команду az account set, чтобы выбрать правильную.

  3. Выполните следующую команду Azure CLI, чтобы получить список регионов Azure и имя, связанное с ним:

    az account list-locations -o table
    

    Найдите ближайший к вам регион и используйте его на следующем шаге, заменив [Closest Azure region]

  4. Выполните следующие инструкции 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) реестра контейнеров.

  5. Выполните следующие команды 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
    
  6. Чтобы пометить изображения и отправить их в созданный 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
    
  7. Создайте 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. Выполнение приведенных выше команд может занять несколько минут.

  8. Убедитесь, что новые 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.

  9. Проверьте состояние кластера AKS:

    kubectl get nodes -A
    

    Вы должны увидеть аналогичные выходные данные для следующих сообщений:

    NAME                                STATUS   ROLES   AGE     VERSION
    aks-nodepool1-37200563-vmss000000   Ready    agent   3h44m   v1.26.6
    

Настройка манифеста развертывания Kubernetes

Теперь образы eShop находятся в ACR, вы можете обновить манифест развертывания AKS, чтобы использовать эти новые образы.

  1. В Visual Studio Code на панели обозревателя выберите файл deployment.yml в корне проекта.

  2. Замените строку 17:

    - image: [replace with your ACR name].azurecr.io/storeimage:v1
    

    Вставьте скопированное имя ACR из предыдущего шага. Строка должна выглядеть примерно так:

    - image: acseshop1251599299.azurecr.io/storeimage:v1
    
  3. Повторите следующие действия для строки 65:

    - image: [replace with your ACR name].azurecr.io/productservice:v1
    

    Сохраните файл с помощью клавиш CTRL +S.

  4. В области терминала разверните входной контроллер 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
    
  5. Разверните приложение 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
    
  6. Проверьте, развернуты ли две микрослужбы с помощью этой команды:

    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
    
  7. Просмотрите развернутый eShop с помощью этой команды:

    echo "http://$(kubectl get services --namespace ingress-nginx ingress-nginx-controller --output jsonpath='{.status.loadBalancer.ingress[0].ip}')"
    

    Приведенная выше команда возвращает внешний IP-адрес для веб-приложения. Удерживайте CTRL и щелкните ссылку, чтобы открыть приложение на новой вкладке.

    Снимок экрана домашней страницы веб-приложения eShop.

Создайте учетную запись службы для развертывания с GitHub

GitHub Actions может публиковать образы контейнеров в реестре контейнеров Azure. Поэтому GitHub runner должен иметь разрешения для подключения к Azure. В следующих шагах создается учетная запись службы Azure AD, которая будет выступать в качестве удостоверения GitHub Actions в Azure.

  1. Чтобы сохранить идентификатор подписки в переменной среды, выполните следующую команду в терминале:

    export SUBS=$(az account show --query 'id' --output tsv)
    
  2. Чтобы создать учетную запись службы 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/"
    }
    
  3. Скопируйте выходные данные и скобки JSON, которые будут использоваться на следующем шаге.

Создание секретов GitHub

В средстве выполнения действий GitHub используются учетные данные для взаимодействия с реестром контейнеров и AKS. Служебный принципал и учетные данные реестра контейнеров являются чувствительной информацией. Лучше всего хранить конфиденциальную информацию в виде зашифрованных секретов в безопасном расположении. GitHub предоставляет встроенное расположение для хранения секретов и других переменных.

Выполните следующие действия, чтобы безопасно хранить конфиденциальную информацию в качестве переменных среды в репозитории. Администраторы репозитория должны управлять секретами, к которым может получить доступ runner GitHub Actions.

  1. В вашем ответвлённом репозитории GitHub перейдите к Settings>Secrets and variables>Actions.

  2. На странице Actions secrets and variables выберите New repository secret.

  3. На странице New secret в разделе Nameвведите AZURE_CREDENTIALSи в разделе Secretвведите выходные данные JSON, скопированные из терминала.

    Параметры должны выглядеть следующим образом:

    Скриншот страницы

  4. Выберите Add secret.

Этот секрет GitHub будет использоваться в следующем разделе, чтобы создать действие GitHub для создания образа контейнера.