Выпуск с помощью Cloud Deploy

1. Цели

В этом руководстве вы создадите три кластера GKE с именами Preview, Canary и Prod. Затем создайте цель Cloud Deploy, соответствующую каждому кластеру, и конвейер Cloud Deploy, который определит последовательность шагов для выполнения развертывания в этих целях.

Поток развертывания будет запущен конвейером CloudBuild, который создаст выпуск Cloud Deploy и выполнит развертывание в предварительном кластере. Убедившись, что развертывание предварительной версии прошло успешно и работает должным образом, вы вручную продвинете выпуск в канареечном кластере. Для продвижения выпуска в кластере продукции потребуется одобрение. Вы одобрите конвейер продукции в пользовательском интерфейсе Cloud Deploy и, наконец, продвинете его.

Цели этого руководства можно разбить на следующие этапы:

  • Подготовьте свое рабочее место
  • Определите цели развертывания в облаке
  • Определение конвейера облачного развертывания
  • Создать релиз
  • Продвигайте развертывание
  • Утвердить производственный выпуск

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google, и вы можете обновить ее в любое время.
  • Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (нельзя изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ), поэтому, если он вам не нравится, создайте другой случайный идентификатор или попробуйте свой собственный и посмотрите, доступен ли он. Затем он «замораживается» после создания проекта.
  • Существует третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Затем вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и не платить за выставление счетов за пределами этого руководства, следуйте инструкциям по «очистке», которые можно найти в конце лаборатории кода. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

2. Настройка платформы

Подготовка вашего рабочего места

