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

Kubernetes だけじゃない!Amazon ECS で実現するクラウドネイティブな Gi...

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for YuyaKoda YuyaKoda PRO
November 28, 2024

Kubernetes だけじゃない!Amazon ECS で実現するクラウドネイティブな GitHub Actions セルフホストランナー / CNDW2024

Avatar for YuyaKoda

YuyaKoda PRO

November 28, 2024
Tweet

More Decks by YuyaKoda

Other Decks in Technology

Transcript

  1. © DeNA Co., Ltd. 1 Kubernetes だけじゃない! Amazon ECS で実現するクラウドネイティブな

    GitHub Actions セルフホストランナー 幸田優哉 IT 本部品質管理部 SWET 第二グループ 株式会社ディー・エヌ・エー
  2. © DeNA Co., Ltd. 2 Yuya Koda DeNA の SWET

    (SoftWare Engineer in Test) チーム所属 お仕事は全社向けに提供している GitHub Actions セルフホストランナーをいい感じにすることです。 最近のマイブームは立ち飲み屋さん巡り DeNA IT 本部品質管理部 SWET 第二グループ ponkio_o © DeNA Co., Ltd. 自己紹介 koday.me
  3. © DeNA Co., Ltd. 3 今日話すこと、話さないこと 話すこと • [前半] 全社用ランナーの概要と設計及び技術選定

    • [後半] 全社用ランナーの運用について 話さないこと • GitHub Actions のワークフローについて • Amazon ECS / Kubernetes の詳しい話 • セルフホストランナーの技術的な話 (多少は出てきますが)
  4. © DeNA Co., Ltd. 5 セルフホストランナーとは • セルフホストランナーは GitHub Actions

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

    Server (GHES) は、GitHub-hosted Runner に対応していないため ◦ つまり runs-on: ubuntu-latest できない • セキュリティ的な事情で、開発時に自前のインフラ上での Job の実行が要求されるケー スがある → DeNA では GHES の利用がメインであるため GitHub Actions を利用するためにはセルフ ホストランナーの運用が必須となる
  6. © DeNA Co., Ltd. 12 全社用ランナーで定めた要件 簡単に構築できるランナーも、「全社向け」に提供するとなると考慮事項がたくさん出てくる 構築や OSS を検討する前に、まずは次のような要件を定めた

    1. 実行環境をジョブごとに確実に隔離可能であること 2. Enterprise Runner として構成可能であること 3. 少人数で運用し続けられること
  7. © DeNA Co., Ltd. 13 実行環境をジョブごとに確実に隔離可能であること 社内には秘匿性の高いプロジェクトも存在するため、他のプロジェクトの実行環境と ファイルやネットワークが確実に隔離されることは必須要件 例えば、次のようなことは絶対に起きないように設計する必要があった •

    ディレクトリを移動すると他のプロジェクトのソースコードが見えてしまう • 各サービスの認証情報が残ってしまう • docker ps した時に他のプロジェクトのコンテナが見えてしまう • ネットワーク越しに他のジョブにアクセスできてしまう 1
  8. © DeNA Co., Ltd. 14 Enterprise Runner として構成可能であること セルフホストランナーはいくつかのスコープでランナーを登録することができるが、 リソースの最適化のために

    Enterprise Runner を利用したかった Enterprise Organization Repository Repository Enterprise Runner (全 Organization / Repository で利用可能) Organization Runner (特定 Organization 内で利用可能) Repository Runner (特定 Repository でのみ利用可能) 2 Organization
  9. © DeNA Co., Ltd. 15 少人数で運用し続けられること 「動かし続ける」ために運用コストも外せない要件の1つ • 当時の SWET

    メンバーは3人 ◦ セルフホストランナーの専任は1人 (自分) のみ • 当時想定されていた主なタスク ◦ ランナーが動く何らかの実行基盤 (ECS, k8s…etc) の保守・運用 ◦ ランナー本体のアップデート ◦ ランナーを動かすコンテナのアップデート ◦ その他、障害発生時の調査など 3
  10. © DeNA Co., Ltd. 18 actions/actions-runner-controller Kubernetes のカスタムコントローラーで、カスタムリソースとしてランナーを管理できる (現在は) GitHub

    公式の OSS で、ランナー部分はコンテナ (Pod) で動作する • セルフホストランナーに必要な機能がほぼ入っている • GitHub 公式サポート • Enterprise ランナー対応 1 アーキテクチャ図 (公式ドキュメントより)
  11. © DeNA Co., Ltd. 19 philips-labs/terraform-aws-github-runner AWS のサーバレス系のサービスを利用して、ランナーをスケールさせるコントローラーを 構築するための Terraform

    Module で、ランナー部分は VM (EC2) で動作する • セルフホストランナーに必要な機能がほぼ入っている • サーバレス系サービスでコントローラーが完結する • Enterprise Runner 非対応 2 アーキテクチャ図 (README より)
  12. © DeNA Co., Ltd. 21 Container vs VM 最初に紹介した通り、actions/runner は任意の場所で実行可能だが、次のような理由から

    VM よりも優位であると判断しコンテナを利用して動かすことにした • 実行環境を隔離しつつ1つの VM (EC2) で複数台のランナーが動かせる ◦ 1ジョブにつき1プロセス使用するので、いかに効率よく並列数を稼ぐかが大事 • クリーンな実行環境を作りやすい • デプロイなどを自動化しやすい • プリインストールツールなどの保守が楽
  13. © DeNA Co., Ltd. 22 OSS の比較検討 2つの OSS を比較すると

    ARC は概ね要件を満たしていたが、最終的に採用しなかった actions-runner-controller (ARC) terraform-aws-github-runner ジョブの実行環境隔離 ◯ ◯ コンテナで動作可能 ◯ X Enterprise Runner の対応 ◯ X 運用・保守 △ ◯
  14. © DeNA Co., Ltd. 24 前提 当時の状況は次のとおり • チームで既に運用されている Kubernetes

    クラスタが存在しなかった (※1) ◦ 今回のために新しくクラスタを構築する必要があった • (自分含め) メンバーは Kubernetes を触った経験はあるが、深い知見があるわけではない ◦ また新規メンバーのキャッチアップにも時間がかかると感じた • セルフホストランナー専任のメンバーは自分だけで、他のメンバーは兼任 • 既に ECS で作られた PoC が存在していた ◦ ECS でも概ね実現可能であることは見えていた ※1) 厳密には存在するがまともにメンテできていない 😇
  15. © DeNA Co., Ltd. 26 1 クラスタアップデートの運用コスト Kubernetes は4ヶ月に一度のアップデートが存在し、継続的にこれらのバージョンアップ に付き合っていく必要があり、マネージド

    Kubernetes であってもそこそこ大変 • コントロールプレーンのアップデート ◦ これ単体で言えばマネージドの場合にはほぼ気にしなくても良い • 非推奨 API への対応 • アップグレード戦略 ポイント マネージド Kubernetes の場合1クリックでコントロールプレーンの更新が完結するが、果たして それだけなのか?また限られた人員で継続することは可能か?
  16. © DeNA Co., Ltd. 27 2 エコシステムの保守 Kubernetes はそれ単体で使うことは少なく、何かしらのエコシステムと共に使われること が多い。必須ではないものの、導入した場合にはそれらの設計も別途必要になる

    • デプロイとマニフェスト管理 ◦ ArgoCD / Flux • オートスケーリング ◦ VPA / HPA / CA • シークレット管理 ◦ ESO (External Secrets Operator) ポイント 追加でどのようなコンポーネントが必要になるか?またそれらの保守は続けられるか?
  17. © DeNA Co., Ltd. 28 3 Platform としての Kubernetes Kubernetes

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

    ◦ マネージドサービスならコントロールプレーンの管理は気にしなくても OK • Kubernetes の場合、直接的にランナーに関係しないエコシステムの保守が大変そう ◦ バージョンアップ起因でバグったりすることはそこそこある ◦ それによる考慮事項も増えそうだった • 払う運用コストに見合うリターンが期待できなかった ◦ 悪い言い方をすると運用コストのかかる「ランナー動かす君」になりそうだった
  19. © DeNA Co., Ltd. 31 最終的に 最終的に下記のような方針で、ランナーの基盤を構築することにした • Amazon ECS

    (on EC2) をベースに構築する ◦ Fargate は技術的な制約で利用できなかった ▪ 主に docker in docker を実現するのが難しかった • ジョブの需要に応じてスケールアウトするためのコントローラーは自作する • マネージドサービスで代替可能なものはマネージドサービスを利用する ◦ オートスケーリング、シークレット管理、メトリクス
  20. © DeNA Co., Ltd. 34 1 クラスタ管理がほぼ不要 やはりクラスタの面倒をほとんど見なくてもいいのは大きい • コントロールプレーンは一切管理不要

    ◦ さらに利用に伴う追加料金もなし • ECS の API や ECS Agent に対する破壊的変更が入ることはほぼない • ECS インスタンスは基本的に ECS Optimized AMI を使っておけば OK
  21. © 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 が利用可能
  22. © DeNA Co., Ltd. 37 少し微妙かも?と思っているポイント ECS ならではの大変さもあり、もちろん Kubernetes や

    ARC が羨ましくなる時もある • 車輪の再発明 (主にランナーのオートスケール部分) ◦ 自分たちで作ることを決めた以上これは仕方ないですが… ▪ 基本的には AWS の API を呼ぶだけなので実装はシンプルになることが多い • Kubernetes に比べると否めない機能不足感 ◦ 特にスケジューリングやスケーリング周りに機能不足を感じる ◦ 実際に ECS 標準だとクラスタのスケールアウト速度が遅かったので独自の cluster-autoscaler を作ることになった
  23. © DeNA Co., Ltd. 38 Appendix 具体的なシステム構成や cluster-autoscaler を作ることになった話については 『GitHub

    Actions Meetup Tokyo #4』で話しました https://speakerdeck.com/ponkio_o/github-actions-meetup-tokyo-number-4
  24. © DeNA Co., Ltd. 40 運用の取り組み 低コストでより良いランナーが提供できるように下記のような取り組みを行っている • Renovate を活用した継続的なバージョンアップデート

    • Grafana を活用したランナーに関するメトリクスの可視化 • 待ち時間を SLO とした台数の調整 • Internal roadmap による機能改善
  25. © DeNA Co., Ltd. 42 1 Renovate を活用した継続的なバージョンアップデート 独自で開発したコンポーネントや、Dockerfile など全ての依存関係は

    Renovate を利用して バージョンの更新を行っている。専用の Shareable Config を作成して8〜9割はオート マージされており、ほぼ常に最新の状態に保たれている。 • actions/runner のバージョン • 各種 Dockerfile のベースイメージのバージョン • 自作のコントローラー (Golang) の各種ライブラリ • CI/CD で利用している各種ツール
  26. © DeNA Co., Ltd. 43 Appendix セルフホスト Renovate や automerge

    の設定の設定方針、プリセットに関する話は 『令和最新版 他人に自慢したいヤバい CI/CD LT 会 @ yabaibuki.dev #2』で話しました https://speakerdeck.com/ponkio_o/yabaibuki-dev-number-2
  27. © DeNA Co., Ltd. 45 2 Grafana を活用したランナーの可視化 ランナーの利用状況や混雑時間帯が分かるようにダッシュボードを作成して社内に提供して おり、利用者は

    cron の実行タイミングやデプロイのタイミングの調整に活用している。 管理者視点ではランナーの台数最適化や社内の費用按分のデータとして活用 • 時間 x 曜日の混雑状況ヒートマップ • ランナー別の実行回数や実行時間 • Organization / Repo ごとの利用状況
  28. © DeNA Co., Ltd. 50 3 待ち時間を SLO とした台数の調整 ランナーを無限台数を待機させておけば理屈上待ち時間は無くなるが、現実的ではないため、

    平日の業務時間帯の待ち時間 (p90) を SLO 的に扱って台数の調整を行っている。 厳密に守るというよりは「台数を増やす、増やさない」の判断材料として使っていて、コスト と相談しつつ見直すゆるめな運用
  29. © DeNA Co., Ltd. 52 4 Internal roadmap による機能改善 社内向けに

    roadmap リポジトリを作成し、機能リクエストや改善リクエストを出せるように している
  30. © DeNA Co., Ltd. 54 課題 利用者増加に伴い、様々な課題も • 特定リポジトリからの過剰なジョブリクエストによる Noisy

    Neighbor 問題 ◦ 大量のリクエストによって Enterprise Runner のリソースが食いつぶされる • GitHub Enterprise Server への負荷 ◦ Matrix などを利用したジョブによる Git LFS の並列利用 ◦ コントローラーによる API 呼び出し回数の増加 • コスト最適化
  31. © DeNA Co., Ltd. 55 今後の展望 より良い開発者体験を得られるようにしていきたい • 早く、安く使えるランナーの提供 •

    SLO の見直し ◦ 今だと特定のワークフローの影響を大きく受けてしまう • 未対応ワークロードへの対応 ◦ 特権コンテナの利用 ◦ KVM の利用 ◦ macOS ランナー