Upgrade to Pro — share decks privately, control downloads, hide ads and more …

KISS からはじまる Elixir on Kubernetes

KISS からはじまる Elixir on Kubernetes

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

4102ada9d9eee5a4a299937da214d051?s=128

Takanori Ishikawa

June 01, 2019
Tweet

Transcript

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

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

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

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

  5. Copyright © ABEJA, Inc. All rights reserved. KISS の原則 Keep

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

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

  8. Copyright © ABEJA, Inc. All rights reserved. ⽯川尊教 Takanori Ishikawa

    @takanori_is ❤ Elixir &
  9. Copyright © ABEJA, Inc. All rights reserved. 職務経歴 2004年 ドリコム

    2008年 暗黒(ニート)時代 2009年 mixi 2017年 ABEJA
  10. Copyright © ABEJA, Inc. All rights reserved. ABEJA Platform

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

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

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

  14. Copyright © ABEJA, Inc. All rights reserved. ¥

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

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

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

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

    / Notebook のプロキシ (HTTP / WebSocket) • ユーザーや各種リソースの認証 • API 呼び出しのルーティング • リソース利⽤量の計測 • 契約プランと課⾦ • 社内管理ツール
  19. Copyright © ABEJA, Inc. All rights reserved. 以前の構成 • Distillery

    で OTP Release 作成 • ブランチがマージされたら CircleCI 上で動く • AWS CodeDeploy で EC2 インスタンスに配布 • ストレージは RDS のみ • ログは CloudWatch Logs へ • Spotinst: スポットインスタンスの活⽤
  20. Copyright © ABEJA, Inc. All rights reserved. 問題なく動いていたが、いくつかの課題があった

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

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

  23. Copyright © ABEJA, Inc. All rights reserved. Kubernetes

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

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

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

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

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

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

  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
  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 ϥΠϒϥϦͰ؆୯ʹग़དྷΔ
  32. Copyright © ABEJA, Inc. All rights reserved.

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

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

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

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

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

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

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

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

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

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