Упражнение. Создание конвейера развертывания

Завершено

После создания чартов Helm у вас есть все средства, необходимые для развертывания приложения в AKS с помощью GitHub Actions. В этом уроке вы завершите конвейер CI/CD, выполнив окончательные действия по развертыванию.

Diagram that shows the procession from triggers, through three build steps, to the deploy step in a pipeline.

Ниже приведены действия по развертыванию.

  • Создайте задание развертывания.
  • Настройка Подключение open ID (OIDC).
  • Разверните приложение с помощью Helm.
  • Запустите развертывание в рабочей среде.

Добавление задания развертывания

  1. В GitHub перейдите к вилке репозитория.

  2. Разверните каталог github/workflows и откройте файл build-staging.yml для редактирования.

  3. Добавьте новое deploy задание в конце файла после build_push_image задания, как показано ниже. Не забудьте соответствовать отступу.

    Задание имеет три ключа: runs-on, needsи permissions.

    • Для runs-onэтого используется ubuntu-20.04 для согласованности с другим заданием.
    • Для needsэтого используйте имя первого задания, build_push_imageпоэтому приложение развертывается только после создания образа.
    • Для permissionsэтого добавьте два аргумента, вызываемого id-token и contents. Задайте значение write и contentsreadзначение id-token , чтобы предоставить GitHub Actions доступ для отправки запросов и чтения содержимого репозитория.
  4. Добавьте - uses: actions/checkout@v2 в качестве первого шага задания.

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

          deploy:
            runs-on: ubuntu-20.04
            needs: build_push_image
            permissions:
              id-token: write
              contents: read
    
            steps:
              - uses: actions/checkout@v2
    

Добавление шага Install Helm

Используйте действие GitHub для скачивания и установки версии v3.3.1Helm.

  1. На правой панели страницы редактирования найдите установщик инструментов helm. Выберите первый результат, опубликованный Azure.

    Screenshot that shows the search results for the Helm installer action.

  2. Щелкните значок копирования, чтобы скопировать YAML использования.

    Screenshot that shows the copy function after selecting the Helm installer action.

  3. Скопируйте и вставьте YAML под ключом uses в build-staging.yml.

  4. Переименуйте шаг с Helm tool installerInstall Helmнуля и закрепите version клавишу v3.3.1.

        steps:
          - uses: actions/checkout@v2
    
          - name: Install Helm
            uses: Azure/setup-helm@v1
            with:
              version: v3.3.1
    

Добавление шага проверки подлинности для входа Azure

Используйте OIDC для проверки подлинности GitHub Actions для доступа к AKS.

  1. На правой панели найдите имя входа Azure и выберите Azure Login , опубликованный Azure.

    Screenshot that shows results for the Azure Login search.

  2. Щелкните значок копирования, чтобы скопировать YAML использования, и вставьте его под Install Helm шагом в build-staging.yml.

  3. Измените имя шага на Azure LoginSign in to Azure with OIDC.

  4. Azure Login требуется три параметра для проверки подлинности: client-id, tenant-idи subscription-id. Заполните эти параметры заполнителями для секретов, заданных позже.

          - name: Sign in to Azure with OIDC
            uses: Azure/login@v1.5.1
            with:
              client-id: ${{ secrets.AZURE_CLIENT_ID }}
              tenant-id: ${{ secrets.AZURE_TENANT_ID }}
              subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
  5. На правой панели найдите контекст набора и выберите azure Kubernetes, заданный контекстом , опубликованным Azure.

    Screenshot that shows the results for a Set Context search.

  6. Щелкните значок копирования, чтобы скопировать YAML использования, и вставьте его под Sign in to Azure with OIDC шагом в build-staging.yml. resource-group Заполните и cluster-name параметры заполнителями секретов, заданных в предыдущем уроке.

          - name: Azure Kubernetes set context
            uses: Azure/aks-set-context@v3
            with:
              resource-group: ${{ secrets.RESOURCE_GROUP }}
              cluster-name: ${{ secrets.CLUSTER_NAME }}
    

    Файл build-staging.yml должен выглядеть следующим образом:

    name: Build and push the latest build to staging
    
        on:
          push:
            branches: [ main ]
    
        jobs:
          build_push_image:
            runs-on: ubuntu-20.04
    
            steps:
              - uses: actions/checkout@v2
    
              - name: Set up Buildx
                uses: docker/setup-buildx-action@v3.0.0
    
              - name: Docker Login
                uses: docker/login-action@v3.0.0
                with:
                  registry: ${{ secrets.ACR_NAME }}
                  username: ${{ secrets.ACR_LOGIN }}
                  password: ${{ secrets.ACR_PASSWORD }}
    
              - name: Build and push staging images
                uses: docker/build-push-action@v5.0.0
                with:
                  context: .
                  push: true
                  tags: ${{secrets.ACR_NAME}}/contoso-website:latest
    
          deploy:
            runs-on: ubuntu-20.04
            needs: build_push_image # Will wait for the execution of the previous job
            permissions:
              id-token: write # This is required for requesting the JWT
              contents: read  # This is required for actions/checkout
    
            steps:
              - uses: actions/checkout@v2
    
              - name: Install Helm
                uses: Azure/setup-helm@v1
                with:
                  version: v3.3.1
    
              - name: Sign in to Azure with OIDC
                uses: Azure/login@v1.5.1
                with:
                  client-id: ${{ secrets.AZURE_CLIENT_ID }}
                  tenant-id: ${{ secrets.AZURE_TENANT_ID }}
                  subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
              - name: Azure Kubernetes set context
                uses: Azure/aks-set-context@v3
                with:
                  resource-group: ${{ secrets.RESOURCE_GROUP }}
                  cluster-name: ${{ secrets.CLUSTER_NAME }}
    

