Slide 1

Slide 1 text

Takanori Ishikawa KISS からはじまる Elixir on Kubernetes

Slide 2

Slide 2 text

Copyright © ABEJA, Inc. All rights reserved. はじめに

Slide 3

Slide 3 text

Copyright © ABEJA, Inc. All rights reserved.

Slide 4

Slide 4 text

Copyright © ABEJA, Inc. All rights reserved. みなさん、KISS していますか!?

Slide 5

Slide 5 text

Copyright © ABEJA, Inc. All rights reserved. KISS の原則 Keep It Simple, Stupid

Slide 6

Slide 6 text

Copyright © ABEJA, Inc. All rights reserved. 本⽇のまとめ AWS の EC2 上で動かしていた Elixir システムを、コンテナ化し、Kubernetes ク ラスタに載せ替えて、さらに Elixir クラスタで分散環境も組んだら、いい感じに シンプルな構成になった、という話

Slide 7

Slide 7 text

Copyright © ABEJA, Inc. All rights reserved. ⾃⼰紹介

Slide 8

Slide 8 text

Copyright © ABEJA, Inc. All rights reserved. ⽯川尊教 Takanori Ishikawa @takanori_is ❤ Elixir &

Slide 9

Slide 9 text

Copyright © ABEJA, Inc. All rights reserved. 職務経歴 2004年 ドリコム 2008年 暗黒(ニート)時代 2009年 mixi 2017年 ABEJA

Slide 10

Slide 10 text

Copyright © ABEJA, Inc. All rights reserved. ABEJA Platform

Slide 11

Slide 11 text

Copyright © ABEJA, Inc. All rights reserved.

Slide 12

Slide 12 text

Copyright © ABEJA, Inc. All rights reserved.

Slide 13

Slide 13 text

Copyright © ABEJA, Inc. All rights reserved.

Slide 14

Slide 14 text

Copyright © ABEJA, Inc. All rights reserved. ¥

Slide 15

Slide 15 text

Copyright © ABEJA, Inc. All rights reserved.

Slide 16

Slide 16 text

Copyright © ABEJA, Inc. All rights reserved.

Slide 17

Slide 17 text

Copyright © ABEJA, Inc. All rights reserved. どんなところに Elixir を使っているのか?

Slide 18

Slide 18 text

Copyright © ABEJA, Inc. All rights reserved. 横断的な処理をしているところ • TensorBoard / Notebook のプロキシ (HTTP / WebSocket) • ユーザーや各種リソースの認証 • API 呼び出しのルーティング • リソース利⽤量の計測 • 契約プランと課⾦ • 社内管理ツール

Slide 19

Slide 19 text

Copyright © ABEJA, Inc. All rights reserved. 以前の構成 • Distillery で OTP Release 作成 • ブランチがマージされたら CircleCI 上で動く • AWS CodeDeploy で EC2 インスタンスに配布 • ストレージは RDS のみ • ログは CloudWatch Logs へ • Spotinst: スポットインスタンスの活⽤

Slide 20

Slide 20 text

Copyright © ABEJA, Inc. All rights reserved. 問題なく動いていたが、いくつかの課題があった

Slide 21

Slide 21 text

Copyright © ABEJA, Inc. All rights reserved. 以前の構成の課題 • ⾮コンテナ AMI の更新: Terraform, Packer 職⼈ • IaaS 抽象化 マルチクラウド構成の機運 • Code Deploy ときどき壊れる。調査が⾯倒 • CloudWatch Logs 検索性があまりよくない。意外と⾼い • Elixir クラスタを組みたい 接続先ノードの管理

Slide 22

Slide 22 text

Copyright © ABEJA, Inc. All rights reserved. どうする?

Slide 23

Slide 23 text

Copyright © ABEJA, Inc. All rights reserved. Kubernetes

Slide 24

Slide 24 text

Copyright © ABEJA, Inc. All rights reserved. Kubernetes • 宣⾔的な設定に応じてコンテナをデプロイ • コンテナを管理するための論理的グループ • 配置されたコンテナ (Pod) の名前解決が出来る • 活発なコミュニティとエコシステム • マネージドなサービス (GKE, EKS, ) で楽できる • ⾃分たちで Kubernetes Master 運⽤は「死」を意味する

