Slide 1

Slide 1 text

Google Cloudでチームで 安全にデプロイをする Jun Sakata Google Developers Expert, Cloud @sakajunquality Introduction to Cloud Deploy

Slide 2

Slide 2 text

“安全に” デプロイ

Slide 3

Slide 3 text

“安全に” デプロイ セキュリティ? 信頼性? DevOps? リグレッション? スケーラビリティ?

Slide 4

Slide 4 text

Today’s theme: 新しいAPI を Cloud Run にデ プロイする

Slide 5

Slide 5 text

新しいAPIのデプロイ The story 長い設計やコーディング、レビューを経てようやく新しいAPIの開発が終わりました。 開発が終わったら次はいざデプロイ。 Cloud Deploy の機能を紹介しつつ、デプロイの仕組みを改善していきます。

Slide 6

Slide 6 text

Cloud Run について - 今回は Cloud Run にデプロイします。 - 本題と逸れるためCloud Runの詳細は割愛します。 - 基本的には任意のコンテナイメージをHTTP/gRPCサーバーとして公開で きます。 - Cloud Deploy は GKE にも対応しているため GKE でも流れは同じにな ります。

Slide 7

Slide 7 text

まずは Cloud Deploy は使わずに サクサクとデプロイしてみます。 Let’s Deploy

Slide 8

Slide 8 text

まずはビルド $ gcloud builds submit \ --tag asia-northeast1-docker.pkg.dev/[project]/app/test-app:v1 \ --project [project] . Cloud Build を使っていますが docker build & push していると 思ってください

Slide 9

Slide 9 text

そしてデプロイ $ gcloud run deploy test-app-prd \ --image=asia-northeast1-docker.pkg.dev/[project]/app/test-app:v1 \ --project [project]

Slide 10

Slide 10 text

デプロイ成功

Slide 11

Slide 11 text

It works $ curl -i https://test-app-prd-umssgbe34q-an.a.run.app/ HTTP/2 200 {"message":"Hello, World!"}

Slide 12

Slide 12 text

おわり

Slide 13

Slide 13 text

おわり

Slide 14

Slide 14 text

何が問題?

Slide 15

Slide 15 text

e.g. いろんな人がデプロイしたら gcloud run deloy… gcloud run deloy… gcloud run deloy… gcloud run deloy… gcloud run deloy…

Slide 16

Slide 16 text

e.g. オプションがどんどん複雑になったら...? $ gcloud run deploy test-app-prd \ --image=asia-northeast1-docker.pkg.dev/[project]/app/test-app:v1 \ --cpu=1 \ --memory=4G \ --concurrency=500 \ --port=8080 \ --set-secrets… \ --set-env=vars… \ --project [project] ...

Slide 17

Slide 17 text

e.g. あるいは特定の人しかできない 見守るだけ 見守るだけ

Slide 18

Slide 18 text

e.g. いきなり本番を破壊

Slide 19

Slide 19 text

ローカルから手続き的にデプロイし ていたものを、CI/CDで自動化し チームでデプロイできるようにしま す。 CI/CDが必要

Slide 20

Slide 20 text

今回のデモの設定ファイル https://github.com/sakajunquality/devfest-2023 にて公開(予定) スライド抜粋した設定のみ記載します ぜひいろいろ試してみてください

Slide 21

Slide 21 text

Cloud Deploy の実行について Cloud Deploy 自体の機能にフォーカスするため、Cloud Deploy へのリリース作成 などの自動化については割愛します。 GitHub の場合はこちらのactionを組み合わせると簡単にできます。 - https://github.com/google-github-actions/auth - https://github.com/google-github-actions/create-cloud-deploy-release https://cloud.google.com/blog/ja/products/devops-sre/using-github-actions- with-google-cloud-deploy?hl=ja なども参考に

Slide 22

Slide 22 text

apiVersion: serving.knative.dev/v1 kind: Service metadata: name: test-app-prd spec: template: spec: serviceAccountName: run-sa containers: - image: app ports: - name: http1 containerPort: 8080 resources: limits: cpu: 1000m memory: 256Mi Cloud Run サービスの定義 後ほど解説するのでここは雰囲気 だけで (Kubernetes に慣れてる方は Deployment と思ってください)