Настройка open ID Подключение (OIDC)

Назначьте значения секретам, создав субъект-службу и сертификаты для входа с помощью OIDC.

Создайте субъект-службу

  1. В Azure Cloud Shell запустите az account showи сохраните id значение из выходных данных.

  2. Создайте субъект-службу, выполнив следующую команду, подставив id значение из предыдущей команды для $SUBSCRIPTION_ID:

    az ad sp create-for-rbac --scopes /subscriptions/$SUBSCRIPTION_ID --role Contributor 
    
  3. Скопируйте выходные данные JSON и сохраните его на следующем шаге.

Задание секретов

На странице репозитория GitHub выберите вкладку Параметры, а затем выберите "Секреты и переменные>" в меню слева. Определите следующие три новых секрета, которые используют выходные данные из предыдущих шагов.

  • AZURE_CLIENT_ID"appId": значение выходных az ad sp create-for-rbac данных
  • AZURE_TENANT_ID"tenant": значение выходных az ad sp create-for-rbac данных
  • AZURE_SUBSCRIPTION_IDid: значение выходных az account show данных

Для каждого секрета:

  1. Нажмите Создать секрет репозитория.
  2. В поле "Имя" введите имя секрета.
  3. В поле "Секрет" введите значение.
  4. Выберите Добавить секрет.

Добавление федеративных учетных данных

Создайте федеративные сертификаты для авторизации GitHub Actions для доступа к приложению.

  1. В портал Azure перейдите к Регистрация приложений.

  2. Найдите и выберите приложение, соответствующее значению displayName , возвращаемого на предыдущем az ad sp create-for-rbac шаге. По умолчанию имя приложения использует метку времени создания субъекта-службы.

  3. Убедитесь, что значения appID (идентификатор клиента), идентификатор объекта (идентификатор объекта приложения) и идентификатор каталога (идентификатор клиента) соответствуют предыдущим выходным данным JSON.

  4. В области навигации слева щелкните Сертификаты и секреты.

  5. На экране "Сертификаты и секреты" выберите вкладку "Федеративные учетные данные".

  6. Выберите "Добавить учетные данные".

  7. Чтобы добавить промежуточные учетные данные, на экране "Добавить учетные данные " выберите или введите следующие сведения:

    • Сценарий федеративных учетных данных: выбор действий GitHub, развертывающих ресурсы Azure.
    • Организация: введите имя пользователя GitHub.
    • Репозиторий: введите mslearn-aks-deployment-pipeline-github-actions.
    • Тип сущности: Select Branch.
    • Имя ветви GitHub: введите main.
    • Имя: введите промежуточный cred.
    • Описание ввода тестирования.
  8. Выберите Добавить.

    Screenshot of the Add credential screen for the GitHub Actions staging credential.

  9. Чтобы добавить рабочие учетные данные, снова нажмите кнопку "Добавить учетные данные" и на экране "Добавить учетные данные", введите все те же значения, что и для предыдущих учетных данных, кроме следующих:

    • Тип сущности: выберите тег.
    • Имя тега GitHub: введите версию 2.0.0, так как на следующем шаге вы развернете версию 2.
    • Имя: введите prod-cred.
  10. Выберите Добавить.

Развертывание приложения с помощью Helm

Теперь, когда вы настроили Helm и предоставили доступ к кластеру, вы готовы к развертыванию приложения.

