Slide 1

Slide 1 text

Sansan株式会社 部署 名前 R&Dのアプリケーション基盤 “Circuit”について Sansan技術本部 Sansan技術本部 ML Platform Team

Slide 2

Slide 2 text

研修の⽬的 1 研究開発部のアプリケーション基盤 “Circuit” について知る Q1. Circuitってなに? Q2. Circuitは何のためにある? Q3. どんな設計? Q4. 開発の流れは? Q5. 何ができる?

Slide 3

Slide 3 text

Q1. Circuitってなに

Slide 4

Slide 4 text

A. R&Dのアプリケーション基盤の名前です 技術: - Kubernetes(k8s) - コンテナオーケストレーション 場所: - AWS EKS - k8sをいい感じにAWS上で使えるようにするサービス Q1. Circuitってなに 3

Slide 5

Slide 5 text

コンテナ化した システムを いい感じに 空きのあるマシンに 載せて実行してくれる ヤツ Kubernetesとは

Slide 6

Slide 6 text

Q2. Circuitは何のためにある?

Slide 7

Slide 7 text

A.絶え間なく生まれる研究員による成果を 最速でリリースするため Q2. Circuitは何のためにある? 6

Slide 8

Slide 8 text

A.絶え間なく生まれる研究員による成果を 最速でリリースするため Q2. Circuitは何のためにある?(背景) 7

Slide 9

Slide 9 text

A.絶え間なく生まれる研究員による成果を 最速でリリースするため Q2. Circuitは何のためにある?(背景) 8

Slide 10

Slide 10 text

A.絶え間なく生まれる研究員による成果を 最速でリリースするため Q2. Circuitは何のためにある?(背景)

Slide 11

Slide 11 text

最も大事な こと ~最速でリ リースする ためにある ~ 最も⼤事なこと ~最速でリリースするためにある~

Slide 12

Slide 12 text

A.絶え間なく生まれる研究員による成果を 最速でリリースするため 手段としてEKS(K8s)を選んだに過ぎない Q2. Circuitは何のためにある? 11

Slide 13

Slide 13 text

A.絶え間なく生まれる研究員による成果を 最速でリリースするため Kubernetes使ってるって言いたい 小難しいことをして仕事している感を出したい 社内で扱っていない技術を使ってイキりたい 研究員に仕事を押し付けたい Q2. Circuitは何のためにある? 12

Slide 14

Slide 14 text

A.絶え間なく生まれる研究員による成果を 最速でリリースするため Kubernetes使ってるって言いたい 小難しいことをして仕事している感を出したい 社内で扱っていない技術を使ってイキりたい 研究員に仕事を押し付けたい Q2. Circuitは何のためにある? 13

Slide 15

Slide 15 text

A.絶え間なく生まれる研究員による成果を 最速でリリースするため [よろしくない例] Circuit使っても全然リリース出来ないんだが? Q2. Circuitは何のためにある? 14

Slide 16

Slide 16 text

絶え間なく生まれる研究員による成果を 最速でリリースするため [よろしくない例] ECS, App Runner使ったほうが速いんだが? Q2. Circuitは何のためにある? 15

Slide 17

Slide 17 text

絶え間なく生まれる研究員による成果を 最速でリリースするため [よろしくない例] とにかく使いにくいんだが? 何のために⽣まれた? 16

Slide 18

Slide 18 text

絶え間なく生まれる研究員による成果を 最速でリリースするため ユーザの声を教えてくれ!もっともっと良くなるぞ! Q2. Circuitは何のためにある? 17

Slide 19

Slide 19 text

最も大事な こと ~最速でリ リースする ためにある ~ こんなような話どこかで聞いたな?

Slide 20

Slide 20 text

機械学習が組み込まれたサービスを利⽤する⼈の視点 - お金を払って利用する顧客,フリーでアプリを利用するユーザ 重要視すること - 自分の環境における精度(全体ではない).体験が全て - 使い心地 > 予測結果が使いやすいものか?直感に沿うか? > レイテンシなどの UI/UX に関連する部分 - 自分のデータが勝手に使われていないか? 感覚的に気持ち悪くないか? 重要視しないこと - どのようなアルゴリズムが使われているか - 機械学習が使われているかどうか ユーザの視点 R&D研修より抜粋

Slide 21

Slide 21 text

Q2. Circuitは何のためにある? 20 https://speakerdeck.com/jacopen/platform-engineeringhenozhao-dai “Platform Enginerringへの招待” というスライドにいいことが書いてある

Slide 22

Slide 22 text

