KISS からはじまる Elixir on Kubernetes

KISS からはじまる Elixir on Kubernetes

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

4102ada9d9eee5a4a299937da214d051?s=128

Takanori Ishikawa

June 01, 2019
Tweet

Transcript

  1. 6.

    Copyright © ABEJA, Inc. All rights reserved. 本⽇のまとめ AWS の

    EC2 上で動かしていた Elixir システムを、コンテナ化し、Kubernetes ク ラスタに載せ替えて、さらに Elixir クラスタで分散環境も組んだら、いい感じに シンプルな構成になった、という話
  2. 9.

    Copyright © ABEJA, Inc. All rights reserved. 職務経歴 2004年 ドリコム

    2008年 暗黒(ニート)時代 2009年 mixi 2017年 ABEJA
  3. 18.

    Copyright © ABEJA, Inc. All rights reserved. 横断的な処理をしているところ • TensorBoard

    / Notebook のプロキシ (HTTP / WebSocket) • ユーザーや各種リソースの認証 • API 呼び出しのルーティング • リソース利⽤量の計測 • 契約プランと課⾦ • 社内管理ツール
  4. 19.

    Copyright © ABEJA, Inc. All rights reserved. 以前の構成 • Distillery

    で OTP Release 作成 • ブランチがマージされたら CircleCI 上で動く • AWS CodeDeploy で EC2 インスタンスに配布 • ストレージは RDS のみ • ログは CloudWatch Logs へ • Spotinst: スポットインスタンスの活⽤
  5. 21.

    Copyright © ABEJA, Inc. All rights reserved. 以前の構成の課題 • ⾮コンテナ

    AMI の更新: Terraform, Packer 職⼈ • IaaS 抽象化 マルチクラウド構成の機運 • Code Deploy ときどき壊れる。調査が⾯倒 • CloudWatch Logs 検索性があまりよくない。意外と⾼い • Elixir クラスタを組みたい 接続先ノードの管理
  6. 24.

    Copyright © ABEJA, Inc. All rights reserved. Kubernetes • 宣⾔的な設定に応じてコンテナをデプロイ

    • コンテナを管理するための論理的グループ • 配置されたコンテナ (Pod) の名前解決が出来る • 活発なコミュニティとエコシステム • マネージドなサービス (GKE, EKS, ) で楽できる • ⾃分たちで Kubernetes Master 運⽤は「死」を意味する
  7. 27.

    Copyright © ABEJA, Inc. All rights reserved. コンテナ化 • Docker

    の multi stage build • OTP Release ビルドと配置を分ける • デプロイされるイメージは slim ベースで OTP Release のみ含む • CodeDeploy, CloudWatch Logs のエージェントも不要になった
  8. 28.

    Copyright © ABEJA, Inc. All rights reserved. 新しい構成 • Distillery

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

    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
  10. 31.

    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 ϥΠϒϥϦͰ؆୯ʹग़དྷΔ
  11. 38.

    Copyright © ABEJA, Inc. All rights reserved. Elixir クラスタで更にシンプルな構成にできる •

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

    Copyright © ABEJA, Inc. All rights reserved. Elixir クラスタで、更にシンプルな構成にできる •

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