Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

▶ Daiki Hayakawa / @bells17 ▶ Software Enginner ▶ 主に Kubernetes 関連コンポーネントの開発など ▶ @bells17_

Slide 3

Slide 3 text

今⽇話すこと ▶ Prow が Kubernetes の CI/CD でどのように利⽤されているか? ▶ Prow について ▶ Prowのアーキテクチャについて ▶ Prow の環境構築⽅法

Slide 4

Slide 4 text

注意点 ▶ 内容的にProwに関するDeep Dive的なセッションになります ▶ 詰め込み過ぎてしまったので、駆け⾜で説明していきます + 資料と動画が公開されるので、もし気になる箇所が聞き取れなかった りしたら後から再度⾒返してもらえるとありがたいです ▶ 時間の関係上Kubernetesについての説明は割愛してます

Slide 5

Slide 5 text

アジェンダ 1. KubernetesのCI環境について 2. Prow とは? 3. Prow のアーキテクチャ 4. Prow の動作イメージ 5. Prow によるOrganization/リポジトリ管理 6. Prow の環境構築 7. Prow の設定ファイル 8. まとめ

Slide 6

Slide 6 text

KubernetesのCI環境について

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

Prow とは?

Slide 12

Slide 12 text

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の組み合わせによるマイクロサービス アーキテクチャを採⽤

Slide 13

Slide 13 text

Prow を使うと何が嬉しい? ▶ 他のCI/CDツールと同様にジョブ実⾏の機能がある ▶ Issue/PRの管理といったリポジトリのライフサイクル管理の仕組みを 備えている ▶ Organization/リポジトリ管理のための様々なツールが同梱されている ▶ リポジトリのブランチ保護設定の⾃動適⽤ツール ▶ ラベル管理ツール ▶ Github Organizationのメンバー/チーム管理を⾏うツール

Slide 14

Slide 14 text

Prow のアーキテクチャ

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

Prow の動作イメージ

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

ユニットテストの実行といったジョブの実行はすべて trigger Plugin 経由で 作成された ProwJob が実行

Slide 21

Slide 21 text

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に⾃動的に任意のラベルを設定

Slide 22

Slide 22 text

OWNERSファイルとは? ▶ Prow(のプラグイン)が以下のようなことを判断 するのに使われる ▶ 誰をレビュアーにアサインするか? ▶ 誰からの /approve なら許可してOKか? ▶ デフォルトでPRに設定するラベルは? ▶ など ▶ GithubのCODEOWNERSファイルに近い

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

ProwJob の種類 Periodic cronのように決められたスケジュールで定期実⾏するジョブを定義 Presubmit PRの作成/変更及びPR内での /(re)test コマンドをキーとしたジョブを定義 主にCIによる各種テスト向け Postsubmit Pushイベントをキーとしたジョブを定義 主に特定ブランチへのマージ時に⾏うリリース関連タスク向け Batch という種類もあるけど内部的に使用されるものなので除外してます

Slide 25

Slide 25 text

No content

Slide 26

Slide 26 text

ProwJob の実⾏エンジン Kubernetes デフォルトの実⾏エンジン Kubernetes Podを利⽤してジョブが実⾏される 単にコンテナで単⼀のコマンド実⾏するだけといった単純なジョブのみが可能 Pipeline Tekton をバックエンドに利⽤した実⾏エンジン Tekton の pipeline 機能を使ってジョブを利⽤できる 公式な環境構築ドキュメントが存在しない Jenkins Jenkinsをバックエンドに利⽤した実⾏エンジン 現在はDeprecatedとなっている PipelineはKubernetesエンジンと比較してロギング機能など不完全な状態であるらしく、 以下の提案による改善が進行中 Multiple Container / Tekton Pipeline Support for Prow Design Doc

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Tide は定期的に Github の PR の状態を確認して、マージできそうなものがあればマージします

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

Prow の環境構築

Slide 36

Slide 36 text

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などもアクセス可能ユーザーの制限が必要

Slide 37

Slide 37 text

Prow ⽤Kubernetesクラスター ▶ GKE を利⽤する場合 + GKE を使う場合はリポジトリの Deploying Prow に沿って構築するだ けで環境構築が可能 ▶ GKE 以外を利⽤する場合 + 以下の機能を持ったクラスター必要 + CSI Driver(永続ディスク利⽤のため) + Ingress Controller(SSL終端可能なロードバランサーが必要なため) + もしくはCloud Controller Managerのtype: LoadBalancer + αなど + Access Token などの各種 Secret の設定 + リポジトリにある starter.yaml を利⽤すればそんなに迷わず構築可能

Slide 38

Slide 38 text

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のメン バー/チームを管理が可能

Slide 39

Slide 39 text

Prow の設定ファイル

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

config.yaml の設定 ▶ Prow の各種 component の設定を⾏う ▶ 各リポジトリごとのユニットテストなどを⾏う job(periodic, presubmits, postsubmit)もこの ファイルで定義可能

Slide 42

Slide 42 text

job-config の設定 ▶ 各リポジトリごとのユニットテストなどを⾏う job(periodic, presubmits, postsubmit)を複数の ファイルに分割して管理が可能 ▶ プラグインの config-updater または config- bootstraper という機能を利⽤して実現 ▶ Prowの特徴として各リポジトリのJob定義は1つ のリポジトリで集中管理している傾向が多い
 (分散管理をすることも可能)

Slide 43

Slide 43 text

まとめ

Slide 44

Slide 44 text

まとめ ▶ Kubernetes や Cloud Native 界隈で利⽤されているCI/CDツールである Prowについて紹介 しました ▶ Prowを使うことでユニットテストといったジョブの実⾏だけでなく、Organization~リポ ジトリ管理/Issue作成~PRレビュー~マージといったリポジトリのライフサイクル管理を⾏ うことが可能です ▶ Prowを使うことでKubernetesコミュニティが運⽤している、これらのライフサイクル管 理のフレームワークを取り⼊れることができるんじゃないかと思います

Slide 45

Slide 45 text

参考資料 ▶ 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

Slide 46

Slide 46 text

Thanks / Question? ▶ Daiki Hayakawa, @bells17 ▶ Slide: https://speakerdeck.com/bells17 ▶ @bells17_