Q2. Circuitは何のためにある? 21 https://speakerdeck.com/jacopen/platform-engineeringhenozhao-dai ❝ プラットフォームにとって、価値があるかないかを判断す るのは『プラットフォームの利用者』 開発者に価値を提供できなければ、そのプラットフォーム は失敗している ❞

Slide 23

Slide 23 text

Q3. どんな設計?

Slide 24

Slide 24 text

最も大事な こと ~最速でリ リースする ためにある ~ Kubernetes⽤語整理

Slide 25

Slide 25 text

コンテナ化した システムを いい感じに 空きのあるマシンに 載せて実行してくれる ヤツ (再掲)Kubernetesとは

Slide 26

Slide 26 text

Podとは Container Container Kubernetesアプリケーションの最小実行単位。Podの中に複数コンテナをい れることもできる。

Slide 27

Slide 27 text

Podが実行される環境。実体はEC2インスタンスやGoogleComputeEngine Nodeとは

Slide 28

Slide 28 text

Nodeの集合 Clusterとは

Slide 29

Slide 29 text

既存のノードに空きがあるならそこに入る 新しくPodを実⾏したい NodeのvCPU: 40 vCPU: 10 vCPU: 10 vCPU: 10 vCPU: 10 Pending Pods

Slide 30

Slide 30 text

既存のノードに空きが無いならPodの要求リソースに見合うノードが自動で立ち上がる (Cluster Autoscalerが機能している場合) 新しくPodを実⾏したい NodeのvCPU: 40 vCPU: 10 vCPU: 10 vCPU: 10 vCPU: 10 NodeのvCPU: 20 vCPU: 10 vCPU: 10 New

Slide 31

Slide 31 text

マニフェストを書いてクラスターに適用する マニフェストはリソース定義のこと マニフェストはyaml (json)で記述できる どうやってPodをクラスターに追加するのか

Slide 32

Slide 32 text

定期バッチのPodをクラスターに追加するマニフェスト例

Slide 33

Slide 33 text

最も大事な こと ~最速でリ リースする ためにある ~ リソース管理の話

Slide 34

Slide 34 text

マニフェスト(リソースを定義したYAML)は ほぼ 全てGitHubで管理されている 宣⾔的なリソース管理 33 GitHubにないリソースをこっそり作るなよぉという話

Slide 35

Slide 35 text

名前空間/アプリ名/アプリタイプ/….. ディレクトリ構成 34 名前空間 アプリ名 アプリタイプ(batch,api..) 環境

Slide 36

Slide 36 text

環境間で共通設定と独⾃設定を分けている Kustomizeというツールを用いて設定のマージを実現 ディレクトリ構成 35 共通設定(マニフェスト) 本番環境独自の設定 (マニフェスト)

Slide 37

Slide 37 text

最も大事な こと ~最速でリ リースする ためにある ~ デプロイの話

Slide 38

Slide 38 text

Gitを「信頼できる唯一の情報源」とする プルリクエストをmainにマージ=デプロイ ArgoCDというツールでGitOpsを実現 GitOps 37 今からリリースします!(どきどき)というお遊戯がないという話

Slide 39

Slide 39 text

Gitを「信頼できる唯一の情報源」とする。 プルリクエストをmainにマージ=デプロイ。 ArgoCDというツールでGitOpsを実現。 GitOps 38 このタコが定期的にGitHubを監視 差分があればCircuitにデプロイする 私、監視されている

Slide 40

Slide 40 text

ArgoCDのUIはCircuitの状態確認に便利。 GitOps 39 画像はArgoCDのドキュメントから引用

Slide 41

Slide 41 text

最も大事な こと ~最速でリ リースする ためにある ~ クラスタ⾃体の話

Slide 42

Slide 42 text

1つのクラスタで運用 「どのクラスタ使えばいいんだろう」が基本無い(ようにしたい) 開発者はクラスタを気にしなくて良い設計 Circuitは環境毎に1つ バージョンアップ時は一時的に2つになる 名前空間でプロダクトを分離する シングルクラスタマルチテナント 41

Slide 43

Slide 43 text

概ねプロダクト単位になっている - eight - sansan - ︙ 名前空間 42

Slide 44

Slide 44 text

K8sは年3回リリースがある 雑に言うと2種の更新方法 - in-place - ブルーグリーンデプロイ ← Circuitはこっち EKSのバージョン更新(アーキテクト向け) 43

Slide 45

Slide 45 text

in-place 失敗しても前の家には戻れない in-placeなバージョン更新 44 リフォーム

Slide 46

Slide 46 text

