Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

Nakanishi Kento / whywaita • CloudMaker since CyberAgent group Infrastructure Unit Private Cloud team • 業務: OpenStack / Kubernetes を使った新機能開発 • 趣味: ⾃宅インフラ / アニソン • AS (CA-LAB) Founderになりました • 好きなCI: GitHub Actions, GitLab CI 2

Slide 3

Slide 3 text

.GitHub Actionsのrunner事情 .myshoesとは .CyberAgentにおけるmyshoesの活⽤事例 3

Slide 4

Slide 4 text

GitHub Actionsの runner事情 4

Slide 5

Slide 5 text

GitHub Actionsの好きなところ • GitHubリポジトリとの連携がスムーズ • ⼀通り⼈間がほしい機能が *だいたい* ある • on.schedule, on.workflow_dispatch, matrix • runner が Virtual Machine (not Container) • docker run が普通にできる • mkmod / dbus が普通にできる • つまり何でも動くということだ 5

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

mkmod / dbus が普通にできる iSCSI initiator のテストがうごく 7 https://github.com/lovi-cloud/go-os-brick/blob/master/test/scripts/init.sh

Slide 8

Slide 8 text

mkmod / dbus が普通にできる LXDを動かしてpacker buildできる 8 https://github.com/whywaita/virtual-environments-lxd

Slide 9

Slide 9 text

便利 ✨ 9

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

GitHub-hosted Runner • Pros • 完全マネージド • Cons • スペックが 2Core GB 固定 • ⾃前でやるよりは⾼い 12

Slide 13

Slide 13 text

self-hosted Runner • Pros • ⾃⼰のインフラで実⾏可能 (スペック、IP) • Cons • 冪統性がない • self-hosted⽤terraformを管理する terraformをself-hostedで動かして…… 13

Slide 14

Slide 14 text

そんなときに便利なのが…… 14

Slide 15

Slide 15 text

15

Slide 16

Slide 16 text

16 とは (OSSとして)

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

利⽤イメージ - ジョブ実⾏ 18 Jobを実⾏すると……

Slide 19

Slide 19 text

利⽤イメージ - runner作成 19 myshoesによって⾃動で追加

Slide 20

Slide 20 text

利⽤イメージ - ジョブ終了 20 Jobが終了すると……

Slide 21

Slide 21 text

利⽤イメージ - runner削除 21 myshoesによって⾃動で削除

Slide 22

Slide 22 text

GitHub-hosted と同じ使い⼼地を実現 22

Slide 23

Slide 23 text

runner 仕様まとめ • 毎回再作成されるため冪等性アリ • matrix 対応 • N個 jobがある場合はN個 runnerを作成 • イメージはshoes providerごとに指定可能 • GitHub-hostedに限りなく近くする事推奨 23

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

夢がひろがるmyshoes-provider • Public Cloudの安価なインスタンス • AWS Spot Instances, GCP Preemptible Instances • Private Cloud, ⾃宅サーバ • LXD, OpenStack • 専⽤ハードウェア対応 • GPU, FPGA 31

Slide 32

Slide 32 text

CyberAgentにおける myshoesの活⽤事例 32

Slide 33

Slide 33 text

前提知識: Cycloud • Cy(berAgent)cloud • Private Cloud • IaaS, Managed Service • サイバーエージェント向けにカスタマイズ • 安価に計算機資源を利⽤可 🥰 33

Slide 34

Slide 34 text

CyberAgentのCI事情 • 技術選定は各プロダクトが⾏う • github.com , GitHub Enterprise Server, GitLab • Jenkins, Travis CI, CircleCI, Drone CI, Bitrise • エンタープライズ契約を⾏うことも ex:) CircleCI Enterprise • GitHub Actionsもbeta時代から⼀部プロダクトで導⼊ 34

Slide 35

Slide 35 text

CyberAgentのCI事情 • Circle CI Enterprise からGitHub Actionsへの移⾏需要 • Enterprise 契約の終了 • コストメリットの低下 • サポートコストの増加 • Cycloudの安価な計算機資源が利⽤できるのでは? → myshoesの開発へ 35

Slide 36

Slide 36 text

CyberAgent では • myshoesをマネージドサービスとして提供 • Cycloudユーザでも⾮ユーザでも利⽤可 • GHES, GHEC, github.com 全対応 • 社内のほぼ全てのユースケースに対応 • マルチテナントとして提供 36

Slide 37

Slide 37 text

CyberAgentにおけるmyshoes構成 • whywaita/myshoes + shoes-lxd • マルチテナント提供: myshoes-controller • Kubernetes Controller • MySQL Cluster (with orchestrator) • Docker Registry v , LXD image server 37

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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 利⽤

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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を直接利⽤

Slide 42

Slide 42 text

さらに 42

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

既存 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

Slide 46

Slide 46 text

既存 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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

CyberAgentにおけるmyshoes仕様 • Cycloud VMをstadiumとし GitHub-hostedよりも安価に提供 • LXDイメージはGitHub-hostedとほぼ同じイメージを利⽤ • https://github.com/whywaita/virtual-environments-lxd • ↑ + apt repoなど若⼲⼿を加えたもの • runnerスペック 2Core GB ~ Core GB 48

Slide 49

Slide 49 text

今後の展望 • OSSとして • shoes provider, Documentsの拡充 • ⼿動オペレーションの絶滅 • マネージドサービスとして (要望次第) • GPU runner ? • macOS runner? 49

Slide 50

Slide 50 text

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