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

Важно!

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

В рамках этого руководства мы развернем пример приложения из GitHub в Службе Azure Kubernetes (AKS) на платформе Linux, настроив непрерывную интеграцию (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> именем сервера для входа в Реестр контейнеров.

Используйте команду 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. Откройте файл манифеста 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. Как только ВНЕШНИЙ IP-АДРЕС изменится с состояния ожидания на IP-адрес, используйте команду Control + C, чтобы остановить процесс отслеживания kubectl.

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

NAME               TYPE           CLUSTER-IP    EXTERNAL-IP   PORT(S)        AGE
azure-vote-front   LoadBalancer   10.0.215.27   <pending>     80:30747/TCP   22s
azure-vote-front   LoadBalancer   10.0.215.27   40.117.57.239   80:30747/TCP   2m

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

Azure sample vote application running in AKS

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

Примените следующие изменения, чтобы разрешить развертывания в Реестре контейнеров из контроллера 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@<PublicIPAddres>

Замените <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 выберите Manage Jenkins>Configure System (Управление Jenkins > Настройка системы).

  • В разделе Global Properties (Глобальные свойства) выберите Environment variables (Переменные среды). Добавьте переменную с именем ACR_LOGINSERVER, а в качестве значения укажите имя сервера входа ACR.

    Jenkins environment variables

  • Когда все будет готово, щелкните Сохранить в нижней части страницы.

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

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

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

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

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

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

az ad sp create-for-rbac
{
  "appId": "626dd8ea-042d-4043-a8df-4ef56273670f",
  "displayName": "azure-cli-2018-09-28-22-19-34",
  "name": "http://azure-cli-2018-09-28-22-19-34",
  "password": "1ceb4df3-c567-4fb6-955e-f95ac9460297",
  "tenant": "72f988bf-86f1-41af-91ab-2d7cd011db48"
}

Запишите значения параметров appId и password. Эти значения используются в следующих шагах для настройки ресурса учетных данных в 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 слева выберите Manage Jenkins>Manage Credentials>Jenkins Store>Global credentials (unrestricted)>Add Credentials (Управление Jenkins > Управление учетными данными > Хранилище Jenkins > Глобальные учетные данные (без ограничений) > Добавить учетные данные).

Убедитесь, что выбран тип учетных данных Username with password (Имя пользователя с паролем), и введите следующие данные.

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

По завершении форма учетных данных будет выглядеть примерно так:

Create a Jenkins credential object with the service principal information

Щелкните ОК и вернитесь на портал Jenkins.

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

На домашней странице портала Jenkins выберите New item (Создать элемент) с левой стороны:

  1. Введите azure-vote в качестве имени задания. Выберите Freestyle project (Универсальный проект) и нажмите кнопку ОК.

  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. В разделе Build Triggers (Создание триггеров) выберите GitHub hook trigger for GITScm polling (Обработчик триггера GitHub для опроса GITScm).

  5. В разделе Build Environment (Среда сборки) выберите Use secret texts or files (Использовать секретные тексты или файлы).

  6. В разделе Bindings (Привязки) выберите Add>Username and password (separated) (Добавить > Имя пользователя и пароль (отдельно)).

    • Введите ACR_ID в поле Username Variable (Переменная имени пользователя) и ACR_PASSWORD — в поле Password Variable (Переменная пароля).

      Jenkins bindings

  7. Добавьте Build Step (Шаг сборки) типа 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. После завершения щелкните Save (Сохранить).

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

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

Эта сборка проверяет, что задание было настроено правильно. Она подтверждает наличие правильного файла проверки подлинности Kubernetes и работу проверки подлинности в Реестре контейнеров.

В левом меню проекта выберите Build Now (Выполнить сборку).

Jenkins test build

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

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

  1. клонирует репозиторий GitHub;
  2. создает новый образ контейнера;
  3. отправляет этот образ контейнера в реестр контейнеров;
  4. обновляет образ, используемый развертыванием Реестра контейнеров.

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

Когда задание сборки завершится, щелкните элемент build #1 (сборка № 1) в журнале сборок. Выберите Console Output (Выходные данные консоли) и просмотрите выходные данные процесса сборки. Последняя строка должна указывать, что сборка выполнена успешно.

Создание веб-перехватчика GitHub

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

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

  1. Перейдите к вилке репозитория GitHub в веб-браузере.

  2. Щелкните Settings (Параметры), а затем выберите Webhooks (Веб-перехватчики).

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

  4. Выберите Add webhook (Добавить веб-перехватчик).

    Create a GitHub webhook for Jenkins

Тестирование всего конвейера CI/CD

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

  1. Веб-перехватчик GitHub отправляет уведомление в Jenkins.
  2. Jenkins запускает задание сборки и получает данные о последней фиксации кода из GitHub.
  3. Запускается сборка Docker с использованием обновленного кода, и новый образ контейнера помечается тегом с номером последней сборки.
  4. Этот новый образ контейнера отправляется в Реестр контейнеров Azure.
  5. Приложение, работающее в Службе контейнеров Azure, обновляется из последнего образа, размещенного в Реестре контейнеров 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. Отобразятся внесенные изменения, как показано в следующем примере:

Sample Azure vote in AKS updated by the Jenkins build job

Следующие шаги