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. バリエーションで差をつける。


    myshoesの新たな挑戦
    株式会社サイバーエージェント CIU Development div

    Nakanishi Kento @whywaita


    CI/CD Test Night #
    6
    @
    2
    02 3
    /
    0 5
    /
    2 6
    #cicd_test_night

    View full-size slide

  2. Nakanishi Kento / whywaita
    • 株式会社サイバーエージェント 2019〜


    • 業務: CAグループ向けプライベートクラウド開発


    • IaaS の開発


    • OSS (myshoes) の開発

    & OSSを⽤いたマネージドサービス PdM


    • 趣味: ポーカー / XREAL Air / ⾃宅インフラ

    View full-size slide

  3. 4
    オススメです

    View full-size slide

  4. 5
    閑話休題

    View full-size slide

  5. GitHub Actionsの

    runner事情
    6

    View full-size slide

  6. GitHub Actionsの好きなところ
    • GitHubリポジトリとの連携がスムーズ


    • ⼀通り⼈間がほしい機能が *だいたい* ある


    • on.schedule, on.work
    fl
    ow_dispatch, matrix



    • runner が Virtual Machine (not Container)


    • docker run が普通にできる


    • mkmod / dbus が普通にできる


    • つまり何でも動くということだ
    7

    View full-size slide

  7. 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

    View full-size slide

  8. mkmod / dbus が普通にできる
    iSCSI initiator のテストがうごく




    9
    https://github.com/lovi-cloud/go-os-brick/blob/master/test/scripts/init.sh

    View full-size slide

  9. mkmod / dbus が普通にできる
    LXDを動かしてpacker buildできる




    10
    https://github.com/whywaita/actions-runner-images-lxd

    View full-size slide

  10. 便利 ✨
    11

    View full-size slide

  11. runnerについて
    • 2種類が存在


    • GitHub-hosted runner


    • GitHubが管理してくれるrunner


    • self-hosted runner


    • ⾃分で管理するrunner


    • actions/runner をVMにインストール
    12

    View full-size slide

  12. runnerについて
    • 2種類が存在


    • GitHub-hosted runner


    • GitHubが管理してくれるrunner


    • self-hosted runner


    • ⾃分で管理するrunner


    • actions/runner をVMにインストール
    13
    ⼀⻑⼀短

    View full-size slide

  13. GitHub-hosted Runner
    • Pros


    • 完全マネージド


    • Cons


    • スペックが 2Core
    7
    GB 固定


    • ⾃前でやるよりは⾼い
    14

    View full-size slide

  14. self-hosted Runner
    • Pros


    • ⾃⼰のインフラで実⾏可能 (スペック、IP)


    • Cons


    • 冪等性がない


    • self-hosted⽤terraformを管理する

    terraformをself-hostedで動かして……
    15

    View full-size slide

  15. そんなときに便利なのが……
    16

    View full-size slide

  16. whywaita/myshoes
    • Auto scaling self-hosted runner

    for GitHub Actions


    • runnerには様々な環境のインフラが利⽤可能


    • OSS: https://github.com/whywaita/
    myshoes
    19

    View full-size slide

  17. whywaita/myshoes
    • runnerには様々な環境のインフラが利⽤可能


    • hashicorp/go-plugin を利⽤


    • terraformが内部で利⽤しているプラグイン


    • shoes-aws, shoes-gcp, shoes-openstack, shoes-
    lxd etc etc...


    • https://github.com/topics/myshoes-provider
    20

    View full-size slide

  18. 内部動作 - 追加時
    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

    View full-size slide

  19. 内部動作 - 削除時
    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

    View full-size slide

  20. 内部動作 - 追加時
    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

    View full-size slide

  21. 内部動作 - 追加時
    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

    View full-size slide

  22. 内部動作 - 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のスペック

    View full-size slide

  23. 内部動作 - 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

    View full-size slide

  24. 内部動作 - 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

    View full-size slide

  25. バリエーションが産まれる ✨
    28

    View full-size slide

  26. 様々なバリエーション
    • Public Cloudの安価なインスタンス


    • AWS Spot Instances, GCP Preemptible Instances


    • Private Cloud, ⾃宅サーバ


    • LXD, OpenStack


    • 専⽤ハードウェア対応


    • GPU, FPGA
    29

    View full-size slide

  27. サイバーエージェントにおける

    myshoesの活⽤事例
    30

    View full-size slide

  28. 31
    プライベートクラウド

    View full-size slide

  29. プライベートクラウド
    32
    •社内(CAグループ)向けクラウド基盤


    •特徴


    •社内の需要に合わせた物理設計


    •⼀括購⼊によるコストメリット


    •安価に計算機資源を利⽤可能

    View full-size slide

  30. Cycloud
    33
    •Cy(berAgent)cloud


    •各種サービスの提供


    •IaaS / KaaS / PaaS / ML Platform


    •Cycloud-hosted runner (myshoes)

    View full-size slide

  31. 34
    https://www.tomorrow-net.co.jp/case_detail/cyberagent/

    View full-size slide

  32. 35
    https://www.cyberagent.co.jp/news/detail/id=
    2 84 8
    4

    View full-size slide

  33. 36
    https://isucon.net/archives/
    55 5
    3 3
    0 13
    .html

    View full-size slide

  34. プライベートクラウド
    37
    •社内(CAグループ)向けクラウド基盤


    •特徴


    •社内の需要に合わせた物理設計


    •⼀括購⼊によるコストメリット


    •安価に計算機資源を利⽤可能

    View full-size slide

  35. 38
    安価に計算機資源を利⽤可能



    CIサービスの提供に向いている 💯

    View full-size slide

  36. サイバーエージェントのCI事情
    • 技術選定は各プロダクトが⾏う


    • github.com , GitHub Enterprise Server, GitLab


    • Jenkins, Travis CI, CircleCI, Drone CI, Bitrise


    • エンタープライズ契約を⾏うことも

    ex:) CircleCI Enterprise


    • GitHub Actionsもbeta時代から⼀部プロダクトで導⼊
    39

    View full-size slide

  37. サイバーエージェントのCI事情
    • Circle CI Enterprise からGitHub Actionsへの移⾏需要


    • Enterprise 契約の終了


    • コストメリットの低下


    • サポートコストの増加


    • Cycloudの安価な計算機資源が利⽤できるのでは?


    → myshoesの開発へ
    40

    View full-size slide

  38. サイバーエージェント では
    • myshoesをマネージドサービスとして提供


    • Cycloudユーザでも⾮ユーザでも利⽤可


    • GHES, GHEC, github.com 全対応


    • 社内のほぼ全てのユースケースに対応


    • マルチテナントとして提供
    41

    View full-size slide

  39. サイバーエージェントにおけるmyshoes構成
    • whywaita/myshoes + shoes-lxd-multi


    • LXD (LinuX Container Daemon)


    • マルチテナント提供: myshoes-controller


    • MySQL Cluster (with orchestrator)


    • Docker Registry v
    2
    , LXD image server
    42

    View full-size slide

  40. 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

    View full-size slide

  41. 既存 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との接続は不可

    View full-size slide

  42. サイバーエージェントにおけるmyshoes仕様
    • Cycloud VMをStadiumとしGitHub-hostedよりも安価に提供


    • LXDイメージはGitHub-hostedとほぼ同じイメージを利⽤


    • https://github.com/whywaita/actions-runner-images-lxd


    • runnerスペック 2Core
    2
    0
    GB ~
    1
    6
    Core
    1 60
    GB


    • 起動時間は約1分程度


    • 詳細は https://speakerdeck.com/whywaita/cadc
    2 0
    2 2
    -github-actions-runner-myshoes
    45

    View full-size slide

  43. サイバーエージェントでの規模感
    • Stadium台数: 約80台 (
    1 6
    c
    160
    gb)


    • 導⼊数: 約50チーム / プロダクト


    • Linux版GAから: 1年8ヶ⽉


    • 1⽇の実⾏job数: 約1万個


    • 常時500〜700インスタンスぐらい
    46

    View full-size slide

  44. サイバーエージェントでの規模感
    47

    View full-size slide

  45. サイバーエージェントでの規模感
    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

    View full-size slide

  46. サイバーエージェントでの規模感
    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億秒 🎉

    View full-size slide

  47. サイバーエージェントに


    おけるmyshoes

    新たなるバリエーションの
    登場
    50

    View full-size slide

  48. Cycloud-hosted runner (myshoes)


    macOS runner


    became General Availability! 🎉
    53

    View full-size slide

  49. macOS runner
    • ⾃社DCにMac miniを設置


    • M
    2
    Mac mini (2023) を採⽤


    • テナント毎にMac miniを割当、提供


    • macOS runner 仮想化には UTM を採⽤


    • https://mac.getutm.app
    54

    View full-size slide

  50. macOS runner
    • Linux版と同じ仕様


    • jobを検知し都度VMを作成


    • OSは actions/runner-images ベース
    55

    View full-size slide

  51. 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

    View full-size slide

  52. 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

    View full-size slide

  53. 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

    View full-size slide

  54. 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

    View full-size slide

  55. 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!

    View full-size slide

  56. 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

    View full-size slide

  57. 今後の展望
    62
    •whywaita/myshoes として


    •GitHubが何かやってきそうなので (Job server)

    その対応


    •社内向けサービスとして


    •runner起動⾼速化


    •物理サーバ提供

    View full-size slide

  58. まとめ
    63
    •whywaita/myshoes のご紹介


    •サイバーエージェントにおける取り組みのご紹介


    •myshoes + LXD で社内向けに提供しています


    •macOS runner始めました 🍎🏃


    •M
    2
    Mac miniベースに提供開始


    •We are hiring!

    View full-size slide