Добавление шага развертывания Run Helm

  1. Вернитесь в файл build-staging.yml в GitHub после последнего шага задания deploy , создайте новый шаг с именем Run Helm Deploy. Под ним добавьте еще один ключ run.

              - name: Run Helm Deploy
                run:
    
  2. Ключ можно использовать run для выполнения любой команды оболочки внутри контейнера. Этот конвейер использует ключ для выполнения следующей run команды Helm:

    helm upgrade --install --create-namespace --atomic --wait 
        --namespace staging contoso-website \
        ./kubernetes/contoso-website \
        --set image.repository=${{ secrets.ACR_NAME }} \
        --set dns.name=${{ secrets.DNS_NAME }}
    

    Общие сведения о том, что делает каждый параметр:

    Параметр Действие или значение
    helm upgrade Обновляет установленный выпуск.
    --install Если выпуск не существует, установите его.
    --create-namespace Если пространство имен в флаге --namespace не существует, создайте его.
    --atomic Если выпуск завершается сбоем, удаляет все установленные рабочие нагрузки.
    --wait Ожидает завершения выпуска и возвращает OK состояние.
    --namespace staging contoso-website Развертывает выпуск в contoso-websitestaging пространстве имен.
    ./kubernetes/contoso-website Расположение каталога чарта.
    --set image.repository Обновления значение image.repository только в файле values.yaml для этого выпуска.
    --set dns.name dns.name Обновления ключ только в файле values.yaml для этого выпуска.
  3. Добавьте команду в файл и задайте ее для выполнения, начиная с символа | . Шаг должен соответствовать этому примеру Run Helm deploy :

      ...
          - name: Run Helm Deploy
            run: |
              helm upgrade \
                --install \
                --create-namespace \
                --atomic \
                --wait \
                --namespace staging \
                contoso-website \
                ./kubernetes/contoso-website \
                --set image.repository=${{ secrets.ACR_NAME }} \
                --set dns.name=${{ secrets.DNS_NAME }}
    

    Готовый build-staging.yml файл должен выглядеть следующим образом:

    name: Build and push the latest build to staging
    
        on:
          push:
            branches: [ main ]
    
        jobs:
          build_push_image:
            runs-on: ubuntu-20.04
    
            steps:
              - uses: actions/checkout@v2
    
              - name: Set up Buildx
                uses: docker/setup-buildx-action@v3.0.0
    
              - name: Docker Login
                uses: docker/login-action@v3.0.0
                with:
                  registry: ${{ secrets.ACR_NAME }}
                  username: ${{ secrets.ACR_LOGIN }}
                  password: ${{ secrets.ACR_PASSWORD }}
    
              - name: Build and push staging images
                uses: docker/build-push-action@v5.0.0
                with:
                  context: .
                  push: true
                  tags: ${{secrets.ACR_NAME}}/contoso-website:latest
    
          deploy:
            runs-on: ubuntu-20.04
            needs: build_push_image # Waits for the execution of the previous job
            permissions:
              id-token: write # Required for requesting the JWT
              contents: read  # Required for actions/checkout
    
            steps:
              - uses: actions/checkout@v2
    
              - name: Install Helm
                uses: Azure/setup-helm@v1
                with:
                  version: v3.3.1
    
              - name: Sign in to Azure with OIDC
                uses: Azure/login@v1.5.1
                with:
                  client-id: ${{ secrets.AZURE_CLIENT_ID }}
                  tenant-id: ${{ secrets.AZURE_TENANT_ID }}
                  subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
              - name: Azure Kubernetes set context
                uses: Azure/aks-set-context@v3
                with:
                  resource-group: ${{ secrets.RESOURCE_GROUP }}
                  cluster-name: ${{ secrets.CLUSTER_NAME }}
    
              - name: Run Helm Deploy
                run: |
                  helm upgrade \
                    --install \
                    --create-namespace \
                    --atomic \
                    --wait \
                    --namespace staging \
                    contoso-website \
                    ./kubernetes/contoso-website \
                    --set image.repository=${{ secrets.ACR_NAME }} \
                    --set dns.name=${{ secrets.DNS_NAME }}
    

Установка секрета DNS_NAME

  1. На новой вкладке браузера перейдите в вилку репозитория, выберите вкладку Параметры, а затем выберите "Секреты и переменные>" в меню слева.

  2. Нажмите Создать секрет репозитория.

  3. Для параметра Имя введите DNS_NAME.

  4. В поле "Секрет" введите значение имени зоны DNS AKS из выходных данных исходного скрипта установки.

    Если у вас нет этого значения, выполните следующую команду в Cloud Shell, подставив значения для <resource-group-name> и <aks-cluster-name>:

    az aks show -g <resource-group-name> -n <aks-cluster-name> -o tsv --query addonProfiles.httpApplicationRouting.config.HTTPApplicationRoutingZoneName
    
  5. Выберите Добавить секрет.

Фиксация изменений и проверка промежуточного развертывания

  1. Чтобы зафиксировать изменения, нажмите кнопку "Зафиксировать изменения". Введите описание фиксации и нажмите кнопку "Зафиксировать изменения".

  2. Перейдите на вкладку "Действия", чтобы увидеть выполнение сборки.

  3. После успешной сборки в браузере перейдите, чтобы contoso-staging.<aks-dns-zone-name> убедиться, что веб-сайт появится.

Запуск развертывания в рабочей среде

Следующим шагом является создание рабочего процесса.

  1. В каталоге .github/workflows в репозитории откройте файл build-production.yml для редактирования.

  2. deploy Скопируйте задание из промежуточного конвейера и вставьте его под последней строкой в файле build-production.yml.

  3. Измените Run Helm Deploy шаг для развертывания в рабочем пространстве имен, изменив --namespace флаг на stagingproduction.

  4. В конце команды Helm добавьте новый параметр --set image.tag=${GITHUB_REF##*/}.

    Здесь вы используете функцию Bash, называемую расширением параметров. ${ENV##<wildcard><character>} Расширение возвращает последнее вхождение строки послеcharacter.

    В этом случае необходимо получить только имя тега, которое представлено в качестве среды выполнения GitHub Actions. GITHUB_REF Ветви , refs/heads/<branch>а теги refs/tags/<tag>.

    Необходимо удалить refs/tags/ только имя тега, поэтому вы передаете ${GITHUB_REF##*/} все данные после последнего / в переменной GITHUB_REF среды.

    Окончательный build-production.yml файл должен выглядеть следующим образом:

    name: Build and push the tagged build to production
    
    permissions:
      id-token: write # This is required for requesting the JWT
      contents: read  # This is required for actions/checkout
    
    on:
      push:
        tags:
          - 'v*'
    
    jobs:
      build_push_image:
        runs-on: ubuntu-20.04
    
        steps:
          - uses: actions/checkout@v2
    
          - name: Fetch latest version
            id: fetch_version
            run: echo ::set-output name=TAG::${GITHUB_REF#refs/tags/}
    
          - name: Set up Buildx
            uses: docker/setup-buildx-action@v3.0.0
    
          - name: Docker Login
            uses: docker/login-action@v3.0.0
            with:
              registry: ${{ secrets.ACR_NAME }}
              username: ${{ secrets.ACR_LOGIN }}
              password: ${{ secrets.ACR_PASSWORD }}
    
          - name: Build and push production images
            uses: docker/build-push-action@v2
            with:
              context: .
              push: true
              tags: ${{secrets.ACR_NAME}}/contoso-website:latest,${{secrets.ACR_NAME}}/contoso-website:${{ steps.fetch_version.outputs.TAG }}
    
      deploy:
        runs-on: ubuntu-20.04
        needs: build_push_image
    
        steps:
          - uses: actions/checkout@v2
    
          - name: Install Helm
            uses: Azure/setup-helm@v1
            with:
              version: v3.3.1
    
          - name: Login to Azure with OIDC
            uses: azure/login@v1
            with:
              client-id: ${{ secrets.AZURE_CLIENT_ID }}
              tenant-id: ${{ secrets.AZURE_TENANT_ID }}
              subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
    
          - name: Azure Kubernetes set context
            uses: Azure/aks-set-context@v3
            with:
              resource-group: ${{ secrets.RESOURCE_GROUP }}
              cluster-name: ${{ secrets.CLUSTER_NAME }}
    
          - name: Run Helm Deploy
            run: |
              helm upgrade \
                --install \
                --create-namespace \
                --atomic \
                --wait \
                --namespace production \
                contoso-website \
                ./kubernetes/contoso-website \
                --set image.repository=${{ secrets.ACR_NAME }} \
                --set dns.name=${{ secrets.DNS_NAME }} \
                --set image.tag=${GITHUB_REF##*/}
    
  5. Чтобы зафиксировать изменения, нажмите кнопку "Зафиксировать изменения". Введите описание фиксации и нажмите кнопку "Зафиксировать изменения".

Изменения в рабочей среде

При каждом запуске рабочего процесса необходимо обновить федеративный сертификат с соответствующей версией тега следующим образом:

  1. В портал Azure перейдите на страницу приложения и выберите сертификаты и секреты в области навигации слева.

  2. Перейдите на вкладку федеративных учетных данных.

  3. Выберите учетные данные prod-cred .

  4. На экране "Изменить учетные данные" рядом с выбранным вариантом увеличьте номер тега до нового v.x.x.x.x,например v.2.0.1.

  5. Выберите Обновить.

  6. В Cloud Shell выполните команду git pull , чтобы получить последние изменения. Затем выполните следующую команду, чтобы пометить и отправить изменения, заменив новый тег версии заполнителем:

    git tag -a v<new version tag> -m 'Create new production deployment' && git push --tags
    
  7. При появлении запроса укажите PAT из предыдущих упражнений в качестве пароля.

  8. На сайте GitHub откройте вкладку "Действия" и просмотрите выполняемый процесс.

  9. После успешного выполнения рабочего процесса перейдите в браузер и contoso-production.<aks-dns-zone-name> убедитесь, что веб-сайт появится.

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