Slide 1

Slide 1 text

1 Spinnakerで実践するマイクロサービスの 安全なリリースフローとベストプラクティス Cloud Operators Days Tokyo 2020 7/30 11:00~11:40 山下慶将(Twitter: @_k_e_k_e)

Slide 2

Slide 2 text

2 自己紹介 Keisuke Yamashita(@_k_e_k_e) Merpay SRE ・Microservices Platform CI/CD Team Like Kubernetes, Hashicorp Products(Terraform, Vault) Spinnaker , Open Policy Agent, CircleCI, GitHub Actions, Istio, Envoy, etc...

Slide 3

Slide 3 text

3 後ほど資料は公開します!

Slide 4

Slide 4 text

4 今日話す内容

Slide 5

Slide 5 text

5 Spinnakerを使ってマイクロサービスを 安全にデプロイするためのTips

Slide 6

Slide 6 text

6 アジェンダ 01 メルカリにおける継続的デリバリー 02 Spinnakerについて 03 安全なリリースフローとベストプラクティス 04 まとめ

Slide 7

Slide 7 text

7 01 メルカリにおける継続的デリバリー

Slide 8

Slide 8 text

8 そもそも継続的デリバリー(CD)って? Developers Feedback Container Registry GKE Cluster Artifacts Trigger Deploy 継続的インテグレーション(CI)によってできた成果物を継続的に、より高速にデプロイ をするための仕組み

Slide 9

Slide 9 text

9 そもそも継続的インテグレーション(CI)って? GitHub Developers PR & Review Unit Test Integration Test Build Code Analysis Continuous Integration Trigger Feedback コードの変更を行うと、自動的にユニットテスト・結合テスト・ビルド・コード解析などが 行われ、Developerにその結果がフィードバックされる仕組み

Slide 10

Slide 10 text

10 1つのGoogle Kubernetes Engineクラスタの 中にマイクロサービスがある メルカリにおけるクラウド運用

Slide 11

Slide 11 text

11 マイクロサービスアーキテクチャ Nodes Microservice B Namespace B Microservice B Microservice B Microservice B Microservice C Namespace C Microservice C Microservice C Microservice A Namespace A Service A Team Service B Team Service C Team RBAC RBAC RBAC

Slide 12

Slide 12 text

12 継続的デリバリー Service A Team Service B Team Service C Team Service C Application Service A Application Service B Application Trigger Trigger Trigger Microservice A Namespace A Microservice B Namespace B Microservice C Namespace C Deploy Deploy Deploy

Slide 13

Slide 13 text

13 継続的デリバリー Item Item Listing DB Team C User DB Team E Item DB Team B Shipping DB Team D Timeline DB Team A

Slide 14

Slide 14 text

14 02 Spinnakerによる継続的デリバリー

Slide 15

Slide 15 text

15 継続的デリバリー Service A Team Service B Team Service C Team Service C Application Service A Application Service B Application Trigger Trigger Trigger Microservice A Namespace A Microservice B Namespace B Microservice C Namespace C Deploy Deploy Deploy

Slide 16

Slide 16 text

16 Spinnaker ・NetflixやGoogleなどが開発するOSSな継続的デリバリープ ラットフォーム ・アプリケーションを自動デプロイするために必要な機能が実装 されている ・マルチクラウドに対応していて、様々なプラットフォームで使う ことができる

Slide 17

Slide 17 text

17 Spinnakerの機能 ① Kubernetesのサポート Service Team Application Trigger Deploy(kubectl)

Slide 18

Slide 18 text

18 Spinnakerの機能 ① Kubernetesのサポート Container Registry GKE Cluster Pull Deploy Kubernetes Resource Repository Pull

Slide 19

Slide 19 text

19 Spinnakerの機能 ② GUIでパイプラインを作成できる

Slide 20

Slide 20 text

20 Spinnakerの機能 ③ プラガブルなCDプラットフォーム Bake Monitoring Notification Storage Triggers Runtime

Slide 21

Slide 21 text

21 Spinnakerの機能 ④ いろんなデプロイ手法に対応 ● Red/Black Deploy ● Rolling update ● Canary Deploy

Slide 22

Slide 22 text

22 03 安全なリリースフローとベストプラクティス

Slide 23

Slide 23 text

23 リリースフロー アプリケーションのリリース・デプロイ時にはいくつもリスクがある。 ● デプロイが失敗する ● 意図しないデプロイをしてしまう

Slide 24

