$30 off During Our Annual Pro Sale. View Details »

Spinnakerで実践するマイクロサービスの 安全なリリースフローとベストプラクティス

Keke
July 30, 2020

Spinnakerで実践するマイクロサービスの 安全なリリースフローとベストプラクティス

Cloud Operators Days Tokyo 2020
7/30 11:00~11:40

Keke

July 30, 2020
Tweet

More Decks by Keke

Other Decks in Technology

Transcript

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

    View Slide

  2. 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...

    View Slide

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

    View Slide

  4. 4
    今日話す内容

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  11. 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

    View Slide

  12. 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

    View Slide

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

    View Slide

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

    View Slide

  15. 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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  26. 26
    Red/Black Deploy
    V1 V1
    V1 V1
    Load Balancer

    View Slide

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

    View Slide

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

    View Slide

  29. 29
    Red/Black Deploy
    V2 V2
    V2 V2
    Load Balancer

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  33. 33
    Rolling Update
    V1 V1
    V1 V1
    Load Balancer

    View Slide

  34. 34
    Rolling Update
    V1
    V1 V1
    V2
    Load Balancer

    View Slide

  35. 35
    Rolling Update
    V1
    V1
    V2
    Load Balancer
    V2

    View Slide

  36. 36
    Rolling Update
    V1 V2
    Load Balancer
    V2 V2

    View Slide

  37. 37
    Rolling Update
    V2 V2
    V2 V2
    Load Balancer

    View Slide

  38. 38
    Rolling Update
    V1 V2
    Load Balancer
    V2 V2

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  43. 43
    Canary Deploy
    V2 V2
    V2 V2
    Load Balancer

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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



    +


    View Slide

  54. 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デプロイ
    ❌ リリースフローに
    沿わないデプロイ
    ❌ 雑なデプロイ

    View Slide

  55. 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デプロイ
    ❌ リリースフローに
    沿わないデプロイ
    ❌ 雑なデプロイ
    それぞれのマイクロサービスにデプロイ手法が委ねられていると
    ”デプロイの質” にも差が生じ、サービス全体の質へ影響する

    View Slide

  56. 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を使う

    View Slide

  57. 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で定義可能

    View Slide

  58. 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を管理することができる。

    View Slide

  59. 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

    View Slide

  60. 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
    デプロイ先を変更

    View Slide

  61. 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
    デプロイ先を変更

    View Slide

  62. 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

    View Slide

  63. 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
    ベストプラクティスを追加

    View Slide

  64. 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
    ベストプラクティスを追加




    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  75. 75
    04 まとめ

    View Slide

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

    View Slide

  77. 77
    Thank you!

    View Slide