Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

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

bells17

July 25, 2020
Tweet

More Decks by bells17

Other Decks in Technology

Transcript

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

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

    について ▶ Prowのアーキテクチャについて ▶ Prow の環境構築⽅法
  3. アジェンダ 1. KubernetesのCI環境について 2. Prow とは? 3. Prow のアーキテクチャ 4.

    Prow の動作イメージ 5. Prow によるOrganization/リポジトリ管理 6. Prow の環境構築 7. Prow の設定ファイル 8. まとめ
  4. 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の組み合わせによるマイクロサービス アーキテクチャを採⽤
  5. 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
  6. 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に⾃動的に任意のラベルを設定
  7. 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
  8. ProwJob の種類 Periodic cronのように決められたスケジュールで定期実⾏するジョブを定義 Presubmit PRの作成/変更及びPR内での /(re)test コマンドをキーとしたジョブを定義 主にCIによる各種テスト向け Postsubmit

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

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

    ▶ approver の /approve コマンドによって Hook の approve プラグインにより approve ラベルが付与 される ▶ Tide コンポーネントにより条件が満たされたため ⾃動でマージが⾏われる + lgtm & approve ラベルがあることをマージ条件 にしているケースが多い 特定のラベルが付与されている場合にマージを行わなくすることも可能 Prowの動作 ~ マージまでの流れ
  11. 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などもアクセス可能ユーザーの制限が必要
  12. Prow ⽤Kubernetesクラスター ▶ GKE を利⽤する場合 + GKE を使う場合はリポジトリの Deploying Prow

    に沿って構築するだ けで環境構築が可能 ▶ GKE 以外を利⽤する場合 + 以下の機能を持ったクラスター必要 + CSI Driver(永続ディスク利⽤のため) + Ingress Controller(SSL終端可能なロードバランサーが必要なため) + もしくはCloud Controller Managerのtype: LoadBalancer + αなど + Access Token などの各種 Secret の設定 + リポジトリにある starter.yaml を利⽤すればそんなに迷わず構築可能
  13. 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のメン バー/チームを管理が可能
  14. job-config の設定 ▶ 各リポジトリごとのユニットテストなどを⾏う job(periodic, presubmits, postsubmit)を複数の ファイルに分割して管理が可能 ▶ プラグインの

    config-updater または config- bootstraper という機能を利⽤して実現 ▶ Prowの特徴として各リポジトリのJob定義は1つ のリポジトリで集中管理している傾向が多い
 (分散管理をすることも可能)
  15. まとめ ▶ Kubernetes や Cloud Native 界隈で利⽤されているCI/CDツールである Prowについて紹介 しました ▶

    Prowを使うことでユニットテストといったジョブの実⾏だけでなく、Organization~リポ ジトリ管理/Issue作成~PRレビュー~マージといったリポジトリのライフサイクル管理を⾏ うことが可能です ▶ Prowを使うことでKubernetesコミュニティが運⽤している、これらのライフサイクル管 理のフレームワークを取り⼊れることができるんじゃないかと思います
  16. 参考資料 ▶ 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