Развертывание приложения Cloud Run с помощью Cloud Deploy

1. Обзор

В этой лабораторной работе вы развернете .NET-приложение в Cloud Run с помощью Cloud Deploy. Вы создадите образ контейнера с помощью Cloud Build без использования Dockerfile. Вы настроите конвейер с тремя целевыми средами с помощью Cloud Deploy и выполните шаги по продвижению релиза по средам. Наконец, вы утвердите релиз для развертывания в производственной среде.

916a54f51af5ee54.png

Что такое Cloud Build?

С помощью Cloud Build вы можете быстро создавать программное обеспечение на всех языках программирования.

Что такое Cloud Deploy?

Cloud Deploy — это полностью управляемый сервис непрерывной доставки. С помощью Cloud Deploy вы можете создавать конвейеры развертывания для GKE, Anthos и Cloud Run.

Что такое Cloud Run?

С помощью Cloud Run вы можете развертывать масштабируемые контейнерные приложения, написанные на любом языке (включая Go, Python, Java, Node.js, .NET и Ruby), на полностью управляемой платформе.

Что такое Скаффолд?

Skaffold — это инструмент командной строки, обеспечивающий непрерывную разработку приложений, работающих в Kubernetes. Cloud Deploy использует Skaffold для операций рендеринга и развертывания.

Что вы узнаете

В этой лабораторной работе вы научитесь выполнять следующие действия:

  • Создание конвейера развертывания в облаке
  • Создание образа контейнера для .NET-приложения с помощью Cloud Build без использования Dockerfile.
  • Разверните приложение в облаке с помощью Cloud Deploy.
  • Продвижение релизов Cloud Deploy

Предварительные требования

  • Для выполнения этой лабораторной работы предполагается знакомство с Cloud Console и командной оболочкой.

2. Настройка и требования

Настройка облачного проекта

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

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

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

Настройка среды

Активируйте Cloud Shell, нажав на значок справа от строки поиска.

eb0157a992f16fa3.png

В командной оболочке Cloud Shell выполните следующую команду, чтобы установить переменные среды проекта:

export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
export REGION=us-central1

Включить API:

gcloud services enable \
  run.googleapis.com \
  cloudbuild.googleapis.com \
  clouddeploy.googleapis.com \
  artifactregistry.googleapis.com

Создайте репозиторий в реестре артефактов для хранения образов контейнеров приложений:

gcloud artifacts repositories create containers-repo \
  --repository-format=docker \
  --location=${REGION} \
  --description="Containers repository"

3. Проверьте конфигурационные файлы.

29c2533441779de0.png

Клонируйте исходный код приложения:

git clone https://github.com/gitrey/deploy-cloudrun-app-with-clouddeploy.git
cd deploy-cloudrun-app-with-clouddeploy

Проверьте конфигурацию конвейера Cloud Deploy:

clouddeploy.yaml

apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
 name: cloud-run-pipeline
description: application deployment pipeline
serialPipeline:
 stages:
 - targetId: dev-env
   profiles: [dev]
 - targetId: qa-env
   profiles: [qa]
 - targetId: prod-env
   profiles: [prod]
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: dev-env
description: Cloud Run development service
run:
 location: projects/_PROJECT_ID/locations/us-west1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: qa-env
description: Cloud Run QA service
run:
 location: projects/_PROJECT_ID/locations/us-central1
---

apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
 name: prod-env
description: Cloud Run PROD service
run:
 location: projects/_PROJECT_ID/locations/us-south1

Просмотрите файл skaffold.yaml , в котором определены три среды, и вы увидите, что в качестве целевой службы используется Cloud Run.

skaffold.yaml

apiVersion: skaffold/v3alpha1
kind: Config
metadata: 
  name: cloud-run-app
profiles:
- name: dev
  manifests:
    rawYaml:
    - deploy-dev.yaml
- name: qa
  manifests:
    rawYaml:
    - deploy-qa.yaml
- name: prod
  manifests:
    rawYaml:
    - deploy-prod.yaml
deploy:
  cloudrun: {}

Просмотрите файлы конфигурации службы.

deploy-dev.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app
        resources:
          limits:
            cpu: 1000m
            memory: 128Mi

deploy-qa.yaml

kind: Service
metadata:
  name: app-dev