ブルーグリーンデプロイ 失敗したら前の家に戻れる ブルーグリーンデプロイなバージョン更新 45 新しい家を建てて 引っ越す

Slide 47

Slide 47 text

ブルーグリーンデプロイなバージョン更新

Slide 48

Slide 48 text

最も大事な こと ~最速でリ リースする ためにある ~ 機密情報管理

Slide 49

Slide 49 text

ブルーグリーンデプロイなバージョン更新 マニフェストに機密情報を書かない External Secrets Operatorなるもので AWSのSecrets Managerに保存する GitHubに機密情報はNG

Slide 50

Slide 50 text

Q3. 開発の流れは?

Slide 51

Slide 51 text

最も大事な こと ~最速でリ リースする ためにある ~ アプリ構築初回

Slide 52

Slide 52 text

A.研究員とArchitectが連携して開発するよ Q3. 開発の流れは? 51

Slide 53

Slide 53 text

A.研究員とArchitectが連携して開発するよ Q3. 開発の流れは? 52 ↑ ボトルネックになりがちな所 ↑ デプロイ作業が マージであることに注目 ↑ テンプレートで楽ちん

Slide 54

Slide 54 text

最も大事な こと ~最速でリ リースする ためにある ~ 継続的なアルゴリズム修正

Slide 55

Slide 55 text

イメージをECRにプッシュすると自動でPRができるぞ Q3. 開発の流れは? 54 ↑ 自動!

Slide 56

Slide 56 text

Q5. 何ができる?

Slide 57

Slide 57 text

できる - 単発のバッチ - 定期実行バッチ - データの集計とか学習とか - 変則的な手動実行もできる - API、Webアプリケーション - オートスケール - 使用量が増えたらPodを増やす - 負荷分散 - まんべんなくリクエストをPodに割り振る Q5. 何ができる? 56

Slide 58

Slide 58 text

できない、まだイマイチ - GPUインスタンスの利用 - できなくはないが不整備 - サーバーレス化 - 利用がないシステムはPodを0個までスケールイン - 主にコスト削減 - Comming Soon! Q5. 何ができる? 57 ※我々ML PlatformチームなのでGPU対応は今後必ずやります

Slide 59

Slide 59 text

選べるデプロイ⽅法 について語る

Slide 60

Slide 60 text

新しいバージョンのコードを本番環境にリリースのは不安 - ちゃんと起動するかな? - 利用負荷に耐えられるかな? - 失敗したら過去のバージョンにすぐ戻せるかな? - 精度は改善するかな? Q5. 何ができる? 59

Slide 61

Slide 61 text

ローリングアップデート 基本はコレ 起動を確認して1つ1つPodが入れ替わっていく(人要らず) Q5. 何ができる? 60 new versions old versions シフト 交代の時間や 帰りまーす

Slide 62

Slide 62 text

ブルーグリーンデプロイ 古いバージョンはデプロイ後もしばらく待機 待ってる間は古いバージョンにすぐ戻せる(要人間) Q5. 何ができる? 61 new versions old versions 仕事は交代するけど 店長のNGでたらすぐ 戻ってきて ええよ Argo Rolloutsを利用 ※ここでの店長とは運用者を指す

Slide 63

Slide 63 text

カナリアリリース 任意の割合で部分的にリリース 確認しながら少しずつリリースが進められる(要人間) Q5. 何ができる? 62 new version old versions とりあえず1人だけ交 代するわ 店長のOKでたら次の Pod呼ぶわ Argo Rolloutsを利用 ※ここでの店長とは運用者を指す

Slide 64

Slide 64 text

プログレッシブデリバリー 任意の割合で部分的にリリース 何らかの指標を確認して少しずつリリースが進む (人要らず) Q5. 何ができる? 63 new version old versions とりあえず1人だけ交 代するわ 精度のメトリクス見て、 良さそうだったら次 Pod呼ぶわ Argo Rolloutsを利用

Slide 65

Slide 65 text

研究開発をドライブする Circuit 🚗=33

Slide 66

Slide 66 text

- 仮説検証を高速ぐるぐるしたい - 研究開発をドライブしたい - Gokart(研究開発部でよく使っているOSS)が走る場所 Appendix: なんでCircuit? 65

Slide 67

Slide 67 text

ArgoCD Image Updater追加 Appendix: Circuitの歴史 66 2021/10 2022/05 2022/07 2022/12 2023/02 アプリ初リリース STG環境のCircuit誕生 MLPチーム誕生 Argo Rollouts追加 初のクラスタ更新開始 EKS作成を決意 本番環境のCircuit誕生

Slide 68

Slide 68 text

No content