Руководство по развертыванию из GitHub в службу Azure Kubernetes с помощью Jenkins

Это важно

Хотя многие службы Azure имеют подключаемые модули Jenkins, большинство этих подключаемых модулей завершили поддержку с 29 февраля 2024 года. Azure CLI — это рекомендуемый в настоящее время способ интеграции Jenkins с службами Azure. Для получения дополнительной информации см. статью плагины Jenkins для Azure.

В этом руководстве показано, как развернуть пример приложения из GitHub в кластере Службы Azure Kubernetes (AKS), настроив непрерывную интеграцию (CI) и непрерывное развертывание (CD) в Jenkins.

При работе с этим руководством вы выполните следующие задачи:

  • Разверните пример приложения голосования Azure в кластере AKS.
  • Создайте базовый проект Jenkins.
  • Настройте учетные данные для Jenkins для взаимодействия с ACR.
  • Создайте задание сборки Jenkins и вебхук GitHub для автоматизированных сборок.
  • Проверьте конвейер CI/CD для обновления приложения в AKS на основе коммитов кода GitHub.

Предпосылки

Чтобы завершить работу с этим руководством, вам потребуются следующие элементы:

Подготовка приложения

В этой статье вы используете пример приложения для голосования Azure, содержащего веб-интерфейс и Redis для временного хранилища данных.

Прежде чем интегрировать Jenkins и AKS для автоматизированных развертываний, сначала подготовьте и разверните приложение для голосования Azure в кластере AKS. Это развертывание вручную позволяет увидеть приложение в действии.

Замечание

В примере приложения для голосования Azure используется модуль pod Linux, который планируется запустить на узле Linux. Поток, описанный в этой статье, также работает для модуля pod Windows Server, запланированного на узле Windows Server.

Форкните следующий репозиторий GitHub для образца приложения - https://github.com/Azure-Samples/azure-voting-app-redis. Чтобы сделать форк репозитория в собственную учетную запись GitHub, нажмите кнопку Fork в правом верхнем углу.

Клонируйте форк на свою систему разработки. Убедитесь, что при клонировании этого репозитория используется URL-адрес форка.

git clone https://github.com/<your-github-account>/azure-voting-app-redis.git

Перейдите в директорию вашего клонированного форка.

cd azure-voting-app-redis

Чтобы создать образы контейнеров, необходимые для примера приложения, используйте файл docker-compose.yaml с docker-compose:

docker-compose up -d

Необходимые базовые образы извлекаются и создаются контейнеры приложений. Затем можно использовать команду docker images для просмотра созданного образа. Три образа скачаны или созданы. Изображение azure-vote-front содержит приложение и использует образ nginx-flask в качестве основы. Образ redis используется для запуска экземпляра Redis:

$ docker images

REPOSITORY                   TAG        IMAGE ID            CREATED             SIZE
azure-vote-front             latest     9cc914e25834        40 seconds ago      694MB
redis                        latest     a1b99da73d05        7 days ago          106MB
tiangolo/uwsgi-nginx-flask   flask      788ca94b2313        9 months ago        694MB

Войдите в реестр контейнеров Azure.

az acr login -n <acrLoginServer>

Замените <acrLoginServer> сервером входа ACR.

Используйте команду docker tag для тега изображения с именем сервера входа ACR и номером версии v1. Используйте собственное <acrLoginServer> имя, полученное на предыдущем шаге:

docker tag azure-vote-front <acrLoginServer>/azure-vote-front:v1

Наконец, отправьте образ azure-vote-front в реестр ACR. Опять же, замените <acrLoginServer> именем сервера входа в собственный реестр ACR, например myacrregistry.azurecr.io:

docker push <acrLoginServer>/azure-vote-front:v1

Развертывание примера приложения в AKS

Чтобы развернуть образец приложения в кластере AKS, можно использовать файл манифеста Kubernetes в корне репозитория Azure Vote. Откройте файл манифеста azure-vote-all-in-one-redis.yaml с помощью редактора, например vi. Замените microsoft на название вашего сервера входа ACR. Это значение найдено в строке 60 файла манифеста:

containers:
- name: azure-vote-front
  image: azuredocs/azure-vote-front

Затем используйте команду kubectl apply, чтобы развернуть приложение в вашем кластере AKS.

kubectl apply -f azure-vote-all-in-one-redis.yaml

Служба подсистемы балансировки нагрузки Kubernetes создается для предоставления приложению доступа к Интернету. Этот процесс может занять несколько минут. Чтобы отслеживать ход развертывания подсистемы балансировки нагрузки, используйте команду kubectl get service с аргументом --watch .

$ kubectl get service azure-vote-front --watch

После изменения состояния EXTERNAL-IP с ожидание на IP-адрес, используйте Control + C для остановки процесса наблюдения kubectl.

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE

Чтобы увидеть приложение в действии, откройте веб-браузер и перейдите к внешнему IP-адресу вашего сервиса. Отображается приложение для голосования Azure, как показано в следующем примере:

Пример приложения голосования Azure, работающего в AKS