Slide 23

Slide 23 text

後ほど解説するのでここは雰囲気 だけで apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: test-app description: test-app application pipeline serialPipeline: stages: - targetId: prd-test-app profiles: [prd] --- apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prd-test-app description: Cloud Run production run: location: projects/[project]/locations/asia-northeast1 Cloud Deployの設定

Slide 24

Slide 24 text

どの設定ファイルをデプロイするか などを定義します apiVersion: skaffold/v3alpha1 kind: Config metadata: name: test-app profiles: - name: prd manifests: rawYaml: - service-prd.yaml deploy: cloudrun: {} Skaffold の設定

Slide 25

Slide 25 text

Pipeline作成

Slide 26

Slide 26 text

デプロイ開始!

Slide 27

Slide 27 text

デプロイ開始!

Slide 28

Slide 28 text

デプロイ完了

Slide 29

Slide 29 text

It works $ curl -i https://test-app-prd-umssgbe34q-an.a.run.app/ HTTP/2 200 {"message":"Hello, World!"}

Slide 30

Slide 30 text

Deliver continuously to Google Kubernetes Engine, Cloud Run, and Anthos. Cloud Deploy について

Slide 31

Slide 31 text

Google Cloud Deploy provides an opinionated on-ramp to GKE, Cloud Run, and Anthos via Skaffold. Leverage built-in best practices which keep pipelines durable by insulating them against changes. Google Cloud Deploy https://cloud.google.com/deploy?hl=en

Slide 32

Slide 32 text

Google Cloud Deploy provides an opinionated on-ramp to GKE, Cloud Run, and Anthos via Skaffold. Leverage built-in best practices which keep pipelines durable by insulating them against changes. Google Cloud Deploy https://cloud.google.com/deploy?hl=en

Slide 33

Slide 33 text

- Google Cloud のフルマネージドのCD - GKE や Cloud Run にデプロイが可能 - Skaffold を利用 - 宣言的にデプロイやパイプライン定義 Cloud Deploy

Slide 34

Slide 34 text

デプロイのためにUIが特化

Slide 35

Slide 35 text

Declarative v.s. Imperative 宣言的/命令的なデプロイ

Slide 36

Slide 36 text

命令的なデプロイ: Imperative Deploy - 手続き的に手順を羅列 - e.g. Cloud Build や GitHub Actions など - 単純にデプロイするだけなら1-2コマンドで解決 - e.g. gcloud run deploy --source … - 直感的でわかりやすく自由度が高い - 自由度が高い反面、カオスになる場合も

Slide 37

Slide 37 text

- 手順ではなく理想の状態 (Desired state) を定義 - Cloud Deployはこちら - yamlなどの設定が難しい(ように思える)反面、フレームワークに乗ってデプロイを することが可能 宣言的なデプロイ: Declarative Deploy

Slide 38

Slide 38 text

Cloud Deployの設定

Slide 39

Slide 39 text

概念や仕組みについて解説(使う前に一読しておくとよき) - https://cloud.google.com/deploy/docs/terminology - https://cloud.google.com/deploy/docs/architecture Cloud Deploy の概念やアーキテクチャ

Slide 40

Slide 40 text

- デプロイ対象の設定 - Cloud RunやKubernetesの定義 - e.g. https://cloud.google.com/run/docs/reference/yaml/v1 - skaffoldの設定 - 何をデプロイするか - Cloud Deployの設定 (DeliveryPipeline や Target) - どこにどうやってデプロイするか Cloud Deploy の設定

Slide 41

Slide 41 text

本番にいきなりリリースせず、社内 向けの環境としてstagingを用意しま す Serial Pipeline

Slide 42

Slide 42 text

apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: test-app description: test-app application pipeline serialPipeline: stages: - targetId: stg-test-app profiles: [stg] - targetId: prd-test-app profiles: [prd] ここが差分 prdの前にstgを追加 Cloud Deployの設定

Slide 43

Slide 43 text

