Slide 1

Slide 1 text

© DeNA Co., Ltd. 1 Kubernetes だけじゃない! Amazon ECS で実現するクラウドネイティブな GitHub Actions セルフホストランナー 幸田優哉 IT 本部品質管理部 SWET 第二グループ 株式会社ディー・エヌ・エー

Slide 2

Slide 2 text

© DeNA Co., Ltd. 2 Yuya Koda DeNA の SWET (SoftWare Engineer in Test) チーム所属 お仕事は全社向けに提供している GitHub Actions セルフホストランナーをいい感じにすることです。 最近のマイブームは立ち飲み屋さん巡り DeNA IT 本部品質管理部 SWET 第二グループ ponkio_o © DeNA Co., Ltd. 自己紹介 koday.me

Slide 3

Slide 3 text

© DeNA Co., Ltd. 3 今日話すこと、話さないこと 話すこと ● [前半] 全社用ランナーの概要と設計及び技術選定 ● [後半] 全社用ランナーの運用について 話さないこと ● GitHub Actions のワークフローについて ● Amazon ECS / Kubernetes の詳しい話 ● セルフホストランナーの技術的な話 (多少は出てきますが)

Slide 4

Slide 4 text

© DeNA Co., Ltd. 4 セルフホストランナーについて

Slide 5

Slide 5 text

© DeNA Co., Ltd. 5 セルフホストランナーとは ● セルフホストランナーは GitHub Actions の Job を自前のインフラ上で実行する ための仕組み ○ actions/runner というリポジトリでソースコードが公開されている ● 物理マシン、仮想マシン、コンテナなど様々な場所で実行可能

Slide 6

Slide 6 text

© DeNA Co., Ltd. 6 なぜセルフホストランナー? 大きく2つ理由がある ● GitHub Enterprise Server (GHES) は、GitHub-hosted Runner に対応していないため ○ つまり runs-on: ubuntu-latest できない ● セキュリティ的な事情で、開発時に自前のインフラ上での Job の実行が要求されるケー スがある → DeNA では GHES の利用がメインであるため GitHub Actions を利用するためにはセルフ ホストランナーの運用が必須となる

Slide 7

Slide 7 text

© DeNA Co., Ltd. 7 セルフホストランナーの実行方法

Slide 8

Slide 8 text

© DeNA Co., Ltd. 8 セルフホストランナーの実行 セルフホストランナーは単に動かすだけならとてもシンプル

Slide 9

Slide 9 text

© DeNA Co., Ltd. 9 大規模ランナーの設計と技術選定

Slide 10

Slide 10 text

© DeNA Co., Ltd. 10 全社用ランナーの設計から構築まで 次のような流れで進めた 1. 要件の洗い出し 2. OSS の比較検討 3. 構築・実装

Slide 11

Slide 11 text

© DeNA Co., Ltd. 11 要件の洗い出し

Slide 12

Slide 12 text

© DeNA Co., Ltd. 12 全社用ランナーで定めた要件 簡単に構築できるランナーも、「全社向け」に提供するとなると考慮事項がたくさん出てくる 構築や OSS を検討する前に、まずは次のような要件を定めた 1. 実行環境をジョブごとに確実に隔離可能であること 2. Enterprise Runner として構成可能であること 3. 少人数で運用し続けられること

Slide 13

Slide 13 text

© DeNA Co., Ltd. 13 実行環境をジョブごとに確実に隔離可能であること 社内には秘匿性の高いプロジェクトも存在するため、他のプロジェクトの実行環境と ファイルやネットワークが確実に隔離されることは必須要件 例えば、次のようなことは絶対に起きないように設計する必要があった ● ディレクトリを移動すると他のプロジェクトのソースコードが見えてしまう ● 各サービスの認証情報が残ってしまう ● docker ps した時に他のプロジェクトのコンテナが見えてしまう ● ネットワーク越しに他のジョブにアクセスできてしまう 1

Slide 14

Slide 14 text

© DeNA Co., Ltd. 14 Enterprise Runner として構成可能であること セルフホストランナーはいくつかのスコープでランナーを登録することができるが、 リソースの最適化のために Enterprise Runner を利用したかった Enterprise Organization Repository Repository Enterprise Runner (全 Organization / Repository で利用可能) Organization Runner (特定 Organization 内で利用可能) Repository Runner (特定 Repository でのみ利用可能) 2 Organization

Slide 15

Slide 15 text

