Open Policy AgentとSpinnakerで実現するマイクロサービスの安全な継続的デリバリー

46fdd2ebc85d68659b83d5eb5c6a49aa?s=47 Keke
June 13, 2020

Open Policy AgentとSpinnakerで実現するマイクロサービスの安全な継続的デリバリー

KubeFest Tokyo 2020 Track1 15:35~16:10

46fdd2ebc85d68659b83d5eb5c6a49aa?s=128

Keke

June 13, 2020
Tweet

Transcript

  1. 1 Open Policy AgentとSpinnakerで実現する マイクロサービスの安全な継続的デリバリー Merpay SRE ・Microservices Platform CI/CD

    Team Keisuke Yamashita(@_k_e_k_e) KubeFest Tokyo 2020 Track1 15:35~16:10 2020/06/13
  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 Agenda

  5. 5 Agenda 01 • Mercari’s Microservices Architecture 02 03 •

    Mercari’s CI/CD • Problems with Microservices Architecture CI/CD 04 • Open Policy AgentとSpinnaker 05 • Wrap up
  6. 6 Goal

  7. 7 マイクロサービスの継続的デリバリーの 横断的な向上が出来るようになること

  8. 8 01 Mercari’s Microservice Architecture

  9. 9 Mercari’s Microservice Architecture それぞれのマイクロサービスは... • Kubernetes Namespace • GCP

    Project • Spinnaker Application を持ちます
  10. 10 1つのGKEクラスタの中にすべてのマイクロサービスがある Mercari’s Microservice Architecture

  11. 11 Nodes Mercari’s Microservice Architecture 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 Mercari’s Microservice Architecture Project C Project A Service A

    Team Service B Team Service C Team IAM IAM IAM Project B
  13. 13 02 Mercari’s CI/CD

  14. 14 Mercari’s CI/CD MercariのCIの対象は、以下の2つに分けられる。 Application サービスのそれぞれのGitHubリポジトリで管理されているアプリケーションサー バーなどのコード。 Kubernetes Manifests KubernetesのDeploymentやJobなどのManifest

    file。 中央的なリポジトリで管理されている。
  15. 15 Application CI Service A Team Service B Team Service

    C Team Service A Repository Service B Repository Service C Repository PR & Review PR & Review PR & Review Circle CI Cloud Build Container Registry Project A Cloud Build Container Registry Project B Cloud Build Container Registry Project C
  16. 16 Kubernetes Resource Repository PR & Review Service B Team

    Service A Team Service C Team PR & Review PR & Review Kubernetes Manifest CI
  17. 17 Kubernetes Manifest CI

  18. 18 Mercari’s CD Container Registry GKE Cluster Pull Deploy CDプラットフォームであるSpinnakerを使って、Google

    Container RegistryにあるDocker ImageとGitHubにあ るKubernetes Manifestを参照し、GKEクラスタにデプロイをしている 
 
 
 Kubernetes Resource Repository Pull
  19. 19 Mercari’s CD 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
  20. 20 Spinnaker

  21. 21 03 Problems with Microservices Architecture CI/CD

  22. 22 Problems with Microservices Architecture CI/CD Microservice A DB Team

    A マイクロサービスアーキテクチャは各マイクロサービスが 自律的に開発サイクルを回していく という理念に根 ざしている。
 
 
 +

  23. 23 Problems with Microservices Architecture CI/CD すべてのマイクロサービスが同じレベルで、全てのことを 同じようにできるわけではなく サービス全体の質の担保が難しくなる 。

    例1: Kubernetes Manifestの設定 ・Labelはマイクロサービスの名前と一致しているか ・Memory Limitが10GB以下に設定されているのか などのルールが守られていることを保証することは難しい。 
 
 

  24. 24 Platform Team Kubernetes Resource Repository PR & Review Service

    B Team Service A Team Service C Team PR & Review PR & Review Problems with Microservices Architecture CI/CD Pull Review ✅ ✅
  25. 25 Problems with Microservices Architecture CI/CD CPU limitsが 高い latestタグを

    使っている 記述的に間違っているわけではないので、このままでもApplyはできる 
 Namespaceが サービスの名前に 合っていない
  26. 26 Problems with Microservices Architecture CI/CD すべてのマイクロサービスが同じレベルで、全てのことを同じようにできるわけではなく サービス全体の質の担保が難しくなる 。 例1:

    Kubernetes Manifestの設定 ・Labelはマイクロサービスの名前と一致しているか ・Memory Limitが10GB以下に設定されているのか などのルールが守られていることを保証することは難しい。 例2: デプロイ ・手法(カナリア、Blue-Green、ハイランダーなど)差異 ・デプロイ先の設定(Namespace、クラスタなど)
 
 

  27. 27 Problems with Microservices Architecture CI/CD Item Item Listing DB

    Team C User DB Team E Item DB Team B Shipping DB Team D Timeline DB Team A ✅ カナリアデプロイ ✅ Blue-Greenデプロイ ✅ Blue-Greenデプロイ ❌ リリースフローに 沿わないデプロイ ❌ 雑なデプロイ
  28. 28 Problems with Microservices Architecture CI/CD Item Item Listing DB

    Team C User DB Team E Item DB Team B Shipping DB Team D Timeline DB Team A ✅ カナリアデプロイ ✅ Blue-Greenデプロイ ✅ Blue-Greenデプロイ ❌ 雑なデプロイ それぞれのマイクロサービスにデプロイ手法が委ねられていると ”デプロイの質” にも差が生じ、サービス全体の質へ影響する ❌ リリースフローに 沿わないデプロイ
  29. 29 マイクロサービスアーキテクチャと サービス全体の質の保守・向上するを目指すことは そもそも相性が悪い

  30. 30 2019 2020 2018 2017 マイクロサービスの数は増えていく... マイクロサービスの数

  31. 31 2019 2020 2018 2017 サービス全体の質は落ちていく...? サービス全体の質

  32. 32 No ! We are Microservice Platform Team

  33. 33 Problem & Solution マイクロサービスが、ルール違反するリソースをApplyする可能性があり、サービス 全体の質が落ちてしまっている 解決策 • Developerが行うCI/CDの中で検証し、Applyを防ぐ仕組み •

    CircleCIやSpinnakerがApplyするリソースに限らず、クラスタの上の全ての リソースがルール違反していないことを保証する仕組み • ルールを定義して、運用をしている仕組み
  34. 34 Problem & Solution マイクロサービスが、ルール違反するリソースをApplyする可能性があり、サービス 全体の質が落ちてしまっている 解決策 • Developerが行うCI/CDの中で検証し、Applyを防ぐ仕組み •

    CircleCIやSpinnakerがApplyするリソースに限らず、クラスタの上の全ての リソースがルール違反していないことを保証する仕組み • ルールを定義して、運用をしている仕組み Open Policy Agent(OPA)の導入
  35. 35 Open Policy Agent

  36. 36 Open Policy Agent(OPA) OSSの汎用なポリシーエンジン。Regoというポリシー記述言語によって ポリシーを定義して入力データの検証 (ジャッジ)を行う。 よくあるユースケース ・Deploymentに特定のLabelがあることを強制する ・DeploymentやJobのDocker

    Image Tagがlatestを使わないことを強制する など 
 
 
 https://www.openpolicyagent.org/docs/latest/

  37. 37 Policy as Codeとは、組織のルール(Policy)をコードで管理をすること。 Policyをもとに、Kubernetes Manifestなどの入力データを検証する。 メリット • Policyを明文化できる •

    Policyをコードベースで運用・開発ができる • 誰が見ても理解できる・検証できる など Policy as Code OPA YAML 検証 Policy
  38. 38 Policies in CI/CD Service A Team Service B Team

    Service C Team Service A Application Trigger Deploy(kubectl) Deploy YAML YAML Deploy(kubectl)
  39. 39 Policies in CI/CD Service A Team Service B Team

    Service C Team Service A Application Trigger Deploy(kubectl) Deploy YAML YAML Deploy(kubectl) Conftest Gatekeeper
  40. 40 Conftest 入力データをRegoで書いたポリシーで検証する CLIツール。CI上で使われることを想定している。 Apply前にManifestを検証することによって素早い Feedbackを得ることができる。 conftest Policy(.Rego) YAML JSON

    XML 検証 Violation Warning Success
  41. 41 Kubernetes Resource Repository PR & Review Service B Team

    Service A Team Service C Team PR & Review PR & Review Conftest in CI Trigger Circle CI Policies(.Rego) Platform Team Maintain ✅ ✅ Conftest validation
  42. 42 Kubernetes Resource Repository PR & Review Service B Team

    Service A Team Service C Team PR & Review PR & Review Conftest in CI Trigger Circle CI Policies(.Rego) Platform Team Maintain ✗ Conftest validation
  43. 43 Kubernetes Resource Repository PR & Review Service B Team

    Service A Team Service C Team PR & Review PR & Review Conftest in CI Trigger Circle CI Policies(.Rego) Platform Team Maintain ✗ Conftest Warning ✅ Best Pracitise is … Please ...
  44. 44 Kubernetes Resource Repository PR & Review Service B Team

    Service A Team Service C Team PR & Review PR & Review Conftest in CI Trigger Circle CI Policies(.Rego) Platform Team Maintain ✅ ✅ Conftest validation ローカル環境でも検証できるので素早く フィードバックを得ることが出来る
  45. 45 Gatekeeper OPAをKubernetesのAdmission Controllerとして使えるようにしたもの。現在はv3である。 
 
 
 Developers kubectl apply

    Kubernetes API HTTP ハンドラ Authn / Authz Mutating admission スキーマ バリデー ション Validating admission etcdへ 格納 Gatekeeper 主な機能 ・kubectl apply入力と既存リソースを同時に参照しながら の検証(Sync機能) ・定期的な既存リソースの検証 (Audit機能)
  46. 46 Gatekeeper PolicyはConstraintTemplateとConstraintという2つのCRDによって定義される。 ConstraintTemplate ・Constraintを生成するための雛形になるもの ・Regoを用いてPolicyを記述して定義する Constraint ・ConstraintTemplateから作られるCRD ・Policyの適用対象リソース(Deployment, Ingress,

    etc)やパラメータを指定する 
 

  47. 47 ConstraintTemplate LabelのValidationをするConstraintTemplate

  48. 48 Constraint ConstraintTemplateを指定してConstraintを生成

  49. 49 Gatekeeper SpinnakerやCircleCIに限らず、すべてのApplyを検証できる 
 
 
 必要なラベルがある Manifest Kubernetes Client

    必要なラベルがない Manifest Gatekeeper Deploymentを生成 ✅ Cluster内部からの Policy違反するApply 必要なラベルがある Manifest ✅
  50. 50 Policies for Kubernetes Deployment Service A Team Service B

    Team Service C Team Service A Application Trigger Deploy(kubectl) Deploy YAML YAML Deploy(kubectl) Conftest Gatekeeper
  51. 51 Policies for Kubernetes Deployment Service A Team Service B

    Team Service C Team Service A Application Trigger Deploy(kubectl) Deploy YAML YAML Feedbacks (Area) Bad(CD) Deploy(kubectl) Gatekeeper
  52. 52 Policies for Kubernetes Deployment Service A Team Service B

    Team Service C Team Service A Application Trigger Deploy(kubectl) Deploy YAML YAML Feedbacks (Area) Good (CI) Deploy(kubectl) Conftest
  53. 53 Policies for Kubernetes Deployment Service A Team Service B

    Team Service C Team Service A Application Trigger Deploy(kubectl) Deploy YAML YAML Feedbacks (Area) Good (CI) Bad(CD) Deploy(kubectl) Conftest Gatekeeper
  54. 54 Conftest v.s. Gatekeeper GatekeeperとConftestはどちらもPolicyをもとに検証を行うツールであるものの、 立ち位置が大きく異なるため両者は排他的なものではない。 Conftest Gatekeeper 検証 Client-side検証

    Server-side検証 ツールの形態 CLIツール Kubernetes Admission Controller Policyの定義方法 Policy専用ファイル(.rego) Kubernetes CRD 検証のロケーション ローカル環境・CI CD後のKubernetesクラスタ Feedbackの速さ 早い 遅い 役割 ・Apply前にフィードバックを得るための素 早い検証 ・Best Practiceをキャッチするための検証 クラスタにApplyされるリソースに対して Policyを確実に課したいとき 表 ConftestとGatekeeperの比較
  55. 55 Conftest v.s. Gatekeeper GatekeeperとConftestはどちらもPolicyをもとに検証を行うツールであるものの、 立ち位置が大きく異なるため両者は排他的なものではない。 Conftest Gatekeeper 検証 Client-side検証

    Server-side検証 ツールの形態 CLIツール Kubernetes Admission Controller Policyの定義方法 Policy専用ファイル(.rego) Kubernetes CRD 検証のロケーション ローカル環境・CI CD後のKubernetesクラスタ Feedbackの速さ 早い 遅い 検証の役割 ・Apply前にフィードバックを得るための素 早い検証 ・Best Practiceをキャッチするための検証 クラスタにApplyされるリソースに対して Policyを確実に課したいとき 表 ConftestとGatekeeperの比較
  56. 56 Conftest v.s. Gatekeeper GatekeeperとConftestはどちらもPolicyをもとに検証を行うツールであるものの、 立ち位置が大きく異なるため両者は排他的なものではない。 Conftest Gatekeeper 検証 Client-side検証

    Server-side検証 ツールの形態 CLIツール Kubernetes Admission Controller Policyの定義方法 Policy専用ファイル(.rego) Kubernetes CRD 検証のロケーション ローカル環境・CI CD後のKubernetesクラスタ Feedbackの速さ 早い 遅い 検証の役割 ・Apply前にフィードバックを得るための素 早い検証 ・Best Practiceをキャッチするための検証 クラスタにApplyされるリソースに対して Policyを確実に課したいとき 表 ConftestとGatekeeperの比較
  57. 57 Overview of CI/CD Service Push Pull Conftest validation Kubernetes

    Repository Circle CI Spinnaker Deploy Gatekeeper Kubernetes Gatekeeper validation 組織的なルールをPolicyとして定義し、Gatekeeperと Conftestを使うことによって、Kubernetesへデプロイされる 全てのマイクロサービスへPolicyを課すことができるように なった。

  58. 58 CI/CD of Policies Trigger Kubernetes Repository Policy自体のCI/CDも行っている。ConftestはUnit testする仕組みがあるためPolicyもテストできる。 ConftestのPolicy(Rego)とGatekeeperのContstraintTemplate(CRD)に互換性がないため、変換して

    CRD を生成し、デプロイ。 Security Team Platform Team SRE Team PR & Review PR & Review PR & Review Circle CI Policy(.Rego) Policy(.Rego) Policy(.Rego)
  59. 59 CI/CD of Policies Trigger Kubernetes Repository Deploy CRD Policy自体のCI/CDも行っている。ConftestはUnit

    testする仕組みがあるためPolicyもテストできる。 ConftestのPolicy(Rego)とGatekeeperのContstraintTemplate(CRD)に互換性がないため、変換して CRD を生成し、デプロイ。 Security Team Platform Team SRE Team PR & Review PR & Review PR & Review Circle CI Policy(.Rego) Policy(.Rego) Policy(.Rego) Generate Constraints(CRD)
  60. 60 CI/CD of Policies Trigger Kubernetes Repository Deploy CRD Policy自体のCI/CDも行っている。ConftestはUnit

    testする仕組みがあるためPolicyもテストできる。 ConftestのPolicy(Rego)とGatekeeperのContstraintTemplate(CRD)に互換性がないため、変換して CRD を生成し、デプロイ。ルールがConftestとGatekeeperで統一されている。 Security Team Platform Team SRE Team PR & Review PR & Review PR & Review Circle CI Policy(.Rego) Policy(.Rego) Policy(.Rego) Generate Constraints(CRD)
  61. 61 OPAを導入することによって 各マイクロサービスのCI/CDで Policyを課すことができた

  62. 62 Problem & Solution Spinnaker Pipelineは、DeveloperがGUI上で設定するので設定ミスをしやす く、デプロイ手法もサービスによって大きく質が異なる。 解決策 • DeveloperがPipelineを簡単な設定で作れる仕組み

    • Pipelineを作成すると、あとから変更することができないImmutableな仕組 み • Platform Teamが各マイクロサービスのデプロイ手法を管理し、デプロイ手 法の標準化・Best Practiceを提供しつづけられる仕組み
  63. 63 Problem & Solution Spinnaker Pipelineは、DeveloperがGUI上で設定するので設定ミスをしやす く、デプロイ手法もサービスによって大きく質が異なる。 解決策 • DeveloperがPipelineを簡単な設定で作れる仕組み

    • Pipelineを作成すると、あとから変更することができないImmutableな仕組 み • Platform Teamが各マイクロサービスのデプロイ手法を管理し、デプロイ手 法の標準化・Best Practiceを提供しつづけられる仕組み Spinnaker Managed Pipelineの導入
  64. 64 Spinnaker

  65. 65 Spinnaker Pipeline

  66. 66 Spinnaker Managed Pipeline Managed Pipelineとは、雛形になるManaged Pipeline Template(MPT)に設定情報であるPipeline Configurationsを渡してできるPipelineのこと。すべてコードで定義される。 Managed

    Pipeline Template(JSON) JSON Pipeline Configurations(JSON) JSON Managed Pipeline = + ・変数を定義 ・どのMPTを使うか指定 ・変数を値を定義 Platform Team
  67. 67 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を管理することができる。
  68. 68 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
  69. 69 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 デプロイ先を変更
  70. 70 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 デプロイ先を変更
  71. 71 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
  72. 72 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 ベストプラクティスを追加 ✅
  73. 73 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 ベストプラクティスを追加 ✅ ✅ ✅ ✅
  74. 74 Immutable機能 Managed Pipelineは、Pipeline Configurationで渡せる情報以外は変更することができない。 DeveloperがPipelineを改変したり、誤った設定することを防ぐことができる。 Pipeline自体は変更できない

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

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

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

    ・Configuration機能 必要な部分だけDeveloperに設定してもらえる マイクロサービスに必要な最小限の設定だけを公開して、あとから変更されることもなく、全マイクロサービス のデプロイの標準化・管理することができる
  78. 78 Platform TeamがMPTを保守・開発することによって、全マイクロサービスの Pipelineを管理することがで き、サービス全体でデプロイの質を担保しつづけることができる。 例: Best PracticeをMPTに実装することによって、全マイクロサービスの PipelineにそのBest Practiceが自動的に実装される

    クラスタMigrationやマイクロサービスのPipelineの変更を要するときにも、ひとつの MPTを変更するだけで 済み、Developerは何もする必要がない。 
 Pipeline as Code Trigger Kubernetes Repository Deploy MPT Platform Team SRE Team PR & Review PR & Review Circle CI Managed Pipeline Template
  79. 79 Spinnaker Managed Pipelineを導入することによって 各マイクロサービスのデプロイを 統括的に管理・質の向上をすることができる

  80. 80 05 Wrap up

  81. 81 Wrap up マイクロサービスアーキテクチャの継続的デリバリーにおいて、 サービス全体(全マイクロサービス)の質を担保して、すべてを安全にデプロイしていくことは一般的に難し い。 
 
 


  82. 82 Wrap up マイクロサービスアーキテクチャの継続的デリバリーにおいて、 サービス全体(全マイクロサービス)の質を担保して、すべてを安全にデプロイしていくことは一般的に難し い。 安全な継続的デリバリーを行うためにも、それぞれのマイクロサービスの開発サイクルの中で Policyを課し たり、デプロイをする仕組みを Platformが提供するべきです。

    
 
 

  83. 83 Wrap up マイクロサービスアーキテクチャの継続的デリバリーにおいて、 サービス全体(全マイクロサービス)の質を担保して、すべてを安全にデプロイしていくことは一般的に難し い。 安全な継続的デリバリーを行うためにも、それぞれのマイクロサービスの開発サイクルの中で Policyを課し たり、デプロイをする仕組みを Platformが提供するべきです。

    メルカリではOpen Policy AgentやSpinnakerのManaged Pipelineの機能を使うことによって、 すべてのマイクロサービスの Kubernetes ManifestへPolicyを課したり・デプロイの管理することができ まし た。 
 
 

  84. 84 Thank you!