Slide 24 text

24 デプロイが失敗する 安全にデプロイをするためのデプロイ手法が考える必要がある。 Spinnakerでは以下のデプロイ手法をサポートしている。 ● Red/Black Deploy ● Rolling Update ● Canary Deploy

Slide 25

Slide 25 text

25 Red/Black Deploy ユースケース:瞬時に新しいバージョンへ切り替える。

Slide 26

Slide 26 text

26 Red/Black Deploy V1 V1 V1 V1 Load Balancer

Slide 27

Slide 27 text

27 Red/Black Deploy V1 V1 V1 V1 V2 V2 V2 V2 Load Balancer

Slide 28

Slide 28 text

28 Red/Black Deploy V1 V1 V1 V1 V2 V2 V2 V2 Load Balancer

Slide 29

Slide 29 text

29 Red/Black Deploy V2 V2 V2 V2 Load Balancer

Slide 30

Slide 30 text

30 Rolling Update ユースケース: 段階的に新しいバージョンへ移行をする Red/Black Deployは一発で新しいバージョンへ切り替えるため、失敗 のリスクが大きかったです。

Slide 31

Slide 31 text

31 Red/Black Deployの懸念点 V1 V1 V1 V1 V2 V2 V2 V2 Load Balancer

Slide 32

Slide 32 text

32 Red/Black Deployの懸念点 V1 V1 V1 V1 V2 V2 V2 V2 Load Balancer ❌ ❌ ❌ ❌

Slide 33

Slide 33 text

33 Rolling Update V1 V1 V1 V1 Load Balancer

Slide 34

Slide 34 text

34 Rolling Update V1 V1 V1 V2 Load Balancer

Slide 35

Slide 35 text

35 Rolling Update V1 V1 V2 Load Balancer V2

Slide 36

Slide 36 text

36 Rolling Update V1 V2 Load Balancer V2 V2

Slide 37

Slide 37 text

37 Rolling Update V2 V2 V2 V2 Load Balancer

Slide 38

Slide 38 text

38 Rolling Update V1 V2 Load Balancer V2 V2 ❌

Slide 39

Slide 39 text

39 Rolling Update V1 V1 V1 V1 Load Balancer Rollbackをすることができる

Slide 40

Slide 40 text

40 Canary Deploy ユースケース: 実際のトラフィックで新しいバージョンを検証しつつ、段階 的に移行したいとき

Slide 41

Slide 41 text

41 Canary Deploy V1 V1 V2 Load Balancer V2 一部のトラフィック

Slide 42

Slide 42 text

42 Canary Deploy V1 V1 V2 Load Balancer V2 一部のトラフィック ✅

Slide 43

Slide 43 text

43 Canary Deploy V2 V2 V2 V2 Load Balancer

Slide 44

Slide 44 text

44 デプロイが失敗する ● Red/Black Deploy ● Rolling update ● Canary Deploy

Slide 45

Slide 45 text

45 デプロイが失敗する ● Red/Black Deploy ● Rolling update ● Canary Deploy デプロイの速度 早い 遅い 安全性 低い 高い

Slide 46

Slide 46 text

46 デプロイが失敗する ● Red/Black Deploy ● Rolling update ● Canary Deploy デプロイの速度 早い 遅い 安全性 低い 高い ユースケースに応じて、デプロイ手法を選択する

Slide 47

Slide 47 text

47 リリースフロー アプリケーションのリリース・デプロイ時にはいくつもリスクがある。 ● デプロイが失敗する ● 意図しないデプロイをしてしまう

Slide 48

Slide 48 text

48 意図しないデプロイをしてしまう CI/CDは自動トリガーを設定することが多い。 完全に信頼していいのかは別問題。 Container Registry GKE Cluster Trigger Deploy

Slide 49

Slide 49 text

49 意図しないデプロイをしてしまう Manual Judgmentという承認ステップを設ける。

Slide 50

Slide 50 text

50 意図しないデプロイをしてしまう Manual Judgmentという承認ステップを設ける。 Production環境では必須にする、Development環境では無し

Slide 51

Slide 51 text

51 リリースフローのまとめ アプリケーションのリリース・デプロイ時にはいくつもリスクがあるが Spinnakerの機能を使うことによって、安全にリリースフローを設計でき るようになる。 1. デプロイ手法を選定することによって、リスクの低いデプロイを行うこ とができる。 2. Manual Judgmentによって、意図しないデプロイを未然に防ぐこ とができる

