KISS からはじまる Elixir on Kubernetes
by
Takanori Ishikawa
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
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. ご静聴ありがとうございました