Настройка контроллера Jenkins

Примените следующие изменения, чтобы включить развертывания AKS из контроллера Jenkins:

Откройте входящий порт 80 .

az vm open-port \
--resource-group <Resource_Group_name> \
--name <Jenkins_Controller_VM>  \
--port 80 --priority 1020

Замените <Resource_Group_name> и <Jenkins_Controller_VM> соответствующими значениями.

Подключитесь через SSH к контроллеру Jenkins

ssh azureuser@<PublicIPAddress>

Замените <PublicIPAddress> IP-адрес контроллера Jenkins.

Установка и вход в AzCLI

curl -L https://aka.ms/InstallAzureCli | bash
az login

Замечание

Чтобы вручную установить AzCLI, следуйте этим инструкциям.

Установите Docker.

sudo apt-get install apt-transport-https ca-certificates curl software-properties-common -y;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -;
sudo apt-key fingerprint 0EBFCD88;
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable";
sudo apt-get update;
sudo apt-get install docker-ce -y;

Установка Kubectl и подключение к AKS

sudo az aks install-cli
sudo az aks get-credentials --resource-group <Resource_Group> --name <AKS_Name>

Замените <Resource_Group> и <AKS_Name> соответствующими значениями.

Настройка доступа

sudo usermod -aG docker jenkins;
sudo usermod -aG docker azureuser;
sudo touch /var/lib/jenkins/jenkins.install.InstallUtil.lastExecVersion;
sudo service jenkins restart;
sudo cp ~/.kube/config /var/lib/jenkins/.kube/
sudo chmod 777 /var/lib/jenkins/
sudo chmod 777 /var/lib/jenkins/config

Создание переменной среды Jenkins

Переменная среды Jenkins используется для хранения имени сервера входа ACR. Эта переменная используется в задании сборки в Jenkins. Чтобы создать эту переменную среды, выполните следующие действия.

  • В левой части портала Jenkins выберите "Управление Jenkins" и "Настроить систему".

  • В разделе "Глобальные свойства" выберите переменные среды. Добавьте переменную с именем ACR_LOGINSERVER и значением сервера входа ACR.

    Переменные среды Jenkins

  • По завершении нажмите кнопку "Сохранить " в нижней части страницы.

Создание учетных данных Jenkins для ACR

Во время процесса CI/CD Jenkins создает новые образы контейнеров на основе обновлений приложений и затем отправляет эти образы в реестр ACR.

Чтобы разрешить Jenkins отправлять обновленные образы контейнеров в ACR, необходимо указать учетные данные для ACR.

Для разделения ролей и разрешений настройте объект-субъект службы для Jenkins с разрешениями участника в реестре ACR.

Создание субъекта-службы для Jenkins для использования ACR

Сначала создайте учетную запись службы с помощью команды az ad sp create-for-rbac :

az ad sp create-for-rbac

Эта команда создает выходные данные, аналогичные следующему примеру:

{
  "appId": "<app-ID>",
  "displayName": "azure-cli-2018-09-28-22-19-34",
  "name": "http://azure-cli-2018-09-28-22-19-34",
  "password": "<password>",
  "tenant": "<tenant-ID>"
}

Запишите идентификатор приложения и пароль. Эти значения используются в следующих шагах для настройки ресурса учетных данных в Jenkins.

Получите идентификатор ресурса реестра ACR с помощью команды az acr show и сохраните его в качестве переменной.

ACR_ID=$(az acr show --resource-group <Resource_Group> --name <acrLoginServer> --query "id" --output tsv)

Замените <Resource_Group> и <acrLoginServer> соответствующими значениями.

Создайте назначение роли, чтобы назначить права служебного субъекта реестру ACR.

az role assignment create --assignee <appID> --role Contributor --scope $ACR_ID

Замените <appId> значением, предоставленным в выходных данных предыдущей команды, использованной для создания основного субъекта-службы.

Создание ресурса учетных данных в Jenkins для субъекта-службы ACR

После создания назначения ролей в Azure сохраните свои учетные данные ACR в объекте учетных данных Jenkins. Эти учетные данные используются во время задания сборки Jenkins.

Слева в портале Jenkins выберите Управление Jenkins>Управление учетными данными>Хранилище Jenkins>Глобальные учетные данные (неограниченные)>Добавить учетные данные

Убедитесь, что тип учетных данных имеет имя пользователя с паролем и введите следующие элементы:

  • Имя пользователяидентификатор приложения субъекта-службы, созданного для аутентификации с вашим реестром ACR.
  • Парольпароль сервисного объекта, созданного для аутентификации в реестре ACR.
  • ID — идентификатор учетных данных, например acr-credentials

По завершении форма учетных данных выглядит следующим образом:

Создайте объект учетных данных Jenkins с информацией учетной записи службы

Нажмите кнопку "ОК " и вернитесь на портал Jenkins.

Создание проекта Jenkins