Slide 52

Slide 52 text

52 パイプラインのベストプラクティス Spinnakerではパイプラインを作ることによってデプロイをするがいくつ か問題点がある。 1. マイクロサービスごとのデプロイの質の担保

Slide 53

Slide 53 text

53 パイプラインのベストプラクティス Microservice A Team A マイクロサービスアーキテクチャは各マイクロサービスが 自律的に開発サイクルを回していく という理念に根 ざしている。
 
 
 +


Slide 54

Slide 54 text

54 パイプラインのベストプラクティス Item Item Listing DB Team C User DB Team E Item DB Team B Shipping DB Team D Timeline DB Team A ✅ カナリアデプロイ ✅ Red/Blackデプロイ ✅ Red/Blackデプロイ ❌ リリースフローに 沿わないデプロイ ❌ 雑なデプロイ

Slide 55

Slide 55 text

55 パイプラインのベストプラクティス Item Item Listing DB Team C User DB Team E Item DB Team B Shipping DB Team D Timeline DB Team A ✅ カナリアデプロイ ✅ Red/Blackデプロイ ✅ Red/Blackデプロイ ❌ リリースフローに 沿わないデプロイ ❌ 雑なデプロイ それぞれのマイクロサービスにデプロイ手法が委ねられていると ”デプロイの質” にも差が生じ、サービス全体の質へ影響する

Slide 56

Slide 56 text

56 パイプラインのベストプラクティス Item Item Listing DB Team C User DB Team E Item DB Team B Shipping DB Team D Timeline DB Team A ✅ カナリアデプロイ ✅ Red/Blackデプロイ ✅ Red/Blackデプロイ ❌ リリースフローに 沿わないデプロイ ❌ 雑なデプロイ それぞれのマイクロサービスにデプロイ手法が委ねられていると ”デプロイの質” にも差が生じ、サービス全体の質へ影響する → Spinnaker Manage Pipelineを使う

Slide 57

Slide 57 text

57 Spinnaker Managed Pipeline Managed Pipelineとは、Managed Pipelineの雛形になるManaged Pipeline Template(MPT)に設定情報 であるPipeline Configurationsを渡してできるPipelineのこと Managed Pipeline Template(JSON) JSON Pipeline Configurations JSON Managed Pipeline = + ・変数を定義 ・どのMPTを使うか指定 ・変数を値を定義 ・GUIで定義可能

Slide 58

Slide 58 text

58 Spinnaker Managed Pipeline 主要な機能 ・Sync機能: MPTが更新すると、そのMPTから生成された全てのPipelineも同時に変更できる。 想定ユースケース : Platform Teamが各マイクロサービスのデプロイ手法を更新したい ・Immutable機能: Managed Pipelineは直接、変更をすることができない。 ・Configuration機能: 必要な部分だけMPTの一部を変数化をして、Managed Pipelineを生成時に Pipeline Configurationsとして設定できる。 (変数はImmutableではなく、いつでも変更できる ) Managed Pipelineを使えば、Managed Pipeline Templateを管理するだけで横断的に 全マイクロサービスのPipelineを管理することができる。

Slide 59

Slide 59 text

59 Service A Team Service B Team Service C Team Configure Configure Configure Managed Pipeline Application A Application B Sync機能 Managed Pipeline Template Pipeline Configurations Pipeline Configurations Pipeline Configurations Spinnaker Application C Managed Pipeline Managed Pipeline

Slide 60

Slide 60 text

60 Service A Team Service B Team Service C Team Configure Configure Configure Managed Pipeline Application A Application B Sync機能 Managed Pipeline Template Pipeline Configurations Pipeline Configurations Pipeline Configurations Spinnaker Application C Managed Pipeline Managed Pipeline V2 Platform Team デプロイ先を変更

Slide 61

Slide 61 text

61 Service A Team Service B Team Service C Team Configure Configure Configure Managed Pipeline Application A Application B Sync機能 Managed Pipeline Template Pipeline Configurations Pipeline Configurations Pipeline Configurations Spinnaker Application C Managed Pipeline Managed Pipeline V2 V2 V2 V2 Platform Team デプロイ先を変更

Slide 62

Slide 62 text

62 Service A Team Service B Team Service C Team Configure Configure Configure Managed Pipeline Application A Application B Sync機能 Managed Pipeline Template Pipeline Configurations Pipeline Configurations Pipeline Configurations Spinnaker Application C Managed Pipeline Managed Pipeline