Здесь мы настроим среду, необходимую для запуска этого руководства. Когда этот шаг будет завершен, у нас будет создан кластер GKE, в котором мы сможем запускать развертывания.

  1. Установите настройки конфигурации gcloud по умолчанию

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. Клонирование репо

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. Установить переменные среды

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. Включить API

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. Создание кластеров GKE
     `gcloud container clusters create preview \`
    

--zone=us-central1-a --async

    `gcloud container clusters create canary \`

--zone=us-central1-b --async

    `gcloud container clusters create prod \`

--zone=us-central1-c

Определение целей развертывания в облаке

  1. Создайте файл в каталоге развертывания с именем Preview.yaml с помощью следующей команды в CloudShell:

cat <<EOF >deploy/preview.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: preview

annotations: {}

labels: {}

description: Target for preview environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview

EOF

    As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
  1. Создайте файл в каталоге развертывания с именем canary.yaml с помощью следующей команды в CloudShell:

cat <<EOF >deploy/canary.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: canary

annotations: {}

labels: {}

description: Target for canary environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary

EOF

  1. Создайте в каталоге развертывания файл с именем prod.yaml с помощью следующей команды в CloudShell:

cat <<EOF >deploy/prod.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: prod

annotations: {}

labels: {}

description: Target for prod environment

requireApproval: true

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod

EOF

Обратите внимание на тег requireApproval, которому присвоено значение true. Это не позволит перейти в целевую версию продукта до тех пор, пока не будет получено одобрение. Для утверждения выпуска вам потребуется роль roles/clouddeploy.approver.

  1. Создайте цели развертывания
         `gcloud config set deploy/region us-central1` 
    

gcloud beta deploy apply --file deploy/preview.yaml

gcloud beta deploy apply --file deploy/canary.yaml

gcloud beta deploy apply --file deploy/prod.yaml

3. Создание приложения

В рамках создания нового приложения конвейер CICD обычно настраивается для выполнения автоматических сборок, интеграционного тестирования и развертывания. Следующие шаги считаются частью процесса установки нового приложения. Для каждого нового приложения будет настроен конвейер развертывания.

Определение конвейера Cloud Deploy

  1. Создайте в каталоге развертывания файл с именем Pipeline.yaml с помощью следующей команды в CloudShell:

cat <<EOF >>deploy/pipeline.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: DeliveryPipeline

metadata:

name: sample-app

labels:

`app: sample-app`

description: delivery pipeline

serialPipeline:

stages:

- targetId: preview

`profiles:`

`- preview`

- targetId: canary

`profiles:`

`- canary`

- targetId: prod

`profiles:`

`- prod`

EOF

    As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.

Тег serialPipeline содержит тег с именем stage, который представляет собой список всех целей, для развертывания которых настроен этот конвейер доставки.

targetId идентифицирует конкретную цель, которую следует использовать на этом этапе конвейера доставки. Значением является свойство Metadata.name из целевого определения.

profiles — это список из нуля или более имен профилей Skaffold из skaffold.yaml. Cloud Deploy использует профиль с рендерингом Skaffold при создании выпуска.

  1. Применить конвейер

gcloud beta deploy apply --file deploy/pipeline.yaml

4. Этап разработки

По мере разработки приложений автоматизированные цепочки инструментов CICD будут создавать и хранить активы. Следующие команды выполняются для сборки приложения с использованием skaffold и хранения ресурсов для развертывания с помощью Cloud Deploy. Этот шаг будет выполняться вашим процессом CICD для каждой сборки приложения.

  1. Создайте и сохраните приложение с помощью skaffold.

skaffold build \

--file-output=artifacts.json \

--default-repo gcr.io/$PROJECT_ID \

--push=true

5. Фаза выпуска

В конце процесса CICD, обычно когда код помечен для производства, вы инициируете процесс выпуска, вызвав команду cloud deploy release . Позже, когда развертывание будет проверено и одобрено, вы переместите выпуск в различные целевые среды, продвигая и одобряя действие с помощью автоматизированных процессов или утверждений вручную.

Создание релиза

Ранее в этом руководстве мы создали файлы Cloud Deploy, чтобы понять, как работает Cloud Deploy. В целях демонстрации мы создали те же файлы Cloud Deploy и поместили их в репозиторий GitHub с примером приложения Go, и мы будем использовать Cloud Deploy для выпуска этого приложения.

export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud beta deploy releases create \

sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--description="Release demo" \

--build-artifacts=artifacts.json \

--annotations="release-id=rel-${REL_TIMESTAMP}"

Обзор выпуска

Когда создается выпуск Cloud Deploy, он автоматически развертывается в первой целевой версии — предварительной версии.

  1. Перейдите в <Cloud Deploy> в облачной консоли Google.
  2. Нажмите «Пример приложения».

На этом экране вы увидите графическое представление вашего конвейера.

  1. Подтвердите зеленый контур в левой части окна предварительного просмотра, который означает, что выпуск развернут в этой среде.
  2. При необходимости просмотрите дополнительные сведения о выпуске, щелкнув название выпуска в разделе «Сведения о выпуске» в нижней части экрана.
  3. Убедитесь, что выпуск успешно развернул приложение, выполнив следующую команду: cloushell.

gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Нажмите на значок веб-просмотра в правом верхнем углу экрана.
  2. Выберите «Предварительный просмотр» на порту 8080.

Вы перейдете на новую страницу с сообщением «Hello World!»

  1. Используйте ctrl+c в терминале, чтобы завершить переадресацию портов.

Продвижение релиза

Теперь, когда ваш выпуск развернут на первой цели (предварительной версии) в конвейере, вы можете перенести его на следующую цель (canary). Выполните следующую команду, чтобы начать процесс.

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

Ознакомьтесь с продвижением выпуска

  1. Перейдите к конвейеру примера приложения в консоли Google Cloud.
  2. Подтвердите зеленый контур в левой части поля Canary, который означает, что выпуск развернут в этой среде.
  3. Убедитесь, что приложение развернуто правильно, создав к нему туннель.

gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Нажмите на значок веб-просмотра в правом верхнем углу экрана.
  2. Выберите «Предварительный просмотр» на порту 8080.

Вы перейдете на новую страницу с сообщением «Hello World!»

  1. Используйте ctrl+c в терминале, чтобы завершить переадресацию портов.

Утверждение производственного релиза

Помните, когда мы создавали цель продукта через prod.yaml, мы указали тег requireApproval как true. Это приведет к требованию одобрения продвижения в продукте.

  1. Продвигайте канареечную версию в производство с помощью следующей команды

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

  1. Перейдите к конвейеру примера приложения в консоли Google Cloud.
  2. Обратите внимание на желтый индикатор, обозначающий «1 в ожидании».

Это сообщение указывает на то, что выпуск находится в очереди для развертывания в рабочей среде, но требует проверки и утверждения.

  1. Нажмите кнопку «Просмотр» чуть ниже желтого уведомления.
  2. На следующем экране снова нажмите «Просмотр», чтобы получить доступ к экрану утверждения производства.
  3. При необходимости просмотрите Manifest Diff, чтобы просмотреть изменения. В данном случае совершенно новый файл.
  4. Нажмите на кнопку «Одобрить»
  5. Вернитесь на страницу конвейера примера приложения , где вы увидите, что выпуск в производство находится в стадии разработки.

Обзор производственного релиза

Как и в других средах, вы можете просмотреть развертывание после его завершения, выполнив следующие действия.

  1. Выполните следующую команду в CloudShell, чтобы создать переадресацию портов.

gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. Нажмите на значок веб-просмотра в правом верхнем углу экрана.
  2. Выберите «Предварительный просмотр» на порту 8080.

Вы перейдете на новую страницу с сообщением «Hello World!»

  1. Используйте ctrl+c в терминале, чтобы завершить переадресацию портов.