© DeNA Co., Ltd. 15 少人数で運用し続けられること 「動かし続ける」ために運用コストも外せない要件の1つ ● 当時の SWET メンバーは3人 ○ セルフホストランナーの専任は1人 (自分) のみ ● 当時想定されていた主なタスク ○ ランナーが動く何らかの実行基盤 (ECS, k8s…etc) の保守・運用 ○ ランナー本体のアップデート ○ ランナーを動かすコンテナのアップデート ○ その他、障害発生時の調査など 3

Slide 16

Slide 16 text

© DeNA Co., Ltd. 16 OSS の比較検討

Slide 17

Slide 17 text

© DeNA Co., Ltd. 17 セルフホストランナーと OSS ランナーをいい感じにやってくれる OSS がいくつか存在するが、代表的なのは次の2つ ● actions/actions-runner-controller ● philips-labs/terraform-aws-github-runner

Slide 18

Slide 18 text

© DeNA Co., Ltd. 18 actions/actions-runner-controller Kubernetes のカスタムコントローラーで、カスタムリソースとしてランナーを管理できる (現在は) GitHub 公式の OSS で、ランナー部分はコンテナ (Pod) で動作する ● セルフホストランナーに必要な機能がほぼ入っている ● GitHub 公式サポート ● Enterprise ランナー対応 1 アーキテクチャ図 (公式ドキュメントより)

Slide 19

Slide 19 text

© DeNA Co., Ltd. 19 philips-labs/terraform-aws-github-runner AWS のサーバレス系のサービスを利用して、ランナーをスケールさせるコントローラーを 構築するための Terraform Module で、ランナー部分は VM (EC2) で動作する ● セルフホストランナーに必要な機能がほぼ入っている ● サーバレス系サービスでコントローラーが完結する ● Enterprise Runner 非対応 2 アーキテクチャ図 (README より)

Slide 20

Slide 20 text

© DeNA Co., Ltd. 20 Container vs VM

Slide 21

Slide 21 text

© DeNA Co., Ltd. 21 Container vs VM 最初に紹介した通り、actions/runner は任意の場所で実行可能だが、次のような理由から VM よりも優位であると判断しコンテナを利用して動かすことにした ● 実行環境を隔離しつつ1つの VM (EC2) で複数台のランナーが動かせる ○ 1ジョブにつき1プロセス使用するので、いかに効率よく並列数を稼ぐかが大事 ● クリーンな実行環境を作りやすい ● デプロイなどを自動化しやすい ● プリインストールツールなどの保守が楽

Slide 22

Slide 22 text

© DeNA Co., Ltd. 22 OSS の比較検討 2つの OSS を比較すると ARC は概ね要件を満たしていたが、最終的に採用しなかった actions-runner-controller (ARC) terraform-aws-github-runner ジョブの実行環境隔離 ◯ ◯ コンテナで動作可能 ◯ X Enterprise Runner の対応 ◯ X 運用・保守 △ ◯

Slide 23

Slide 23 text

© DeNA Co., Ltd. 23 なぜ Kubernetes を採用しなかったか?

Slide 24

Slide 24 text

© DeNA Co., Ltd. 24 前提 当時の状況は次のとおり ● チームで既に運用されている Kubernetes クラスタが存在しなかった (※1) ○ 今回のために新しくクラスタを構築する必要があった ● (自分含め) メンバーは Kubernetes を触った経験はあるが、深い知見があるわけではない ○ また新規メンバーのキャッチアップにも時間がかかると感じた ● セルフホストランナー専任のメンバーは自分だけで、他のメンバーは兼任 ● 既に ECS で作られた PoC が存在していた ○ ECS でも概ね実現可能であることは見えていた ※1) 厳密には存在するがまともにメンテできていない 😇

Slide 25

Slide 25 text

© DeNA Co., Ltd. 25 選定時のポイント

Slide 26

Slide 26 text

© DeNA Co., Ltd. 26 1 クラスタアップデートの運用コスト Kubernetes は4ヶ月に一度のアップデートが存在し、継続的にこれらのバージョンアップ に付き合っていく必要があり、マネージド Kubernetes であってもそこそこ大変 ● コントロールプレーンのアップデート ○ これ単体で言えばマネージドの場合にはほぼ気にしなくても良い ● 非推奨 API への対応 ● アップグレード戦略 ポイント マネージド Kubernetes の場合1クリックでコントロールプレーンの更新が完結するが、果たして それだけなのか?また限られた人員で継続することは可能か?

Slide 27

Slide 27 text