Slide 25

Slide 25 text

Copyright © ABEJA, Inc. All rights reserved. まず、Kubernetes クラスタを⽤意します

Slide 26

Slide 26 text

Copyright © ABEJA, Inc. All rights reserved. 省略

Slide 27

Slide 27 text

Copyright © ABEJA, Inc. All rights reserved. コンテナ化 • Docker の multi stage build • OTP Release ビルドと配置を分ける • デプロイされるイメージは slim ベースで OTP Release のみ含む • CodeDeploy, CloudWatch Logs のエージェントも不要になった

Slide 28

Slide 28 text

Copyright © ABEJA, Inc. All rights reserved. 新しい構成 • Distillery で作成した OTP Release を含むイメージのビルド • ブランチがマージされたら CircleCI 上で動く • kubectl でローリングアップデート • ログは標準出⼒/エラーを datadog へ転送 • LB: AWS ALB Ingress Controller • スケール: Spotinst Elastigroup, Horizontal Pod Autoscaler

Slide 29

Slide 29 text

Copyright © ABEJA, Inc. All rights reserved. Elixir クラスタも簡単

Slide 30

Slide 30 text

Copyright © ABEJA, Inc. All rights reserved. 必要なポートを開放 • epmd (Erlang Port Mapper Daemon) の起動ポート 4369 • ノード間通信に使うポートをひとつ (例: 4370) • erl の起動オプションでポート範囲を絞る必要あり • -kernel inet_dist_listen_min 4370 inet_dist_listen_max 4370

Slide 31

Slide 31 text

Copyright © ABEJA, Inc. All rights reserved. Headless Service の DNS • Kubernetes Service の clusterIP を None で設定 (Headless Service) • my-svc.my-namespace.svc.cluster.local で名前解決すると、A レコー ドで Pods の IP ⼀覧が取得できる • これで接続先 Erlang node の IP アドレスはわかる • あとは定期的に Node.connect/1 するだけ • peerage ϥΠϒϥϦͰ؆୯ʹग़དྷΔ

Slide 32

Slide 32 text

Copyright © ABEJA, Inc. All rights reserved.

Slide 33

Slide 33 text

Copyright © ABEJA, Inc. All rights reserved.

Slide 34

Slide 34 text

Copyright © ABEJA, Inc. All rights reserved. rel/vm.args

Slide 35

Slide 35 text

Copyright © ABEJA, Inc. All rights reserved. config/prod.exs

Slide 36

Slide 36 text

Copyright © ABEJA, Inc. All rights reserved. Elixir クラスタ構築できた

Slide 37

Slide 37 text

Copyright © ABEJA, Inc. All rights reserved. 最後に

Slide 38

Slide 38 text

Copyright © ABEJA, Inc. All rights reserved. Elixir クラスタで更にシンプルな構成にできる • 通常であればクラウドサービスを利⽤するものを、Elixir クラスタで実装 • キャッシュ Cachex ライブラリは Distributed Cache にも対応 • 定期実⾏ Quantum. Cron ライクな設定だけでなく、どのノードで実⾏するかも 指定可能 • ジョブキュー Honeydew. Mnesia か RDB をバックエンドにできる

Slide 39

Slide 39 text

Copyright © ABEJA, Inc. All rights reserved. Elixir クラスタで、更にシンプルな構成にできる • 実⾏中ノードのコンソールに接続してデバッグや調査が可能 • 信頼できる VM とネットワーク透過なクラスタがあるので、明確な理由がない かぎり外部のサービスを増やさない • 依存する外部サービスが減れば、そのぶん堅牢かつ管理しやすくなる

Slide 40

Slide 40 text

Copyright © ABEJA, Inc. All rights reserved. Keep It Simple, Stupid

Slide 41

Slide 41 text

Copyright © ABEJA, Inc. All rights reserved. システムとうまくつきあうために、 KISS を怖れるな

Slide 42

Slide 42 text

Copyright © ABEJA, Inc. All rights reserved. ご静聴ありがとうございました