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

46fdd2ebc85d68659b83d5eb5c6a49aa?s=47 Keke
July 30, 2020

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

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

46fdd2ebc85d68659b83d5eb5c6a49aa?s=128

Keke

July 30, 2020
Tweet

Transcript

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

    山下慶将(Twitter: @_k_e_k_e)
  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...
  3. 3 後ほど資料は公開します!

  4. 4 今日話す内容

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

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

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

  8. 8 そもそも継続的デリバリー(CD)って? Developers Feedback Container Registry GKE Cluster Artifacts Trigger

    Deploy 継続的インテグレーション(CI)によってできた成果物を継続的に、より高速にデプロイ をするための仕組み
  9. 9 そもそも継続的インテグレーション(CI)って? GitHub Developers PR & Review Unit Test Integration

    Test Build Code Analysis Continuous Integration Trigger Feedback コードの変更を行うと、自動的にユニットテスト・結合テスト・ビルド・コード解析などが 行われ、Developerにその結果がフィードバックされる仕組み
  10. 10 1つのGoogle Kubernetes Engineクラスタの 中にマイクロサービスがある メルカリにおけるクラウド運用

  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
  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
  13. 13 継続的デリバリー Item Item Listing DB Team C User DB

    Team E Item DB Team B Shipping DB Team D Timeline DB Team A
  14. 14 02 Spinnakerによる継続的デリバリー

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    V2 Load Balancer ❌ ❌ ❌ ❌
  33. 33 Rolling Update V1 V1 V1 V1 Load Balancer

  34. 34 Rolling Update V1 V1 V1 V2 Load Balancer

  35. 35 Rolling Update V1 V1 V2 Load Balancer V2

  36. 36 Rolling Update V1 V2 Load Balancer V2 V2

  37. 37 Rolling Update V2 V2 V2 V2 Load Balancer

  38. 38 Rolling Update V1 V2 Load Balancer V2 V2 ❌

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

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

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

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

  43. 43 Canary Deploy V2 V2 V2 V2 Load Balancer

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

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

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

    Deploy デプロイの速度 早い 遅い 安全性 低い 高い ユースケースに応じて、デプロイ手法を選択する
  47. 47 リリースフロー アプリケーションのリリース・デプロイ時にはいくつもリスクがある。 • デプロイが失敗する • 意図しないデプロイをしてしまう

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

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

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

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

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

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


    
 
 +

  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デプロイ ❌ リリースフローに 沿わないデプロイ ❌ 雑なデプロイ
  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デプロイ ❌ リリースフローに 沿わないデプロイ ❌ 雑なデプロイ それぞれのマイクロサービスにデプロイ手法が委ねられていると ”デプロイの質” にも差が生じ、サービス全体の質へ影響する
  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を使う
  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で定義可能
  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を管理することができる。
  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
  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 デプロイ先を変更
  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 デプロイ先を変更
  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
  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 ベストプラクティスを追加 ✅
  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 ベストプラクティスを追加 ✅ ✅ ✅ ✅
  65. 65 Immutable機能 Managed Pipelineは、Pipeline Configurationで渡せる情報以外は変更することができない。 DeveloperがPipelineを改変したり、誤った設定することを防ぐことができる。 Pipeline自体は変更できない

  66. 66 Service Team Configure Application Configuration機能 Pipeline Configurations Spinnaker Managed

    Pipeline containerPort: 8000 Managed Pipeline Template “containerPort”: 8000 各マイクロサービスに依存する設定値だけは Pipeline生成時に設定をすることができる。
  67. 67 Configuration機能 変更できるのはMPTで定義された変数のみ 設定値だけはMutableで後からでもDeveloperが変更することができる。 しかし、基本的なPipeline自体はImmutableである。

  68. 68 Spinnaker Managed Pipeline 主要な機能 ・Sync機能 Platform TeamはMPTを管理するだけど全マイクロサービスのデプロイを管理することできる ・Immutable機能 PipelineをDeveloperに変更されて、壊されるリスクもない

    ・Configuration機能 必要な部分だけDeveloperに設定してもらえる マイクロサービスに必要な最小限の設定だけを公開して、あとから変更されることもなく、全マイクロサービス のデプロイの標準化・管理することができ る。
  69. 69 パイプラインのベストプラクティス Spinnakerではパイプラインを作ることによってデプロイをするが、問題 点がある。 1. マイクロサービスごとのデプロイの質の担保 2. Snowflakeパイプライン

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

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

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

  73. 73 Spinnaker Managed Pipeline Managed PipelineはSpinnakerのAPI経由で作成をすることができる Managed Pipeline Template(JSON) JSON

    Pipeline Configurations(JSON) JSON Managed Pipeline = + ・変数を定義 ・どのMPTを使うか指定 ・変数を値を定義 Platform Team
  74. 74 Spinnaker Managed Pipeline パイプラインをコード管理する ”Pipeline as Code”。 • コストの削減

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

  76. 76 まとめ マイクロサービスの継続的デリバリーの中で、 Spinnakerが実装しているデプロイ手法を使うことによって、よ り安全なリリースフローを設計することができる。 SpinnakerのManaged Pipelineという機能をつかうことによって、マイクロサービスのデプロイの質の担保を することができる。Managed Pipelineの中でも”Pipeline as

    Code”のプラクティスもメリットが多い。パイプラ インをコード管理をすることによって管理のしやすく、リスクを低減できる。 Spinnakerという継続的デリバリープラットフォームの多くの機能を使うことによって、よりアプリケーションのリ リースフローが安全で、開発効率などを上げることが出来るようになると思います。
  77. 77 Thank you!