© DeNA Co., Ltd. 27 2 エコシステムの保守 Kubernetes はそれ単体で使うことは少なく、何かしらのエコシステムと共に使われること が多い。必須ではないものの、導入した場合にはそれらの設計も別途必要になる ● デプロイとマニフェスト管理 ○ ArgoCD / Flux ● オートスケーリング ○ VPA / HPA / CA ● シークレット管理 ○ ESO (External Secrets Operator) ポイント 追加でどのようなコンポーネントが必要になるか?またそれらの保守は続けられるか?

Slide 28

Slide 28 text

© DeNA Co., Ltd. 28 3 Platform としての Kubernetes Kubernetes はコンテナオーケストレーションツールの枠組みを超えて、プラットフォーム 的な側面を持っていると考えており、今回の用途ではそこまで活用しきれないと判断 ● 少なくとも設計段階では「ARC を動かす」以外の用途でクラスタが使われるイメージ が湧かなかった ● もちろん ARC の存在は大きかったが、これだけなら自分たちで作ったほうがトータル の運用コストを抑えられそうだと感じた ポイント 単に運用コストのかかるコンテナオーケストレーションツールにならないか? (比較的高い) 運用コストに見合う使い方ができるか、またそのリターンは期待できるか?

Slide 29

Slide 29 text

© DeNA Co., Ltd. 29 まとめ ● クラスタ運用 (主にバージョンアップデート) にかかるコストが大きいと判断 ○ マネージドサービスならコントロールプレーンの管理は気にしなくても OK ● Kubernetes の場合、直接的にランナーに関係しないエコシステムの保守が大変そう ○ バージョンアップ起因でバグったりすることはそこそこある ○ それによる考慮事項も増えそうだった ● 払う運用コストに見合うリターンが期待できなかった ○ 悪い言い方をすると運用コストのかかる「ランナー動かす君」になりそうだった

Slide 30

Slide 30 text

© DeNA Co., Ltd. 30 最終的に

Slide 31

Slide 31 text

© DeNA Co., Ltd. 31 最終的に 最終的に下記のような方針で、ランナーの基盤を構築することにした ● Amazon ECS (on EC2) をベースに構築する ○ Fargate は技術的な制約で利用できなかった ■ 主に docker in docker を実現するのが難しかった ● ジョブの需要に応じてスケールアウトするためのコントローラーは自作する ● マネージドサービスで代替可能なものはマネージドサービスを利用する ○ オートスケーリング、シークレット管理、メトリクス

Slide 32

Slide 32 text

© DeNA Co., Ltd. 32 ECS で構築してどうだったか?

Slide 33

Slide 33 text

© DeNA Co., Ltd. 33 概ね正解だった気がする (まだ1年ちょっとですが)

Slide 34

Slide 34 text

© DeNA Co., Ltd. 34 1 クラスタ管理がほぼ不要 やはりクラスタの面倒をほとんど見なくてもいいのは大きい ● コントロールプレーンは一切管理不要 ○ さらに利用に伴う追加料金もなし ● ECS の API や ECS Agent に対する破壊的変更が入ることはほぼない ● ECS インスタンスは基本的に ECS Optimized AMI を使っておけば OK

Slide 35

Slide 35 text

© DeNA Co., Ltd. 35 2 他の AWS サービスと連携しやすい 当然ですが、他の AWS サービスとネイティブに連携できるため考慮事項が少なく、 関連したエコシステムの保守も必要ない ● シークレット管理は Secrets Manager / Systems Manager Parameter Store ● 権限管理は Identity and Access Management (IAM) で完結 ● メトリクスは主要なものは CloudWatch に勝手に吐かれる ● スケーリングも Cluster Autoscaler (Capacity Provider) や Application Autoscaling が利用可能

Slide 36

Slide 36 text

© DeNA Co., Ltd. 36 ほんとうに…?

Slide 37

Slide 37 text

© DeNA Co., Ltd. 37 少し微妙かも?と思っているポイント ECS ならではの大変さもあり、もちろん Kubernetes や ARC が羨ましくなる時もある ● 車輪の再発明 (主にランナーのオートスケール部分) ○ 自分たちで作ることを決めた以上これは仕方ないですが… ■ 基本的には AWS の API を呼ぶだけなので実装はシンプルになることが多い ● Kubernetes に比べると否めない機能不足感 ○ 特にスケジューリングやスケーリング周りに機能不足を感じる ○ 実際に ECS 標準だとクラスタのスケールアウト速度が遅かったので独自の cluster-autoscaler を作ることになった

Slide 38

Slide 38 text

© DeNA Co., Ltd. 38 Appendix 具体的なシステム構成や cluster-autoscaler を作ることになった話については 『GitHub Actions Meetup Tokyo #4』で話しました https://speakerdeck.com/ponkio_o/github-actions-meetup-tokyo-number-4