На домашней странице портала Jenkins выберите новый элемент в левой части:

  1. Введите azure-vote в качестве имени задания. Выберите проект Freestyle, а затем нажмите кнопку "ОК"

  2. В разделе «Общие» выберите проект GitHub и введите URL-адрес вашего форкнутого репозитория, например https://github.com/<your-github-account>/azure-voting-app-redis

  3. В разделе «Управление исходным кодом» выберите Git, введите URL-адрес вашего вилочного репозитория .git, например https://github.com/<your-github-account>/azure-voting-app-redis.git

  4. В разделе Триггеры сборки выберите триггер веб-хука GitHub для опроса системы GITscm

  5. В разделе "Среда сборки" выберите "Использовать секретные тексты или файлы"

  6. В разделе "Привязки" выберите "Добавить>имя пользователя и пароль" (разделенные)

    • Введите ACR_IDпеременную имени пользователя и ACR_PASSWORD для переменной пароля

      Привязки Jenkins

  7. Выберите добавление шага сборки типа Execute shell и используйте следующий текст. Этот скрипт создает новый образ контейнера и отправляет его в реестр ACR.

    # Build new image and push to ACR.
    WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}"
    docker build -t $WEB_IMAGE_NAME ./azure-vote
    docker login ${ACR_LOGINSERVER} -u ${ACR_ID} -p ${ACR_PASSWORD}
    docker push $WEB_IMAGE_NAME
    
  8. Добавьте еще один шаг сборки типа Execute shell и используйте следующий текст. Этот скрипт обновляет развертывание приложения в AKS с новым образом контейнера из ACR.

    # Update kubernetes deployment with new image.
    WEB_IMAGE_NAME="${ACR_LOGINSERVER}/azure-vote-front:kube${BUILD_NUMBER}"
    kubectl set image deployment/azure-vote-front azure-vote-front=$WEB_IMAGE_NAME
    
  9. После завершения нажмите кнопку "Сохранить".

Тестирование сборки Jenkins

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

Эта сборка проверяет правильность настройки задания. Он подтверждает, что надлежащий файл аутентификации Kubernetes находится на месте и что аутентификация в ACR работает.

В меню слева проекта выберите "Создать сейчас".

Тестовая сборка Jenkins

Первая сборка занимает больше времени, так как слои образов Docker извлекаются на сервер Jenkins.

Сборки выполняют следующие задачи:

  1. Клонирует репозиторий GitHub
  2. Создает новый образ контейнера
  3. Отправляет образ контейнера в реестр ACR
  4. Обновляет образ, используемый развертыванием AKS

Так как в код приложения изменения не были внесены, веб-интерфейс не изменяется.

После завершения задания сборки выберите сборку #1 в журнале сборки. Выберите выходные данные консоли и просмотрите выходные данные процесса сборки. Последняя строка должна указывать на успешную сборку.

Создайте вебхук GitHub

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

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

  1. Перейдите к вашему форкнутому репозиторию GitHub в веб-браузере.

  2. Выберите Настройки, а затем выберите Webhooks слева.

  3. Выберите Добавить вебхук. В поле URL-адрес полезных данных введите http://<publicIp:8080>/github-webhook/, где <publicIp> — это IP-адрес сервера Jenkins. Обязательно включите окончательный элемент /. Оставьте остальные значения по умолчанию для типа контента и для срабатывания на событиях push.

  4. Выберите «Добавить веб-перехватчик».

    Создайте вебхук GitHub для Jenkins

Тестируйте полный конвейер CI/CD

Теперь можно протестировать весь конвейер CI/CD. При отправке коммита кода на GitHub выполняются следующие шаги:

  1. Вебхук GitHub уведомляет Jenkins.
  2. Jenkins запускает задание сборки и извлекает последнюю фиксацию кода из GitHub.
  3. Сборка Docker запускается с помощью обновленного кода, а новый образ контейнера помечен последним номером сборки.
  4. Этот новый образ контейнера отправляется в реестр контейнеров Azure.
  5. Приложение, работающее в службе Azure Kubernetes, обновляется с помощью последнего образа из реестра контейнеров Azure.

На компьютере разработки откройте клонированного приложения с помощью редактора кода. В каталоге /azure-vote/azure-vote откройте файл с именем config_file.cfg. Обновите значения голосов в этом файле на что-то другое, отличное от кошек и собак, как показано в следующем примере:

# UI Configurations
TITLE = 'Azure Voting App'
VOTE1VALUE = 'Blue'
VOTE2VALUE = 'Purple'
SHOWHOST = 'false'

При обновлении сохраните файл, зафиксируйте изменения и отправьте их в вилку репозитория GitHub. Веб-хук GitHub запускает новое задание на процесс сборки в Jenkins. На веб-панели мониторинга Jenkins отслеживайте процесс сборки. Требуется несколько секунд, чтобы извлечь последний код, создать и отправить обновленный образ и развернуть обновленное приложение в AKS.

После завершения сборки обновите веб-браузер примера приложения для голосования Azure. Изменения отображаются, как показано в следующем примере:

Образец голосования в Azure для AKS, обновленный заданием сборки в Jenkins

Дальнейшие шаги