1. Обзор
В ходе этой лабораторной работы вы научитесь настраивать конвейер непрерывной доставки для GKE с помощью Cloud Build. В этой лабораторной работе показано, как запускать задания Cloud Build для различных событий git, а также простой шаблон для автоматических выпусков canary в GKE.
Вы выполните следующие шаги:
- Создайте приложение GKE
- Автоматизируйте развертывание веток git
- Автоматизация развертываний для основной ветки git
- Автоматизируйте развертывание тегов git
2. Прежде чем начать
Для работы с этим справочным руководством вам понадобится проект Google Cloud. Вы можете создать новый или выбрать уже созданный проект:
- Выберите или создайте проект Google Cloud.
ПЕРЕЙДИТЕ НА СТРАНИЦУ ВЫБОРА ПРОЕКТОВ
- Включите биллинг для вашего проекта.
3. Подготовка среды
- Создайте переменные среды, которые будут использоваться в этом руководстве:
export PROJECT_ID=$(gcloud config get-value project) export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format='value(projectNumber)') export ZONE=us-central1-b export CLUSTER=gke-progression-cluster export APP_NAME=myapp
- Включите следующие API:
- Менеджер ресурсов
- ГКЭ
- Облачные репозитории исходного кода
- Облачная сборка
- Реестр контейнеров
gcloud services enable \ cloudresourcemanager.googleapis.com \ container.googleapis.com \ sourcerepo.googleapis.com \ cloudbuild.googleapis.com \ containerregistry.googleapis.com \ --async
- Клонируйте исходный код образца и переключитесь в каталог лаборатории:
git clone https://github.com/GoogleCloudPlatform/software-delivery-workshop.git gke-progression cd gke-progression/labs/gke-progression rm -rf ../../.git
- Замените значения-заполнители в образце репозитория на свой
PROJECT_ID
. На этом этапе вы создаете экземпляры различных файлов конфигурации, уникальные для вашей текущей среды. Чтобы просмотреть пример обновляемых шаблонов, выполните следующую команду. Выполните замену переменной, выполнив команду Followign.cat k8s/deployments/dev/frontend-dev.yaml.tmpl
Чтобы просмотреть пример файла после замены, выполните следующую команду.for template in $(find . -name '*.tmpl'); do envsubst '${PROJECT_ID} ${ZONE} ${CLUSTER} ${APP_NAME}' < ${template} > ${template%.*}; done
cat k8s/deployments/dev/frontend-dev.yaml
- Если вы ранее не использовали Git в Cloud Shell, задайте значения
user.name
иuser.email
, которые вы хотите использовать:git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_USERNAME"
- Сохраните код из примера репозитория в облачных репозиториях исходного кода:
gcloud source repos create gke-progression git init git config credential.helper gcloud.sh git remote add gcp https://source.developers.google.com/p/$PROJECT_ID/r/gke-progression git branch -m main git add . && git commit -m "initial commit" git push gcp main
- Создайте кластер GKE.
gcloud container clusters create ${CLUSTER} \ --project=${PROJECT_ID} \ --zone=${ZONE}
- Предоставьте права Cloud Build для вашего кластера. Cloud Build развернет приложение в вашем кластере GKE, и для этого потребуются права.
gcloud projects add-iam-policy-binding ${PROJECT_ID} \ --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role=roles/container.developer
Ваша среда готова!
4. Создание приложения GKE
В этом разделе вы создадите и развернете исходное производственное приложение, которое будете использовать в этом руководстве.
- Создайте приложение с помощью Cloud Build:
gcloud builds submit --tag gcr.io/$PROJECT_ID/$APP_NAME:1.0.0 src/
- Развертывание вручную в средах Canary и Production: создайте рабочие и Canary-развертывания и сервисы с помощью команд
kubectl apply
. Развернутая здесь служба будет маршрутизировать трафик как на канареечное, так и на производственное развертывание.kubectl create ns production kubectl apply -f k8s/deployments/prod -n production kubectl apply -f k8s/deployments/canary -n production kubectl apply -f k8s/services -n production
- Проверьте количество запущенных модулей. Убедитесь, что у вас есть четыре модуля, работающие для внешнего интерфейса, в том числе три для производственного трафика и один для канареечных выпусков. Это означает, что изменения в вашей канареечной версии затронут только 1 из 4 (25%) пользователей.
kubectl get pods -n production -l app=$APP_NAME -l role=frontend
- Получите внешний IP-адрес для производственных служб.
Как только балансировщик нагрузки вернет IP-адрес, перейдите к следующему шагу.kubectl get service $APP_NAME -n production
- Сохраните внешний IP-адрес для дальнейшего использования.
export PRODUCTION_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=production services $APP_NAME)
- Просмотрите приложение. Проверьте вывод версии службы. Должно быть написано Hello World v1.0.
curl http://$PRODUCTION_IP
Поздравляем! Вы развернули пример приложения! Далее вы настроите триггеры для постоянного развертывания изменений.
5. Автоматизация развертываний для веток git
В этом разделе вы настроите триггер, который будет выполнять задание Cloudbuild при фиксации любой ветки, кроме main
. Используемый здесь файл Cloud Build автоматически создаст пространство имен и развертывание для любых существующих или новых веток, что позволит разработчикам предварительно просмотреть свой код перед интеграцией с основной веткой.
- Настройте триггер. Ключевым компонентом этого триггера является использование параметра
branchName
для соответствияmain
и параметраinvertRegex
, для которого установлено значение true и изменяет шаблонbranchName
, чтобы он соответствовал всему, что не являетсяmain
. Для справки вы можете найти следующие строки вbuild/branch-trigger.json
. Кроме того, последние несколько строк файла Cloud Build, используемые с этим триггером, создают пространство имен, названное в честь ветки, вызвавшей задание, а затем развертывают приложение и службу в новом пространстве имен. Для справки вы можете найти следующие строки в"branchName": "main", "invertRegex": true
build/branch-cloudbuild.yaml
Теперь, когда вы понимаете используемые механизмы, создайте триггер с помощью приведенной ниже команды gcloud.kubectl get ns ${BRANCH_NAME} || kubectl create ns ${BRANCH_NAME} kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/deployments/dev kubectl apply --namespace ${BRANCH_NAME} --recursive -f k8s/services
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/branch-trigger.json
- Чтобы просмотреть триггер, перейдите на страницу «Триггеры Cloud Build» в консоли. Перейти к триггерам
- Создайте новую ветку:
git checkout -b new-feature-1
- Измените код, указав версию 1.1. Отредактируйте
src/app.py
и измените ответ с 1,0 на 1,1.@app.route('/') def hello_world(): return 'Hello World v1.1'
- Зафиксируйте изменение и отправьте его в удаленный репозиторий:
git add . && git commit -m "updated" && git push gcp new-feature-1
- Чтобы просмотреть ход сборки, перейдите на страницу «История сборок облака» в консоли. Перейти к сборкам. После завершения сборки перейдите к следующему шагу.
- Получите внешний IP-адрес для вновь развернутой службы филиала.
Как только балансировщик нагрузки вернет IP-адрес, перейдите к следующему шагу.kubectl get service $APP_NAME -n new-feature-1
- Сохраните внешний IP-адрес для дальнейшего использования.
export BRANCH_IP=$(kubectl get -o jsonpath="{.status.loadBalancer.ingress[0].ip}" --namespace=new-feature-1 services $APP_NAME)
- Просмотрите приложение. Проверьте вывод версии службы. Должно быть написано Hello World v1.0.
curl http://$BRANCH_IP
6. Автоматизация развертывания основной ветки git.
Прежде чем код будет выпущен в рабочую среду, обычно его выпускают для небольшого подмножества активного трафика, а затем переносят весь трафик в новую базу кода.
В этом разделе вы реализуете триггер, который активируется, когда код фиксируется в основной ветке. Триггер развертывает канареечное развертывание, которое получает 25 % всего текущего трафика в новую версию.
- Настройте триггер для основной ветки:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/main-trigger.json
- Чтобы просмотреть новый триггер, перейдите на страницу «Триггеры Cloud Build» в консоли. Перейти к триггерам
- Объедините ветку с основной строкой и отправьте ее в удаленный репозиторий:
git checkout main git merge new-feature-1 git push gcp main
- Чтобы просмотреть ход сборки, перейдите на страницу «История сборок облака» в консоли. Перейти к сборкам. После завершения сборки перейдите к следующему шагу.
- Просмотрите несколько ответов от сервера. Выполните следующую команду и обратите внимание, что примерно 25% ответов показывают новый ответ Hello World v1.1.
Когда вы будете готовы продолжить, нажмитеwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; done
Ctrl+c
, чтобы выйти из цикла.
7. Автоматизация развертывания тегов git
После того как канареечное развертывание будет проверено с небольшим подмножеством трафика, вы освобождаете развертывание для оставшейся части живого трафика.
В этом разделе вы настраиваете триггер, который активируется при создании тега в репозитории. Триггер помечает изображение соответствующим тегом, а затем развертывает обновления в продукте, гарантируя, что 100 % трафика обращается к изображению с тегом.
- Настройте триггер тега:
gcloud beta builds triggers create cloud-source-repositories \ --trigger-config build/tag-trigger.json
- Чтобы просмотреть новый триггер, перейдите на страницу «Триггеры Cloud Build» в консоли. Перейти к триггерам
- Создайте новый тег и отправьте его в удаленный репозиторий:
git tag 1.1 git push gcp 1.1
- Чтобы просмотреть ход сборки, перейдите на страницу «История сборок облака» в консоли. Перейти в Сборки
- Просмотрите несколько ответов от сервера. Выполните следующую команду и обратите внимание, что 100% ответов отображают новый ответ Hello World v1.1. Это может занять некоторое время, поскольку новые модули развертываются и проверяются работоспособность в GKE.
Когда вы будете готовы продолжить, нажмитеwhile true; do curl -w "\n" http://$PRODUCTION_IP; sleep 1; done
Ctrl+c
, чтобы выйти из цикла. Поздравляем! Вы создали триггеры CI/CD в Cloud Build для ветвей и тегов для развертывания ваших приложений в GKE.
8. Очистка
Удалить проект
- В Cloud Console перейдите на страницу «Управление ресурсами» .
- В списке проектов выберите проект, который хотите удалить, и нажмите «Удалить» .
- В диалоговом окне введите идентификатор проекта, а затем нажмите «Завершить работу» , чтобы удалить проект.