Упражнение. Создание конвейера развертывания
После создания чартов Helm у вас есть все средства, необходимые для развертывания приложения в AKS с помощью GitHub Actions. В этом уроке вы завершите конвейер CI/CD, выполнив окончательные действия по развертыванию.
Ниже приведены действия по развертыванию.
- Создайте задание развертывания.
- Настройка Подключение open ID (OIDC).
- Разверните приложение с помощью Helm.
- Запустите развертывание в рабочей среде.
Добавление задания развертывания
В GitHub перейдите к вилке репозитория.
Разверните каталог github/workflows и откройте файл build-staging.yml для редактирования.
Добавьте новое
deploy
задание в конце файла послеbuild_push_image
задания, как показано ниже. Не забудьте соответствовать отступу.Задание имеет три ключа:
runs-on
,needs
иpermissions
.- Для
runs-on
этого используетсяubuntu-20.04
для согласованности с другим заданием. - Для
needs
этого используйте имя первого задания,build_push_image
поэтому приложение развертывается только после создания образа. - Для
permissions
этого добавьте два аргумента, вызываемогоid-token
иcontents
. Задайте значениеwrite
иcontents
read
значениеid-token
, чтобы предоставить GitHub Actions доступ для отправки запросов и чтения содержимого репозитория.
- Для
Добавьте
- 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.1
Helm.
На правой панели страницы редактирования найдите установщик инструментов helm. Выберите первый результат, опубликованный Azure.
Щелкните значок копирования, чтобы скопировать YAML использования.
Скопируйте и вставьте YAML под ключом
uses
в build-staging.yml.Переименуйте шаг с
Helm tool installer
Install 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.
На правой панели найдите имя входа Azure и выберите Azure Login , опубликованный Azure.
Щелкните значок копирования, чтобы скопировать YAML использования, и вставьте его под
Install Helm
шагом в build-staging.yml.Измените имя шага на
Azure Login
Sign in to Azure with OIDC
.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 }}
На правой панели найдите контекст набора и выберите azure Kubernetes, заданный контекстом , опубликованным Azure.
Щелкните значок копирования, чтобы скопировать 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.
Создайте субъект-службу
В Azure Cloud Shell запустите
az account show
и сохранитеid
значение из выходных данных.Создайте субъект-службу, выполнив следующую команду, подставив
id
значение из предыдущей команды для$SUBSCRIPTION_ID
:az ad sp create-for-rbac --scopes /subscriptions/$SUBSCRIPTION_ID --role Contributor
Скопируйте выходные данные JSON и сохраните его на следующем шаге.
Задание секретов
На странице репозитория GitHub выберите вкладку Параметры, а затем выберите "Секреты и переменные>" в меню слева. Определите следующие три новых секрета, которые используют выходные данные из предыдущих шагов.
AZURE_CLIENT_ID
"appId"
: значение выходныхaz ad sp create-for-rbac
данныхAZURE_TENANT_ID
"tenant"
: значение выходныхaz ad sp create-for-rbac
данныхAZURE_SUBSCRIPTION_ID
id
: значение выходныхaz account show
данных
Для каждого секрета:
- Нажмите Создать секрет репозитория.
- В поле "Имя" введите имя секрета.
- В поле "Секрет" введите значение.
- Выберите Добавить секрет.
Добавление федеративных учетных данных
Создайте федеративные сертификаты для авторизации GitHub Actions для доступа к приложению.
В портал Azure перейдите к Регистрация приложений.
Найдите и выберите приложение, соответствующее значению
displayName
, возвращаемого на предыдущемaz ad sp create-for-rbac
шаге. По умолчанию имя приложения использует метку времени создания субъекта-службы.Убедитесь, что значения appID (идентификатор клиента), идентификатор объекта (идентификатор объекта приложения) и идентификатор каталога (идентификатор клиента) соответствуют предыдущим выходным данным JSON.
В области навигации слева щелкните Сертификаты и секреты.
На экране "Сертификаты и секреты" выберите вкладку "Федеративные учетные данные".
Выберите "Добавить учетные данные".
Чтобы добавить промежуточные учетные данные, на экране "Добавить учетные данные " выберите или введите следующие сведения:
- Сценарий федеративных учетных данных: выбор действий GitHub, развертывающих ресурсы Azure.
- Организация: введите имя пользователя GitHub.
- Репозиторий: введите mslearn-aks-deployment-pipeline-github-actions.
- Тип сущности: Select Branch.
- Имя ветви GitHub: введите main.
- Имя: введите промежуточный cred.
- Описание ввода тестирования.
Выберите Добавить.
Чтобы добавить рабочие учетные данные, снова нажмите кнопку "Добавить учетные данные" и на экране "Добавить учетные данные", введите все те же значения, что и для предыдущих учетных данных, кроме следующих:
- Тип сущности: выберите тег.
- Имя тега GitHub: введите версию 2.0.0, так как на следующем шаге вы развернете версию 2.
- Имя: введите prod-cred.
Выберите Добавить.
Развертывание приложения с помощью Helm
Теперь, когда вы настроили Helm и предоставили доступ к кластеру, вы готовы к развертыванию приложения.
Добавление шага развертывания Run Helm
Вернитесь в файл build-staging.yml в GitHub после последнего шага задания
deploy
, создайте новый шаг с именемRun Helm Deploy
. Под ним добавьте еще один ключrun
.- name: Run Helm Deploy run:
Ключ можно использовать
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-website
staging
пространстве имен../kubernetes/contoso-website
Расположение каталога чарта. --set image.repository
Обновления значение image.repository
только в файле values.yaml для этого выпуска.--set dns.name
dns.name
Обновления ключ только в файле values.yaml для этого выпуска.Добавьте команду в файл и задайте ее для выполнения, начиная с символа
|
. Шаг должен соответствовать этому примеру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
На новой вкладке браузера перейдите в вилку репозитория, выберите вкладку Параметры, а затем выберите "Секреты и переменные>" в меню слева.
Нажмите Создать секрет репозитория.
Для параметра Имя введите
DNS_NAME
.В поле "Секрет" введите значение имени зоны 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
Выберите Добавить секрет.
Фиксация изменений и проверка промежуточного развертывания
Чтобы зафиксировать изменения, нажмите кнопку "Зафиксировать изменения". Введите описание фиксации и нажмите кнопку "Зафиксировать изменения".
Перейдите на вкладку "Действия", чтобы увидеть выполнение сборки.
После успешной сборки в браузере перейдите, чтобы
contoso-staging.<aks-dns-zone-name>
убедиться, что веб-сайт появится.
Запуск развертывания в рабочей среде
Следующим шагом является создание рабочего процесса.
В каталоге .github/workflows в репозитории откройте файл build-production.yml для редактирования.
deploy
Скопируйте задание из промежуточного конвейера и вставьте его под последней строкой в файле build-production.yml.Измените
Run Helm Deploy
шаг для развертывания в рабочем пространстве имен, изменив--namespace
флаг наstaging
production
.В конце команды 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##*/}
Чтобы зафиксировать изменения, нажмите кнопку "Зафиксировать изменения". Введите описание фиксации и нажмите кнопку "Зафиксировать изменения".
Изменения в рабочей среде
При каждом запуске рабочего процесса необходимо обновить федеративный сертификат с соответствующей версией тега следующим образом:
В портал Azure перейдите на страницу приложения и выберите сертификаты и секреты в области навигации слева.
Перейдите на вкладку федеративных учетных данных.
Выберите учетные данные prod-cred .
На экране "Изменить учетные данные" рядом с выбранным вариантом увеличьте номер тега до нового v.x.x.x.x,например v.2.0.1.
Выберите Обновить.
В Cloud Shell выполните команду
git pull
, чтобы получить последние изменения. Затем выполните следующую команду, чтобы пометить и отправить изменения, заменив новый тег версии заполнителем:git tag -a v<new version tag> -m 'Create new production deployment' && git push --tags
При появлении запроса укажите PAT из предыдущих упражнений в качестве пароля.
На сайте GitHub откройте вкладку "Действия" и просмотрите выполняемый процесс.
После успешного выполнения рабочего процесса перейдите в браузер и
contoso-production.<aks-dns-zone-name>
убедитесь, что веб-сайт появится.
Перейдите к следующему уроку, чтобы удалить ресурсы, чтобы они не продолжали взимать плату.