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

CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2...

whywaita
September 03, 2021
51

CyberAgent における OSS の CI/CD 基盤開発 myshoes #CICD2021

talked by CI/CD Conference 2021 by CloudNative Days https://event.cloudnativedays.jp/cicd2021

Original: https://www.slideshare.net/whywaita/cyberagent-oss-cicd-myshoes-cicd2021

This slide is re-upload by the author.

whywaita

September 03, 2021
Tweet

More Decks by whywaita

Transcript

  1. CyberAgent における OSS の CI/CD 基盤開発 myshoes 編 株式会社サイバーエージェント CyberAgent

    group Infrastructure Unit Private Cloud Team Cloud Maker / Nakanishi Kento @whywaita CI/CD Conference by CloudNative Days @ ONLINE / / 1
  2. Nakanishi Kento / whywaita • CloudMaker since CyberAgent group Infrastructure

    Unit Private Cloud team • 業務: OpenStack / Kubernetes を使った新機能開発 • 趣味: ⾃宅インフラ / アニソン • AS (CA-LAB) Founderになりました • 好きなCI: GitHub Actions, GitLab CI 2
  3. GitHub Actionsの好きなところ • GitHubリポジトリとの連携がスムーズ • ⼀通り⼈間がほしい機能が *だいたい* ある • on.schedule,

    on.workflow_dispatch, matrix • runner が Virtual Machine (not Container) • docker run が普通にできる • mkmod / dbus が普通にできる • つまり何でも動くということだ 5
  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 6
  5. runnerについて • 2種類が存在 • GitHub-hosted runner • GitHubが管理してくれるrunner • self-hosted

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

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

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

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

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

    self-hosted runner をjobごとに⽣成、登録 • runnerにはそれぞれの環境のインフラが利⽤可能 • shoes-aws, shoes-lxd, shoes-openstack, ⾃作も可 • OSS: https://github.com/whywaita/myshoes 17
  11. runner 仕様まとめ • 毎回再作成されるため冪等性アリ • matrix 対応 • N個 jobがある場合はN個

    runnerを作成 • イメージはshoes providerごとに指定可能 • GitHub-hostedに限りなく近くする事推奨 23
  12. 内部動作 - 追加時 24 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. 内部動作 - 削除時 25 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. 内部動作 - 追加時 26 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. 内部動作 - 追加時 27 Cloud Provider • AWS / GCP

    / Azure • LXD • OpenStack • etc etc ③ Execute provider Virtual Machine with actions/runner ④ Create an instance ② Send a webhook   to myshoes ① Request job ⑤ Register runner
  16. 内部動作 - shoes provider 28 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 .Runner Name : runnerに付けるべき名前 .Setup Script : actions/runner展開スクリプト .Resource Type : runnerのスペック
  17. 内部動作 - shoes-aws 29 Amazon Web Services Execute provider (hashicorp/go-plugin)

    EC with actions/runner shoes-aws EC with actions/runner EC with actions/runner Call AWS REST API .Runner Name to tag “Name” .Setup Script to cloud-init user-data .Resource Type to AWS Instance Type
  18. 内部動作 - shoes-lxd 30 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 .Runner Name to Instance name .Setup Script to cloud-init user-data .Resource Type to limits.cpu, limits.memory
  19. 夢がひろがるmyshoes-provider • Public Cloudの安価なインスタンス • AWS Spot Instances, GCP Preemptible

    Instances • Private Cloud, ⾃宅サーバ • LXD, OpenStack • 専⽤ハードウェア対応 • GPU, FPGA 31
  20. 前提知識: Cycloud • Cy(berAgent)cloud • Private Cloud • IaaS, Managed

    Service • サイバーエージェント向けにカスタマイズ • 安価に計算機資源を利⽤可 🥰 33
  21. CyberAgentのCI事情 • 技術選定は各プロダクトが⾏う • github.com , GitHub Enterprise Server, GitLab

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

    • コストメリットの低下 • サポートコストの増加 • Cycloudの安価な計算機資源が利⽤できるのでは? → myshoesの開発へ 35
  23. CyberAgent では • myshoesをマネージドサービスとして提供 • Cycloudユーザでも⾮ユーザでも利⽤可 • GHES, GHEC, github.com

    全対応 • 社内のほぼ全てのユースケースに対応 • マルチテナントとして提供 36
  24. CyberAgentにおけるmyshoes構成 • whywaita/myshoes + shoes-lxd • マルチテナント提供: myshoes-controller • Kubernetes

    Controller • MySQL Cluster (with orchestrator) • Docker Registry v , LXD image server 37
  25. Kubernetes Cluster CyberAgentにおけるmyshoes構成 38 myshoes-proxy (Global IP) github.com GHES User

    Tenant A Tenant B webhook myshoes REST API Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) k s Service k s Service for Service X for Service Y k s Service Tenant C k s Service
  26. Kubernetes Cluster CyberAgentにおけるmyshoes構成 39 myshoes-proxy (Global IP) github.com GHES User

    Tenant A Tenant B webhook myshoes REST API Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) k s Service k s Service for Service X for Service Y k s Service Tenant C k s Service myshoes-proxy • HTTPプロキシ • webhook from GitHub • myshoes REST API • Prometheusメトリクス • Kubernetes Pod • svc.cluster.local 利⽤
  27. Kubernetes Cluster CyberAgentにおけるmyshoes構成 40 myshoes-proxy (Global IP) github.com GHES User

    Tenant A Tenant B webhook myshoes REST API Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) k s Service k s Service for Service X for Service Y k s Service Tenant C k s Service myshoes-controller • operator-sdk • Tenant Resource • Service, Secret, Deployment
  28. Kubernetes Cluster CyberAgentにおけるmyshoes構成 41 myshoes-proxy (Global IP) github.com GHES User

    Tenant A Tenant B webhook myshoes REST API Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) k s Service k s Service for Service X for Service Y k s Service Tenant C k s Service • shoes-lxd • job実⾏ごとに LXDインスタンス作成 • CoW + dockerdのためbtrfs • btrfs subvolume • NVMe volumeを直接利⽤
  29. Kubernetes Cluster CyberAgentにおける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 ) Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) k s Service k s Service for Service X for Service Y k s Service Tenant C k s Service
  30. CyberAgentにおけるmyshoes構成 44 Tenant A Tenant B Stadium VM Stadium VM

    Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) k s Service k s Service for Service X for Service Y k s Service Tenant C k s Service
  31. 既存 Cycloud CyberAgentにおけるmyshoes構成 45 Tenant A Tenant B Stadium VM

    Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) k s Service k s Service for Service X for Service Y k s Service Tenant C k s Service Service VM Service VM Service VM
  32. 既存 Cycloud CyberAgentにおけるmyshoes構成 46 Tenant A Tenant B Stadium VM

    Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) k s Service k s Service for Service X for Service Y k s Service Tenant C k s Service Service VM Service VM Service VM
  33. 既存 Cycloud CyberAgentにおけるmyshoes構成 47 Tenant A Tenant B Stadium VM

    Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) Stadium VM Stadium VM Stadium VMs LXD (listen ) k s Service k s Service for Service X for Service Y k s Service Tenant C k s Service Service VM Service VM Service VM 既存 Cycloud ユーザは ⾃テナントのVMとの接続が可能 他テナントのVMとの接続は不可
  34. 今後の展望 • OSSとして • shoes provider, Documentsの拡充 • ⼿動オペレーションの絶滅 •

    マネージドサービスとして (要望次第) • GPU runner ? • macOS runner? 49
  35. まとめ • GitHub Actionsについて説明 • Pros / Cons, runnerについて •

    whywaita/myshoes つくりました • 便利に、安価にGitHub Actionsをつかえます • 引き続き運⽤ / 機能開発していきます • 使ってみたレポ、Issue、PRお待ちしております! 50