Руководство. Развертывание из 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.
Необходимые компоненты
Для работы с этим руководством вам потребуется следующее:
Базовое представление о Kubernetes, Git, непрерывной интеграции и непрерывной поставке, а также об образах контейнеров.
Кластер AKS и
kubectl
, настроенные с учетными данными кластера AKS.Реестр службы "Реестр контейнеров Azure" (ACR), имя сервера ACR для входа и кластер AKS, настроенный для проверки подлинности в реестре ACR.
Контроллер Jenkins, развернутый на виртуальной машине Azure.
Установленная и настроенная версия Azure CLI 2.0.46 или более поздняя. Чтобы узнать версию, выполните команду
az --version
. Если вам необходимо выполнить установку или обновление, см. статью Установка Azure CLI 2.0.Установленное средство Docker в системе разработки.
Учетная запись GitHub, личный маркер доступа GitHub и клиент Git, установленный в системе разработки.
Если вы используете собственный экземпляр Jenkins вместо описанного здесь примера скрипта развертывания Jenkins, для него понадобится установленное и настроенное средство Docker, а также kubectl.
Подготовка приложения
В этой статье используется пример приложения для голосования 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
.
$ kubectl get service azure-vote-front --watch
Как только ВНЕШНИЙ IP-АДРЕС изменится с состояния ожидания на IP-адрес, используйте команду Control + C
, чтобы остановить процесс отслеживания kubectl.
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
Чтобы увидеть приложение в действии, откройте в веб-браузере внешний IP-адрес вашей службы. Отобразится приложение для голосования Azure, как показано в следующем примере:
Настройка контроллера 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 для 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": "<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>"
}
Запишите значения параметров 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.
По завершении форма учетных данных будет выглядеть примерно так:
Щелкните ОК и вернитесь на портал Jenkins.
Создание проекта Jenkins
На домашней странице портала Jenkins выберите New item (Создать элемент) с левой стороны:
Введите azure-vote в качестве имени задания. Выберите Freestyle project (Универсальный проект) и нажмите кнопку ОК.
В разделе "Общие" выберите проект GitHub и введите вилку URL-адрес репозитория, например https://github.com/<your-github-account>/azure-voting-app-redis
В разделе "Управление исходным кодом" выберите Git, введите вилку URL-адрес репозитория
.git
, например https://github.com/<your-github-account>/azure-voting-app-redis.gitВ разделе Build Triggers (Создание триггеров) выберите GitHub hook trigger for GITScm polling (Обработчик триггера GitHub для опроса GITScm).
В разделе Build Environment (Среда сборки) выберите Use secret texts or files (Использовать секретные тексты или файлы).
В разделе Bindings (Привязки) выберите Add>Username and password (separated) (Добавить > Имя пользователя и пароль (отдельно)).
Введите
ACR_ID
в поле Username Variable (Переменная имени пользователя) иACR_PASSWORD
— в поле Password Variable (Переменная пароля).
Добавьте 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
Добавьте другой шаг сборки типа 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
После завершения щелкните Save (Сохранить).
Тестирование сборки Jenkins
Прежде чем автоматизировать задание по фиксациям GitHub, вручную протестируйте сборку Jenkins.
Эта сборка проверяет, что задание было настроено правильно. Она подтверждает наличие правильного файла проверки подлинности Kubernetes и работу проверки подлинности в Реестре контейнеров.
В левом меню проекта выберите Build Now (Выполнить сборку).
Первая сборка занимает больше времени, так как нужно перенести слои образа Docker на сервер Jenkins.
Каждая сборка выполняет следующие задачи:
- клонирует репозиторий GitHub;
- создает новый образ контейнера;
- отправляет этот образ контейнера в реестр контейнеров;
- обновляет образ, используемый развертыванием Реестра контейнеров.
Так как изменения в код приложения не вносились, пользовательский интерфейс не изменяется.
Когда задание сборки завершится, щелкните элемент build #1 (сборка № 1) в журнале сборок. Выберите Console Output (Выходные данные консоли) и просмотрите выходные данные процесса сборки. Последняя строка должна указывать, что сборка выполнена успешно.
Создание веб-перехватчика GitHub
После успешного выполнения ручной сборки теперь следует интегрировать GitHub в сборку Jenkins. Используйте веб-перехватчик, чтобы запускать задание сборки Jenkins при каждой фиксации кода в GitHub.
Чтобы создать веб-перехватчик GitHub, выполните следующие действия.
Перейдите к вилке репозитория GitHub в веб-браузере.
Щелкните Settings (Параметры), а затем выберите Webhooks (Веб-перехватчики).
Выберите Add webhook (Добавить веб-перехватчик). В поле Payload URL (URL-адрес полезных данных) введите
http://<publicIp:8080>/github-webhook/
, где<publicIp>
— IP-адрес сервера Jenkins. Убедитесь, что адрес содержит завершающую косую черту (/
). Оставьте другие значения по умолчанию для типа содержимого и триггера событий принудительной отправки.Выберите Add webhook (Добавить веб-перехватчик).
Тестирование всего конвейера CI/CD
Теперь можно протестировать весь конвейер CI/CD. При отправке фиксации кода в GitHub происходит следующее:
- Веб-перехватчик GitHub отправляет уведомление в Jenkins.
- Jenkins запускает задание сборки и получает данные о последней фиксации кода из GitHub.
- Запускается сборка Docker с использованием обновленного кода, и новый образ контейнера помечается тегом с номером последней сборки.
- Этот новый образ контейнера отправляется в Реестр контейнеров Azure.
- Приложение, работающее в Службе контейнеров 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. Отобразятся внесенные изменения, как показано в следующем примере: