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

バリエーションで差をつける。myshoesの新たな挑戦 #cicd_test_night

バリエーションで差をつける。myshoesの新たな挑戦 #cicd_test_night

サイバーエージェントではGitHub Actionsのself-hosted runnerの運用ツールとしてmyshoesというOSSを開発し、社内向けに提供しています。 今回は最近のアップデートと共に、新しいmyshoesの利用事例についてご説明します。

Talked by CI/CD Test Night #6 GitHub Actionsセルフホストランナーのインフラ運用

whywaita

May 26, 2023
Tweet

More Decks by whywaita

Other Decks in Technology

Transcript

  1. Nakanishi Kento / whywaita • 株式会社サイバーエージェント 2019〜 • 業務: CAグループ向けプライベートクラウド開発

    • IaaS の開発 • OSS (myshoes) の開発 
 & OSSを⽤いたマネージドサービス PdM • 趣味: ポーカー / XREAL Air / ⾃宅インフラ
  2. 3

  3. GitHub Actionsの好きなところ • GitHubリポジトリとの連携がスムーズ • ⼀通り⼈間がほしい機能が *だいたい* ある • on.schedule,

    on.work fl ow_dispatch, matrix … • runner が Virtual Machine (not Container) • docker run が普通にできる • mkmod / dbus が普通にできる • つまり何でも動くということだ 7
  4. docker run ができる • runner内では dockerd がそのまま動いている • テストに必要なdockerコンテナ •

    例: ory/dockertest • MySQL, Redis, minio … + self build image ok • helm/kind-action • A GitHub Action for Kubernetes IN Docker 8
  5. mkmod / dbus が普通にできる iSCSI initiator のテストがうごく 
 
 


    
 9 https://github.com/lovi-cloud/go-os-brick/blob/master/test/scripts/init.sh
  6. runnerについて • 2種類が存在 • GitHub-hosted runner • GitHubが管理してくれるrunner • self-hosted

    runner • ⾃分で管理するrunner • actions/runner をVMにインストール 12
  7. runnerについて • 2種類が存在 • GitHub-hosted runner • GitHubが管理してくれるrunner • self-hosted

    runner • ⾃分で管理するrunner • actions/runner をVMにインストール 13 ⼀⻑⼀短
  8. GitHub-hosted Runner • Pros • 完全マネージド • Cons • スペックが

    2Core 7 GB 固定 • ⾃前でやるよりは⾼い 14
  9. self-hosted Runner • Pros • ⾃⼰のインフラで実⾏可能 (スペック、IP) • Cons •

    冪等性がない • self-hosted⽤terraformを管理する 
 terraformをself-hostedで動かして…… 15
  10. 17

  11. whywaita/myshoes • Auto scaling self-hosted runner 
 for GitHub Actions

    • runnerには様々な環境のインフラが利⽤可能 • OSS: https://github.com/whywaita/ myshoes 19
  12. 内部動作 - 追加時 21 Cloud Provider • AWS / GCP

    / Azure • LXD • OpenStack • etc etc … ② Send a webhook 
   to myshoes ① Request job ③ Execute provider Virtual Machine with actions/runner ④ Create an instance ⑤ Register runner
  13. 内部動作 - 削除時 22 Cloud Provider • AWS / GCP

    / Azure • LXD • OpenStack • etc etc … ① Get a list of runner ③ Execute provider Virtual Machine with actions/runner ④ Delete an instance ② Check to delete runner
  14. 内部動作 - 追加時 23 Cloud Provider • AWS / GCP

    / Azure • LXD • OpenStack • etc etc … ② Send a webhook 
   to myshoes ① Request job ③ Execute provider Virtual Machine with actions/runner ④ Create an instance ⑤ Register runner
  15. 内部動作 - 追加時 24 Cloud Provider • AWS / GCP

    / Azure • LXD • OpenStack • etc etc … ③ Execute provider Virtual Machine with actions/runner ④ Create an instance ② Send a webhook 
 ① Request job ⑤ Register runner
  16. 内部動作 - shoes provider 25 Cloud Provider Execute provider (hashicorp/go-plugin)

    Virtual Machine with actions/runner shoes-xxx Virtual Machine with actions/runner Virtual Machine with actions/runner Call API 1 .Runner Name : runnerに付けるべき名前 2 .Setup Script : actions/runner展開スクリプト 3 .Resource Type : runnerのスペック
  17. 内部動作 - shoes-aws 26 Amazon Web Services Execute provider (hashicorp/go-plugin)

    EC 2 with actions/runner shoes-aws EC 2 with actions/runner EC 2 with actions/runner Call AWS REST API 1 .Runner Name to tag “Name” 2 .Setup Script to cloud-init user-data 3 .Resource Type to AWS Instance Type
  18. 内部動作 - shoes-lxd 27 LXD server Execute provider (hashicorp/go-plugin) LXD

    Container with actions/runner shoes-lxd Call LXD REST API LXD Container with actions/runner LXD Container with actions/runner 1 .Runner Name to Instance name 2 .Setup Script to cloud-init user-data 3 .Resource Type to limits.cpu, limits.memory
  19. 様々なバリエーション • Public Cloudの安価なインスタンス • AWS Spot Instances, GCP Preemptible

    Instances • Private Cloud, ⾃宅サーバ • LXD, OpenStack • 専⽤ハードウェア対応 • GPU, FPGA 29
  20. サイバーエージェントのCI事情 • 技術選定は各プロダクトが⾏う • github.com , GitHub Enterprise Server, GitLab

    • Jenkins, Travis CI, CircleCI, Drone CI, Bitrise • エンタープライズ契約を⾏うことも 
 ex:) CircleCI Enterprise • GitHub Actionsもbeta時代から⼀部プロダクトで導⼊ 39
  21. サイバーエージェントのCI事情 • Circle CI Enterprise からGitHub Actionsへの移⾏需要 • Enterprise 契約の終了

    • コストメリットの低下 • サポートコストの増加 • Cycloudの安価な計算機資源が利⽤できるのでは? → myshoesの開発へ 40
  22. サイバーエージェントにおけるmyshoes構成 • whywaita/myshoes + shoes-lxd-multi • LXD (LinuX Container Daemon)

    • マルチテナント提供: myshoes-controller • MySQL Cluster (with orchestrator) • Docker Registry v 2 , LXD image server 42
  23. Kubernetes Cluster サイバーエージェントにおけるmyshoes構成 43 myshoes-proxy (Global IP) github.com GHES User

    Tenant A Tenant B webhook myshoes REST API Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) k 8 s Service k 8 s Service for Service X for Service Y k 8 s Service Tenant C k 8 s Service
  24. 既存 Cycloud サイバーエージェントにおけるmyshoes構成 44 Tenant A Tenant B Stadium VM

    Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) k 8 s Service k 8 s Service for Service X for Service Y k 8 s Service Tenant C k 8 s Service Service VM Service VM Service VM 既存 Cycloud ユーザは 
 ⾃テナントのVMとの接続が可能 
 他テナントのVMとの接続は不可
  25. サイバーエージェントでの規模感 • Stadium台数: 約80台 ( 1 6 c 160 gb)

    • 導⼊数: 約50チーム / プロダクト • Linux版GAから: 1年8ヶ⽉ • 1⽇の実⾏job数: 約1万個 • 常時500〜700インスタンスぐらい 46
  26. サイバーエージェントでの規模感 mysql> SELECT SUM(TIMESTAMPDIFF(second, started_at, ended_at)) FROM job_logging WHERE started_at

    IS NOT NULL; +--------------------------------------------------+ | SUM(TIMESTAMPDIFF(second, started_at, ended_at)) | +--------------------------------------------------+ | 460269137 | +--------------------------------------------------+ 1 row in set (2.03 sec) 48
  27. サイバーエージェントでの規模感 mysql> SELECT SUM(TIMESTAMPDIFF(second, started_at, ended_at)) FROM job_logging WHERE started_at

    IS NOT NULL; +--------------------------------------------------+ | SUM(TIMESTAMPDIFF(second, started_at, ended_at)) | +--------------------------------------------------+ | 460269137 | +--------------------------------------------------+ 1 row in set (2.03 sec) 49 4億秒 🎉
  28. 51

  29. macOS runner • ⾃社DCにMac miniを設置 • M 2 Mac mini

    (2023) を採⽤ • テナント毎にMac miniを割当、提供 • macOS runner 仮想化には UTM を採⽤ • https://mac.getutm.app 54
  30. Kubernetes Cluster サイバーエージェントにおけるmyshoes構成 (今まで) 56 myshoes-proxy (Global IP) github.com GHES

    User Tenant A Tenant B webhook myshoes REST API Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) k 8 s Service k 8 s Service for Service X for Service Y k 8 s Service Tenant C k 8 s Service
  31. Kubernetes Cluster サイバーエージェントにおけるmyshoes構成 (今まで) 57 Tenant A Stadium VM Stadium

    VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Stadium VMs LXD (listen 8 44 3 ) for Service X shoes-lxd-multi shoes-lxd-multi-server ① Execute ② RPC call ③ Schedule
  32. Kubernetes Cluster サイバーエージェントにおけるmyshoes構成 (これから) 58 Tenant A Stadium VM Stadium

    VM Stadium VMs LXD (listen 8 44 3 ) Stadium VM Stadium VM Mac mini x N for Service X shoes-label-router shoes-lxd-multi-server ① Execute ② RPC call ③ Schedule shoes-macos-server
  33. shoes-label-router • myshoes provider • runs-on の記述を元に処理を実⾏ • Linux or

    macOS (RPC calls先を決定) • resource_type • OS version 
 59 runs-on: myshoes_linux_large_22.04 runs-on: myshoes_macos_large_12
  34. shoes-label-router • myshoes provider • runs-on の記述を元に処理を実⾏ • Linux or

    macOS (RPC calls先を決定) • resource_type • OS version 
 60 runs-on: myshoes_linux_large_22.04 runs-on: myshoes_macos_large_12 ユーザは runs-onを 変えるだけでOK!
  35. macOS runner 利⽤状況 / 今後の展望 • 複数のプロダクトで利⽤開始 • iOS向けアプリビルドがメイン •

    仮想化周りのアップデートはあるかも • GitHubはankaを使っているっぽい?[1] • OSS化も…… 61 [ 1 ]: https://github.com/actions/runner-images/blob/ 
 b 8 9 2 aebfe 8 a 9 c 861 adb 84 7 2 a 8 e 0499 1 5 aad 8441 1 / 
 images/macos/templates/macOS- 1 3 .arm 6 4 .anka.pkr.hcl