Pipelineの更新 prd の前に stg ができてる

Slide 44

Slide 44 text

stgにデプロイ中

Slide 45

Slide 45 text

stgにデプロイ成功

Slide 46

Slide 46 text

prdにデプロイを進める Promoteでprdに進める

Slide 47

Slide 47 text

prdにデプロイを進める

Slide 48

Slide 48 text

prdにデプロイ中

Slide 49

Slide 49 text

prdにデプロイ完了

Slide 50

Slide 50 text

stg/prdのサービスができてる 簡易的に同じプロジェクトにデプロイしていますが、環境ごとにプロ ジェクトを分けることをおすすめします。

Slide 51

Slide 51 text

- prd(production) の前に stg (staging) 環境にデプロイするようなシリアルなパイプ ラインを構成することが可能 - パラレルに複数のターゲットにデプロイすることも可能(後述) - prdの前にstgに成功するといったことを強制力をもたせられる Serial Pipeline

Slide 52

Slide 52 text

人間はクリックすら忘れる!ので自 動化をしたい。 Automation

Slide 53

Slide 53 text

apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: test-app/promote description: Promotes a release to the next target suspended: false serviceAccount: sa selector: - target: id: "*" rules: - promoteRelease: name: "promote-release" toTargetId: "@next" 自動化も宣言的に設定 Cloud Deployの設定 次のステージに promoteする

Slide 54

Slide 54 text

先程のPipelineに新しくリリース

Slide 55

Slide 55 text

stgにデプロイ

Slide 56

Slide 56 text

stgが終わると自動でprdへ

Slide 57

Slide 57 text

自動化の履歴 設定した自動化が実際 に動いた

Slide 58

Slide 58 text

Automationの詳細

Slide 59

Slide 59 text

- リリースを自動化 - 現在対応しているのは、promoteとadvance - それぞれステージを次に進めるのと、canaryを次に進めます(後述) - https://cloud.google.com/deploy/docs/automation?hl=en - ブログでも紹介しています https://medium.com/sakajunlabs/automation-is-here-for-cloud-deploy-408b 33456fce Automation

Slide 60

Slide 60 text

とはいえ重要なサービスは人間がレ ビューしてからリリースさせたいケー スも Approve

Slide 61

Slide 61 text

Cloud Deployの設定 apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prd-test-app description: Cloud Run production requireApproval: true run: location: projects/[project]/locations/asia-northeast1 ここだけ

Slide 62

Slide 62 text

Pipeline に approval のステップが挟まる

Slide 63

Slide 63 text

同様にリリースし、stgにデプロイ

Slide 64

Slide 64 text

prdに進むもapproval待ちで止まる

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

内容を確認して承認 DeployとApprovalでIAM Roleが別れており権 限の分離が可能

Slide 67

Slide 67 text

Approve前に差分も確認できる

Slide 68

Slide 68 text

Approveでprdへデプロイ開始

Slide 69

Slide 69 text

テストもないのに自動化...?しないよ ね?リリース後の確認も自動化した いな? Verification

Slide 70

Slide 70 text

Cloud Deployの設定 apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: name: test-app description: test-app application pipeline serialPipeline: stages: - targetId: stg-test-app profiles: [stg] strategy: standard: verify: true verifyを有効化

Slide 71

Slide 71 text

Cloud Deployの設定 apiVersion: skaffold/v3alpha1 kind: Config metadata: name: test-app // 省略 deploy: cloudrun: {} verify: - name: verify container: name: verify image: ubuntu command: - echo - ok Verifyで何をするか 今回は ok と出力するのみ もし手元で試される場合は、 exit 1に変えてみてください

Slide 72

Slide 72 text

おなじみのPipeline

Slide 73

Slide 73 text

stgにデプロイしてから

Slide 74

Slide 74 text

prdにデプロイ

Slide 75

Slide 75 text

どちらも成功

Slide 76

Slide 76 text

Deploy後にVerifyのjobが動いている Verify の実行ログ (ここでは簡易的に echo okしいてるのみ) Verifyの実行

Slide 77

Slide 77 text