Slide 63

Slide 63 text

63 Service A Team Service B Team Service C Team Configure Configure Configure Managed Pipeline Application A Application B Sync機能 Managed Pipeline Template Pipeline Configurations Pipeline Configurations Pipeline Configurations Spinnaker Application C Managed Pipeline Managed Pipeline Platform Team ベストプラクティスを追加 ✅

Slide 64

Slide 64 text

64 Service A Team Service B Team Service C Team Configure Configure Configure Managed Pipeline Application A Application B Sync機能 Managed Pipeline Template Pipeline Configurations Pipeline Configurations Pipeline Configurations Spinnaker Application C Managed Pipeline Managed Pipeline Platform Team ベストプラクティスを追加 ✅ ✅ ✅ ✅

Slide 65

Slide 65 text

65 Immutable機能 Managed Pipelineは、Pipeline Configurationで渡せる情報以外は変更することができない。 DeveloperがPipelineを改変したり、誤った設定することを防ぐことができる。 Pipeline自体は変更できない

Slide 66

Slide 66 text

66 Service Team Configure Application Configuration機能 Pipeline Configurations Spinnaker Managed Pipeline containerPort: 8000 Managed Pipeline Template “containerPort”: 8000 各マイクロサービスに依存する設定値だけは Pipeline生成時に設定をすることができる。

Slide 67

Slide 67 text

67 Configuration機能 変更できるのはMPTで定義された変数のみ 設定値だけはMutableで後からでもDeveloperが変更することができる。 しかし、基本的なPipeline自体はImmutableである。

Slide 68

Slide 68 text

68 Spinnaker Managed Pipeline 主要な機能 ・Sync機能 Platform TeamはMPTを管理するだけど全マイクロサービスのデプロイを管理することできる ・Immutable機能 PipelineをDeveloperに変更されて、壊されるリスクもない ・Configuration機能 必要な部分だけDeveloperに設定してもらえる マイクロサービスに必要な最小限の設定だけを公開して、あとから変更されることもなく、全マイクロサービス のデプロイの標準化・管理することができ る。

Slide 69

Slide 69 text

69 パイプラインのベストプラクティス Spinnakerではパイプラインを作ることによってデプロイをするが、問題 点がある。 1. マイクロサービスごとのデプロイの質の担保 2. Snowflakeパイプライン

Slide 70

Slide 70 text

70 パイプラインのベストプラクティス GUIで変数を設定する GUIでぽちぽちパイプラインを作成すると管理が難しい。

Slide 71

Slide 71 text

71 パイプラインのベストプラクティス

Slide 72

Slide 72 text

72 パイプラインのベストプラクティス GUIで設定することによるリスク(人為的ミスなど)

Slide 73

Slide 73 text

73 Spinnaker Managed Pipeline Managed PipelineはSpinnakerのAPI経由で作成をすることができる Managed Pipeline Template(JSON) JSON Pipeline Configurations(JSON) JSON Managed Pipeline = + ・変数を定義 ・どのMPTを使うか指定 ・変数を値を定義 Platform Team

Slide 74

Slide 74 text

74 Spinnaker Managed Pipeline パイプラインをコード管理する ”Pipeline as Code”。 ● コストの削減 ○ 自動化によって、作業工数をへらすことができる ● スピードの向上 ○ 自動化・効率化しやすくなって、開発がより高速になる ● リスクを低減 ○ 同じコードをかけば誰がやっても同じ結果になる。 Snowflakeパイプラインを防ぐことができる。属 人性もなくなる。 ● 管理のしやすさ ○ 実際のリソースではなく、コードを管理するだけで済むので楽

Slide 75

Slide 75 text

75 04 まとめ

Slide 76

Slide 76 text

76 まとめ マイクロサービスの継続的デリバリーの中で、 Spinnakerが実装しているデプロイ手法を使うことによって、よ り安全なリリースフローを設計することができる。 SpinnakerのManaged Pipelineという機能をつかうことによって、マイクロサービスのデプロイの質の担保を することができる。Managed Pipelineの中でも”Pipeline as Code”のプラクティスもメリットが多い。パイプラ インをコード管理をすることによって管理のしやすく、リスクを低減できる。 Spinnakerという継続的デリバリープラットフォームの多くの機能を使うことによって、よりアプリケーションのリ リースフローが安全で、開発効率などを上げることが出来るようになると思います。

Slide 77

Slide 77 text

77 Thank you!