Prow に学ぶ Kubernetes のCI環境/Prow & Kubernetes

3499a1d71fa70b8ee44816ca9e7329fe?s=47 bells17
July 25, 2020

Prow に学ぶ Kubernetes のCI環境/Prow & Kubernetes

July Tech Festa 2020で発表した資料です
https://note.com/kooozii/n/nea831df7be6e

動画はこちら
https://www.youtube.com/watch?v=wLTWpct9rEo

3499a1d71fa70b8ee44816ca9e7329fe?s=128

bells17

July 25, 2020
Tweet

Transcript

  1. Prow に学ぶ Kubernetes のCI環境 July Tech Festa 2020(2020/07/25) @bells17

  2. ▶ Daiki Hayakawa / @bells17 ▶ Software Enginner ▶ 主に

    Kubernetes 関連コンポーネントの開発など ▶ @bells17_
  3. 今⽇話すこと ▶ Prow が Kubernetes の CI/CD でどのように利⽤されているか? ▶ Prow

    について ▶ Prowのアーキテクチャについて ▶ Prow の環境構築⽅法
  4. 注意点 ▶ 内容的にProwに関するDeep Dive的なセッションになります ▶ 詰め込み過ぎてしまったので、駆け⾜で説明していきます + 資料と動画が公開されるので、もし気になる箇所が聞き取れなかった りしたら後から再度⾒返してもらえるとありがたいです ▶

    時間の関係上Kubernetesについての説明は割愛してます
  5. アジェンダ 1. KubernetesのCI環境について 2. Prow とは? 3. Prow のアーキテクチャ 4.

    Prow の動作イメージ 5. Prow によるOrganization/リポジトリ管理 6. Prow の環境構築 7. Prow の設定ファイル 8. まとめ
  6. KubernetesのCI環境について

  7. None
  8. None
  9. None
  10. None
  11. Prow とは?

  12. Prow ▶ Kubernetes を中⼼にCloud Native界隈で使われているCI/CDツール + Kubernetes / helm charts

    / Istio / Prometheus / etc などが利⽤ ▶ Github と親和性の⾼いCI/CD機能を提供 + 特定のGithubアカウントをbotとして動作させる + Github の各種イベント(issue・PR作成/コメント/push/etc )を
 トリガーに処理を⾏うことが可能 ▶ Prow ⾃体がKubernetes上で動作する + Kubernetes の CRD をデータベースとして動作する + 複数のComponent / Pluginの組み合わせによるマイクロサービス アーキテクチャを採⽤
  13. Prow を使うと何が嬉しい? ▶ 他のCI/CDツールと同様にジョブ実⾏の機能がある ▶ Issue/PRの管理といったリポジトリのライフサイクル管理の仕組みを 備えている ▶ Organization/リポジトリ管理のための様々なツールが同梱されている ▶

    リポジトリのブランチ保護設定の⾃動適⽤ツール ▶ ラベル管理ツール ▶ Github Organizationのメンバー/チーム管理を⾏うツール
  14. Prow のアーキテクチャ

  15. https://github.com/kubernetes/test-infra/blob/master/prow/docs/architecture.png

  16. Prow の主な Component Hook GithubからのWebhookを受け取り、各種プラグインを実⾏する Tide 条件の満たされた Pull Request のマージを⾏う

    Plank k8s pod を利⽤してジョブの実⾏を⾏う実⾏エンジン Deck 設定されたProwに関するWebUIを提供する Crier ジョブの実⾏結果の通知機能を提供(Github, Slack, etc ) Sinker Plankによって⽣成された古いPodのクリーンアップを⾏う Horologium Periodicというcronのような定期実⾏のProwJobをスケジューリングする StatusReconciler PRがスタックしないようにProwJobのpresubmitのステータスを調整する Spyglass Deckに同梱されている、ジョブの実⾏結果を表⽰するUI
  17. Prow の動作イメージ

  18. https://github.com/kubernetes/test-infra/blob/master/prow/docs/pr-interactions-sequence.svg

  19. Prowの動作 ~ PR作成時 ▶ PR作成イベントがGithubのwebhookを通して ProwのHookコンポーネントに通知 ▶ Hookは各種リポジトリに設定されたプラグイン を実⾏ イベントを受信してどんな処理を行うかは

    有効にしたプラグインとその設定次第!
  20. ユニットテストの実行といったジョブの実行はすべて trigger Plugin 経由で 作成された ProwJob が実行

  21. Hook の主なプラグイン Trigger リポジトリの設定やPRの内容に応じたジョブの実⾏を⾏う Size PRの変更量に応じたラベルの設定を⾏う(e.g. size/s) Approve OWNERSファイルに記述された approver

    がGithubコメントで/approve コマンドを実⾏するとapproveラ ベルの付与を⾏う LGTM Githubコメントで/lgtm コマンドを実⾏するとlgtmラベルの付与を⾏う Bluderbuss OWNERSファイルに記述された reviewer からPRのレビュアーを⾃動選出 Owners-label OWNERSファイルに記述された labels からPRに⾃動的に任意のラベルを設定
  22. OWNERSファイルとは? ▶ Prow(のプラグイン)が以下のようなことを判断 するのに使われる ▶ 誰をレビュアーにアサインするか? ▶ 誰からの /approve なら許可してOKか?

    ▶ デフォルトでPRに設定するラベルは? ▶ など ▶ GithubのCODEOWNERSファイルに近い
  23. External Plugin ▶ デフォルトのプラグインをHookバイナリに同梱さ れているが、External Pluginを作成することで独 ⾃のプラグインを実装することが可能 ▶ kubernetes/test-infra/prow/external-plugins/ に

    プラグイン例がある ▶ Prowのプラグイン設定を管理する plugins.yaml の external_plugins フィールドで利⽤する External Plugin を設定可能 ▶ External Plugin については https://bit.ly/2CMAStx でもまとめているので参考にしてください External Plugin は Prow と同じ Kubernetes クラスターで起動してOK
  24. ProwJob の種類 Periodic cronのように決められたスケジュールで定期実⾏するジョブを定義 Presubmit PRの作成/変更及びPR内での /(re)test コマンドをキーとしたジョブを定義 主にCIによる各種テスト向け Postsubmit

    Pushイベントをキーとしたジョブを定義 主に特定ブランチへのマージ時に⾏うリリース関連タスク向け Batch という種類もあるけど内部的に使用されるものなので除外してます
  25. None
  26. ProwJob の実⾏エンジン Kubernetes デフォルトの実⾏エンジン Kubernetes Podを利⽤してジョブが実⾏される 単にコンテナで単⼀のコマンド実⾏するだけといった単純なジョブのみが可能 Pipeline Tekton をバックエンドに利⽤した実⾏エンジン

    Tekton の pipeline 機能を使ってジョブを利⽤できる 公式な環境構築ドキュメントが存在しない Jenkins Jenkinsをバックエンドに利⽤した実⾏エンジン 現在はDeprecatedとなっている PipelineはKubernetesエンジンと比較してロギング機能など不完全な状態であるらしく、 以下の提案による改善が進行中 Multiple Container / Tekton Pipeline Support for Prow Design Doc
  27. ▶ /lgtm コマンドによって Hook の lgtm プラグイン により lgtm ラベルが付与される

    ▶ approver の /approve コマンドによって Hook の approve プラグインにより approve ラベルが付与 される ▶ Tide コンポーネントにより条件が満たされたため ⾃動でマージが⾏われる + lgtm & approve ラベルがあることをマージ条件 にしているケースが多い 特定のラベルが付与されている場合にマージを行わなくすることも可能 Prowの動作 ~ マージまでの流れ
  28. Tide は定期的に Github の PR の状態を確認して、マージできそうなものがあればマージします

  29. https://github.com/kubernetes/test-infra/blob/master/prow/docs/pr-interactions-sequence.svg ここまでが下記の図で説明されていたProwを使った PRのライフサイクル管理の流れになります

  30. Prow によるOrganization/リポジトリ管理

  31. branch protector Prowが提供するブランチ保護設定の⾃動適⽤ツール ブランチ保護の設定に基づき、該当リポジトリに対してブランチ保護設定を適⽤する ツールのバイナリとコンテナが提供されており、CronJobやProwJobのPeriodicなどを使⽤ して実⾏する

  32. label-sync Prowが提供するラベル管理ツール 設定ファイルで定義されたラベル設定に基づき、該当リポジトリに⾃動で各種ラベルの作成を⾏う ツールのバイナリとコンテナが提供されており、CronJobやProwJobのPeriodicなどを使⽤して実 ⾏する

  33. Peribolos Prowが提供するGithub Organizationのメンバー/チーム/リポジトリの管理を⾏うツール 設定ファイルで定義されたメンバー/チーム設定に基づき、Github Organizationのメンバー /チーム/リポジトリの管理を⾏うことができる

  34. その他ツール Prowを含めたツール群を管理している kubernetes/test-infra には他にも様々なツールがあ ります それらのツールについてわかる範囲で調べたシートが https://bit.ly/30J3CM3 にあるので、そちらも参考にしてみてください (Hookの組み込みプラグインの⼀覧などについても記載してます)

  35. Prow の環境構築

  36. Prow を利⽤するために必要なもの ▶ Github(Enterpriseも可能)での利⽤が前提条件 + Gitlab/Gerrit などのプラットホーム対応 issue は上がっているがまだ未対応 ▶

    Github のbotアカウント + Prowからbotを操作するための Personal Access Token + Webhook共通で設定するためのSecret + WebUI(Deck) を利⽤するためのOAuth Apps(optional) ▶ ジョブの実⾏結果を保存するためのGoogle Cloud Storage + Amazon S3も利⽤可能ではあるが、⼀部機能が動かないらしい ▶ Prow⽤のドメイン+SSL証明書 ▶ WebUI(Deck) ⾃体にはアクセス制御機能がないため、oauth-proxy などを利⽤し てアクセス可能ユーザーを限定する必要がある(private repositoryを使う場合) + loodseなんかは実際にoauth-proxyを利⽤して認証を⾏っているよう + 合わせてGoogle Cloud Storageなどもアクセス可能ユーザーの制限が必要
  37. Prow ⽤Kubernetesクラスター ▶ GKE を利⽤する場合 + GKE を使う場合はリポジトリの Deploying Prow

    に沿って構築するだ けで環境構築が可能 ▶ GKE 以外を利⽤する場合 + 以下の機能を持ったクラスター必要 + CSI Driver(永続ディスク利⽤のため) + Ingress Controller(SSL終端可能なロードバランサーが必要なため) + もしくはCloud Controller Managerのtype: LoadBalancer + αなど + Access Token などの各種 Secret の設定 + リポジトリにある starter.yaml を利⽤すればそんなに迷わず構築可能
  38. Prow 環境構築の構築例 ▶ https://github.com/bells17-labs/test-infra にサンプルのProwを構築 したので良ければ試してみてください ▶ starter.yamlで構築されるProwに加えて以下のような設定を⾏っている + 実際のconfig.yaml/plugins.yaml/job-configの設定例

    + 特に主要なプラグインとその設定例など + config-updaterを使い、PRがマージされた段階でconfig.yaml/ plugins.yaml/job-configをクラスターに⾃動適⽤する設定 + label-syncやbranch protectorを使ったリポジトリの管理設定 + ProwJobとPeribolosを使い、PRをマージするとOrganizationのメン バー/チームを管理が可能
  39. Prow の設定ファイル

  40. plugins.yaml の設定 ▶ Org/Repo 単位での利⽤するプラグインの設定や 個々のプラグインの設定を⾏う ▶ プラグイン個々の設定可能値はプラグインのド キュメントには書いてないことも多いので、ソー スコードを読む必要がある

  41. config.yaml の設定 ▶ Prow の各種 component の設定を⾏う ▶ 各リポジトリごとのユニットテストなどを⾏う job(periodic,

    presubmits, postsubmit)もこの ファイルで定義可能
  42. job-config の設定 ▶ 各リポジトリごとのユニットテストなどを⾏う job(periodic, presubmits, postsubmit)を複数の ファイルに分割して管理が可能 ▶ プラグインの

    config-updater または config- bootstraper という機能を利⽤して実現 ▶ Prowの特徴として各リポジトリのJob定義は1つ のリポジトリで集中管理している傾向が多い
 (分散管理をすることも可能)
  43. まとめ

  44. まとめ ▶ Kubernetes や Cloud Native 界隈で利⽤されているCI/CDツールである Prowについて紹介 しました ▶

    Prowを使うことでユニットテストといったジョブの実⾏だけでなく、Organization~リポ ジトリ管理/Issue作成~PRレビュー~マージといったリポジトリのライフサイクル管理を⾏ うことが可能です ▶ Prowを使うことでKubernetesコミュニティが運⽤している、これらのライフサイクル管 理のフレームワークを取り⼊れることができるんじゃないかと思います
  45. 参考資料 ▶ Prow https://github.com/kubernetes/test-infra/tree/master/prow ▶ Deploying Prow https://github.com/kubernetes/test-infra/blob/master/prow/getting_started_deploy.md ▶ Prow

    Docs on kyma-project/test-infra: https://github.com/kyma-project/test-infra/tree/master/docs/prow ▶ Prow Images https://github.com/kubernetes/test-infra/blob/master/prow/cmd/README.md ▶ Getting more out of Prow https://github.com/kubernetes/test-infra/blob/master/prow/more_prow.md ▶ Plugins https://github.com/kubernetes/test-infra/blob/master/prow/plugins/README.md ▶ Pod Utilities https://github.com/kubernetes/test-infra/blob/master/prow/pod-utilities.md ▶ ProwJobs https://github.com/kubernetes/test-infra/blob/master/prow/jobs.md ▶ Life of a Prow Job https://github.com/kubernetes/test-infra/blob/master/prow/life_of_a_prow_job.md ▶ Kubernetes Prow Job Configs https://github.com/kubernetes/test-infra/blob/master/config/jobs/README.md ▶ Crier https://github.com/kubernetes/test-infra/tree/master/prow/cmd/crier ▶ Deck https://github.com/kubernetes/test-infra/tree/master/prow/cmd/deck ▶ Plank https://github.com/kubernetes/test-infra/tree/master/prow/cmd/plank ▶ Tide https://github.com/kubernetes/test-infra/blob/master/prow/cmd/tide/README.md ▶ Configuring Tide https://github.com/kubernetes/test-infra/blob/master/prow/cmd/tide/config.md ▶ Branch Protection Documentation https://github.com/kubernetes/test-infra/tree/master/prow/cmd/branchprotector ▶ label_sync https://github.com/kubernetes/test-infra/blob/master/label_sync/README.md ▶ KubernetesベースのCI/CDシステムProwに⼊⾨してみた https://developers.cyberagent.co.jp/blog/archives/22072/ ▶ Prowのexternal-pluginについて調べてみた https://medium.com/@bells17/135b848273df
  46. Thanks / Question? ▶ Daiki Hayakawa, @bells17 ▶ Slide: https://speakerdeck.com/bells17

    ▶ @bells17_