- デプロイが意図した挙動になっているか検証 - コンテナでスクリプトやコマンドを実行可能 - e.g. エンドポイントが正しいレスポンスを返しているか - https://cloud.google.com/deploy/docs/verify-deployment?hl=en Verification

Slide 78

Slide 78 text

新しい機能や大きな変更を全ユー ザーに提供すると問題があった場合 に影響が大きくなる可能性も。 Canary Deploy を利用して少しの割 合から徐々にリリースをしていきま す。 Canary Deploy

Slide 79

Slide 79 text

Cloud Deployの設定 apiVersion: deploy.cloud.google.com/v1 kind: DeliveryPipeline metadata: // 省略 - targetId: prd-test-app profiles: [prd] strategy: canary: runtimeConfig: cloudRun: automaticTrafficControl: true canaryDeployment: percentages: [25, 50, 75] verify: true カナリアの割合を指定

Slide 80

Slide 80 text

おなじみのpipeline

Slide 81

Slide 81 text

まずはstgにデプロイ

Slide 82

Slide 82 text

そしてprdへ (ただし25%)

Slide 83

Slide 83 text

prdで25%のトラフィックのみ新しいバージョンに

Slide 84

Slide 84 text

Cloud Deployの設定 apiVersion: deploy.cloud.google.com/v1 kind: Automation metadata: name: test-app/advance // 省略 rules: - advanceRollout: name: "advance-rollout-to-50" sourcePhases: ["canary-25"] wait: 1m - advanceRollout: name: "advance-rollout-to-75" sourcePhases: ["canary-50"] wait: 10m カナリアも自動化! 1分後に25%->50%へ (verifyが通れば) 10分後に75%へ

Slide 85

Slide 85 text

Automationで75%まで

Slide 86

Slide 86 text

最後は手動で(自動化もできます)

Slide 87

Slide 87 text

確認が出ます

Slide 88

Slide 88 text

prd 100% デプロイ中

Slide 89

Slide 89 text

prdで100%トラフィックを切り替え完了

Slide 90

Slide 90 text

- 一般的なCanary Deploy(カナリアデプロイ)を提供 - Cloud Runは組み込みのTraffic Split機能ベースで - GKEの場合コンテナの数またはGateway APIを利用したトラフィックベース - https://cloud.google.com/deploy/docs/deployment-strategies/canary?hl=en Canary Deployについて

Slide 91

Slide 91 text

サービスがスケールして海外リー ジョンにもサービスを展開 Parallel Deploy

Slide 92

Slide 92 text

Cloud Deployの設定 apiVersion: deploy.cloud.google.com/v1 kind: Target metadata: name: prd-all-test-app description: deploy to the prod all regions multiTarget: targetIds: [prd-test-app, prd-us-test-app] 複数のターゲットにデプロイ

Slide 93

Slide 93 text

Pipeline の見た目が少し変わって

Slide 94

Slide 94 text

複数リージョンにデプロイされている 内部ではそれぞれのTargetに向けたデプロイ

Slide 95

Slide 95 text

- 複数のターゲットにデプロイ - e.g. 別リージョンのCloud Runや複数の GKE クラスター - Deploy parameterを利用することで環境差を吸収することも - https://cloud.google.com/deploy/docs/parallel?hl=en Parallel Deploy

Slide 96

Slide 96 text

まとめ

Slide 97

Slide 97 text

まとめ 安全なデプロイ 各プラットフォームは開発者体験を重視しており、デプロイするだけなら簡単にデプロ イが可能になっている。 一方でチームで安全に継続的に行えるようにするようにするにはしっかりと仕組みを 作っていく必要がある。

Slide 98

Slide 98 text

まとめ Cloud Deploy Cloud Deploy は Cloud Run や GKE へのフルマネージドのデプロイ パイプラインを 構築することが可能。 専用のUIやデプロイの仕組みが統一されるだけではなく、canaryやverificationと いったデプロイ戦略を高めたり automation のように自動化をする機能が充実してい る。

Slide 99

Slide 99 text

Thank You! Jun Sakata Google Developers Expert, Cloud @sakajunquality