spec:
  template:
    spec:
      containers:
      - image: app

deploy-prod.yaml

apiVersion: serving.knative.dev/v1
kind: Service
metadata:
  name: app-prod
spec:
  template:
    spec:
      containers:
      - image: app

Ознакомьтесь с файлом cloudbuild.yaml , содержащим пошаговые инструкции по созданию образа контейнера и выпуску релиза Cloud Deploy:

cloudbuild.yaml

steps:
- name: 'gcr.io/k8s-skaffold/pack'
  entrypoint: 'pack'
  args: ['build',
         '--builder=gcr.io/buildpacks/builder',
         '--publish', '${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID']
  id: Build and package .net app
- name: gcr.io/google.com/cloudsdktool/cloud-sdk:slim
  args: 
      [
        "deploy", "releases", "create", "release-$_RELEASE_TIMESTAMP",
        "--delivery-pipeline", "cloud-run-pipeline",
        "--region", "${_REGION}",
        "--images", "app=${_REGION}-docker.pkg.dev/${PROJECT_ID}/containers-repo/app:$BUILD_ID"
      ]
  entrypoint: gcloud

4. Создайте конвейер развертывания в облаке.

Замените значение _PROJECT_ID в файле clouddeploy.yaml:

sed -i "s/_PROJECT_ID/$PROJECT_ID/g" clouddeploy.yaml

Создание конвейера развертывания в облаке:

gcloud deploy apply \
  --file=clouddeploy.yaml \
  --region=${REGION} \
  --project=${PROJECT_ID}

Проверьте созданный конвейер в Cloud Deploy .

5. Создайте образ контейнера и выполните релиз.

Добавьте разрешения оператора развертывания облака к учетной записи службы Cloud Build:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/clouddeploy.operator

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
    --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
    --role=roles/iam.serviceAccountUser

Создайте образ контейнера и выполните релиз в Cloud Deploy:

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

gcloud builds submit \
  --config cloudbuild-plus.yaml \
  --substitutions=_REGION=${REGION},_RELEASE_TIMESTAMP=${RELEASE_TIMESTAMP}

Проверьте созданный релиз в Cloud Deploy . Дождитесь завершения развертывания в среду разработки.

6. Обеспечить выпуск продукта в среды тестирования и производства.

Используя Cloud Console или Cloud Shell, перенесите релиз на следующую целевую среду (среду тестирования).

Для продвижения релиза с помощью Cloud Shell выполните команду gcloud.

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

Дождитесь завершения развертывания в тестовой среде. Перенесите релиз на следующую целевую среду (производственную).

gcloud beta deploy releases promote \
    --release="release-${RELEASE_TIMESTAMP}" \
    --delivery-pipeline=cloud-run-pipeline \
    --region=${REGION} \
    --quiet

Откройте Cloud Deploy в Cloud Console и подтвердите выпуск для развертывания в производственной среде.

4c838b60770e9691.png

Просмотрите состояние конвейера Cloud Deploy и доступные метрики DORA («количество развертываний», «частота развертываний», «частота сбоев развертывания»).

Метрика

Описание

Количество развертываний

Общее количество успешных и неудачных развертываний на целевом объекте в вашем конвейере доставки.

Частота развертывания

Как часто конвейер доставки развертывает приложения в конечный пункт назначения. Одна из четырех ключевых метрик, определенных программой DevOps Research and Assessment (DORA).

Показатель отказов при развертывании

Процент неудачных внедрений по отношению к конечной цели в вашем конвейере доставки.

Просмотрите развернутые приложения в Cloud Run :

d6372b5350f10875.png

7. Поздравляем!

Поздравляем, вы завершили практическое занятие!

Что мы рассмотрели:

  • Как создать конвейер развертывания в облаке
  • Как создать образ контейнера для .NET-приложения с помощью Cloud Build
  • Как развернуть приложение в облаке с помощью Cloud Deploy
  • Как продвигать релиз Cloud Deploy

Уборка

Чтобы избежать списания средств с вашего аккаунта Google Cloud за ресурсы, используемые в этом руководстве, либо удалите проект, содержащий эти ресурсы, либо сохраните проект и удалите отдельные ресурсы.

Удаление проекта

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

8. Что дальше?