Slide 39

Slide 39 text

© DeNA Co., Ltd. 39 運用の取り組み

Slide 40

Slide 40 text

© DeNA Co., Ltd. 40 運用の取り組み 低コストでより良いランナーが提供できるように下記のような取り組みを行っている ● Renovate を活用した継続的なバージョンアップデート ● Grafana を活用したランナーに関するメトリクスの可視化 ● 待ち時間を SLO とした台数の調整 ● Internal roadmap による機能改善

Slide 41

Slide 41 text

© DeNA Co., Ltd. 41 Renovate を活用した継続的な バージョンアップデート

Slide 42

Slide 42 text

© DeNA Co., Ltd. 42 1 Renovate を活用した継続的なバージョンアップデート 独自で開発したコンポーネントや、Dockerfile など全ての依存関係は Renovate を利用して バージョンの更新を行っている。専用の Shareable Config を作成して8〜9割はオート マージされており、ほぼ常に最新の状態に保たれている。 ● actions/runner のバージョン ● 各種 Dockerfile のベースイメージのバージョン ● 自作のコントローラー (Golang) の各種ライブラリ ● CI/CD で利用している各種ツール

Slide 43

Slide 43 text

© DeNA Co., Ltd. 43 Appendix セルフホスト Renovate や automerge の設定の設定方針、プリセットに関する話は 『令和最新版 他人に自慢したいヤバい CI/CD LT 会 @ yabaibuki.dev #2』で話しました https://speakerdeck.com/ponkio_o/yabaibuki-dev-number-2

Slide 44

Slide 44 text

© DeNA Co., Ltd. 44 Grafana を活用したランナーに関する メトリクスの可視化

Slide 45

Slide 45 text

© DeNA Co., Ltd. 45 2 Grafana を活用したランナーの可視化 ランナーの利用状況や混雑時間帯が分かるようにダッシュボードを作成して社内に提供して おり、利用者は cron の実行タイミングやデプロイのタイミングの調整に活用している。 管理者視点ではランナーの台数最適化や社内の費用按分のデータとして活用 ● 時間 x 曜日の混雑状況ヒートマップ ● ランナー別の実行回数や実行時間 ● Organization / Repo ごとの利用状況

Slide 46

Slide 46 text

© DeNA Co., Ltd. 46 利用者向けダッシュボード

Slide 47

Slide 47 text

© DeNA Co., Ltd. 47 管理者向けダッシュボード

Slide 48

Slide 48 text

© DeNA Co., Ltd. 48 ランナー種別の利用状況ダッシュボード

Slide 49

Slide 49 text

© DeNA Co., Ltd. 49 待ち時間を SLO とした台数の調整

Slide 50

Slide 50 text

© DeNA Co., Ltd. 50 3 待ち時間を SLO とした台数の調整 ランナーを無限台数を待機させておけば理屈上待ち時間は無くなるが、現実的ではないため、 平日の業務時間帯の待ち時間 (p90) を SLO 的に扱って台数の調整を行っている。 厳密に守るというよりは「台数を増やす、増やさない」の判断材料として使っていて、コスト と相談しつつ見直すゆるめな運用

Slide 51

Slide 51 text

© DeNA Co., Ltd. 51 Internal roadmap による機能改善

Slide 52

Slide 52 text

© DeNA Co., Ltd. 52 4 Internal roadmap による機能改善 社内向けに roadmap リポジトリを作成し、機能リクエストや改善リクエストを出せるように している

Slide 53

Slide 53 text

© DeNA Co., Ltd. 53 課題と今後の展望

Slide 54

Slide 54 text

© DeNA Co., Ltd. 54 課題 利用者増加に伴い、様々な課題も ● 特定リポジトリからの過剰なジョブリクエストによる Noisy Neighbor 問題 ○ 大量のリクエストによって Enterprise Runner のリソースが食いつぶされる ● GitHub Enterprise Server への負荷 ○ Matrix などを利用したジョブによる Git LFS の並列利用 ○ コントローラーによる API 呼び出し回数の増加 ● コスト最適化

Slide 55

Slide 55 text

© DeNA Co., Ltd. 55 今後の展望 より良い開発者体験を得られるようにしていきたい ● 早く、安く使えるランナーの提供 ● SLO の見直し ○ 今だと特定のワークフローの影響を大きく受けてしまう ● 未対応ワークロードへの対応 ○ 特権コンテナの利用 ○ KVM の利用 ○ macOS ランナー

Slide 56

Slide 56 text

© DeNA Co., Ltd. 56