Cloud Deploy
1 - Overview
Cloud Deploy is a managed continuous delivery service for deploying applications to GKE, Cloud Run, and other targets.
2 - Concepts
2.1 Components
| Component | Description |
|---|---|
| Delivery Pipeline | Defines the deployment stages |
| Target | Destination (GKE cluster, Cloud Run) |
| Release | Deployable version of the application |
| Rollout | Deployment of a release to a target |
2.2 Deployment flow
3 - Configuration
3.1 Delivery Pipeline
# clouddeploy.yaml
apiVersion: deploy.cloud.google.com/v1
kind: DeliveryPipeline
metadata:
name: my-app-pipeline
description: Deployment pipeline for my-app
serialPipeline:
stages:
- targetId: dev
profiles: [dev]
- targetId: staging
profiles: [staging]
- targetId: production
profiles: [production]
strategy:
canary:
runtimeConfig:
kubernetes:
serviceNetworking:
service: my-app
deployment: my-app
canaryDeployment:
percentages: [10, 50]
verify: true
3.2 Targets
# targets.yaml
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: dev
description: Development cluster
gke:
cluster: projects/mon-projet/locations/europe-west1/clusters/dev-cluster
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: staging
description: Staging cluster
gke:
cluster: projects/mon-projet/locations/europe-west1/clusters/staging-cluster
requireApproval: true
---
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: production
description: Production cluster
gke:
cluster: projects/mon-projet/locations/europe-west1/clusters/prod-cluster
requireApproval: true
3.3 Cloud Run Target
apiVersion: deploy.cloud.google.com/v1
kind: Target
metadata:
name: production-cloudrun
description: Cloud Run production
run:
location: projects/mon-projet/locations/europe-west1
4 - Skaffold
Cloud Deploy uses Skaffold for rendering and deployment.
4.1 skaffold.yaml
apiVersion: skaffold/v4beta7
kind: Config
metadata:
name: my-app
profiles:
- name: dev
manifests:
kustomize:
paths:
- kubernetes/overlays/dev
- name: staging
manifests:
kustomize:
paths:
- kubernetes/overlays/staging
- name: production
manifests:
kustomize:
paths:
- kubernetes/overlays/production
deploy:
kubectl: {}
4.2 Kustomize structure
kubernetes/
├── base/
│ ├── deployment.yaml
│ ├── service.yaml
│ └── kustomization.yaml
└── overlays/
├── dev/
│ └── kustomization.yaml
├── staging/
│ └── kustomization.yaml
└── production/
└── kustomization.yaml
5 - Create and deploy
5.1 Apply the configuration
# Create the pipeline and targets
gcloud deploy apply --file=clouddeploy.yaml --region=europe-west1
gcloud deploy apply --file=targets.yaml --region=europe-west1
5.2 Create a release
# From Cloud Build
gcloud deploy releases create release-001 \
--project=mon-projet \
--region=europe-west1 \
--delivery-pipeline=my-app-pipeline \
--images=my-app=europe-west1-docker.pkg.dev/mon-projet/images/my-app:v1.0.0
5.3 Cloud Build integration
# cloudbuild.yaml
steps:
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', '${_IMAGE}', '.']
- name: 'gcr.io/cloud-builders/docker'
args: ['push', '${_IMAGE}']
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: 'gcloud'
args:
- 'deploy'
- 'releases'
- 'create'
- 'release-$SHORT_SHA'
- '--delivery-pipeline=my-app-pipeline'
- '--region=europe-west1'
- '--images=my-app=${_IMAGE}'
substitutions:
_IMAGE: 'europe-west1-docker.pkg.dev/$PROJECT_ID/images/my-app:$COMMIT_SHA'
6 - Promotions and rollbacks
6.1 Promote a release
# Promote to the next target
gcloud deploy releases promote \
--release=release-001 \
--delivery-pipeline=my-app-pipeline \
--region=europe-west1
# To a specific target
gcloud deploy releases promote \
--release=release-001 \
--delivery-pipeline=my-app-pipeline \
--region=europe-west1 \
--to-target=production
6.2 Approve a deployment
# List rollouts pending approval
gcloud deploy rollouts list \
--delivery-pipeline=my-app-pipeline \
--region=europe-west1 \
--filter="state=PENDING_APPROVAL"
# Approve
gcloud deploy rollouts approve rollout-001 \
--delivery-pipeline=my-app-pipeline \
--release=release-001 \
--region=europe-west1
6.3 Rollback
# Create a rollback to a previous release
gcloud deploy targets rollback production \
--delivery-pipeline=my-app-pipeline \
--region=europe-west1
# Or promote an older release
gcloud deploy releases promote \
--release=release-000 \
--delivery-pipeline=my-app-pipeline \
--region=europe-west1 \
--to-target=production
7 - Deployment strategies
7.1 Rolling Update (default)
stages:
- targetId: production
strategy:
standard:
verify: true
7.2 Canary
stages:
- targetId: production
strategy:
canary:
runtimeConfig:
kubernetes:
serviceNetworking:
service: my-app
deployment: my-app
canaryDeployment:
percentages: [10, 25, 50, 75]
verify: true
8 - Notifications
# Configure Pub/Sub notifications
gcloud deploy delivery-pipelines update my-app-pipeline \
--region=europe-west1 \
--notification-config-topic=projects/mon-projet/topics/deploy-notifications
Summary
In this chapter, we learned:
- The concepts of Cloud Deploy
- The configuration of pipelines and targets
- Integration with Skaffold
- Releases and how to manage them
- Promotions and rollbacks
- Deployment strategies
Next step
In the next chapter, we will look at Google Kubernetes Engine (GKE).