Slide 1

Slide 1 text

Elixir app on k8s 2019/11/09 週1ゆるもく会 @ohrdev

Slide 2

Slide 2 text

agenda ● about me ● target ● goal ● elixir ● kubernetes(k8s) ● our tools for service/deployment ● our service architecture ● our deployment diagram ● release build for elixir ● conclusion

Slide 3

Slide 3 text

about me ● Tsunenori Ohara/おーはら ○ Twitter: @ohrdev ○ Github: ohr486 ● Work ○ Drecom ○ SRE/Infra/Ruby,Elixir,Lisp,etc ● Community ○ tokyo.ex, ElixirConfJapan, Erlang&ElixirFest オーガナイザー ○ Japan Elixir Association ○ meguro.rb, meguro.es ● Hobby ○ 仏像制作, 丸太収集, 写経, 寺社仏閣 ○ 人工衛星/アマチュア無線

Slide 4

Slide 4 text

target ● アプリの実行環境をサーバーからコンテナに変更したい人 ● k8s環境へのアプリのデプロイ方法を知りたい人 ● (k8sちょっと興味がある勢) ● (elixirちょっと興味ある勢)

Slide 5

Slide 5 text

goal ● elixirアプリを例に、以下の内容がわかる ● k8s環境へアプリをdeployする方法 ● deployの為に必要なツール ● k8s上で動くサービスのインフラ/アーキテクチャ/構成

Slide 6

Slide 6 text

elixir ● ErlangVM上で動作 ● 関数型言語 ● モダンな開発環境/ツール ● 並行プログラミング ○ Actor Model ● 軽量プロセス ○ OSのプロセスとは異なる ○ 超軽量 ● OTP(Open Telecom Platform) ○ 並行プログラミングのパターン /FW

Slide 7

Slide 7 text

7 Erlang VM Architecture Linux Server Erlang VM CPU CPU CPU CPU CPU CPU コア数と同数のスケジューラー erlang process != OS process VMがスケジューラー間のプロセスを分 散/マイグレーション スケジューラー プロセス

Slide 8

Slide 8 text

8 Erlang PROCESS Architecture Erlang VM application controller application master application プロセス ・elixir, iex, mix, etc ・user apps ・lib apps

Slide 9

Slide 9 text

kubernetes(k8s) ● コンテナのオペレーションを自動化するプラットフォーム ○ アプリの自動デプロイ ○ スケーリング ○ アプリ・コンテナ運用 ● OSS ● 自前運用も可能だが、マネージドなクラウドサービスを使うのが一般的 ○ GCP : GKE <= よく使われている、事例があがるやつ ○ AWS: EKS <= 今日のターゲット ○ Azure: AKS

Slide 10

Slide 10 text

our tools for service/deployment ● インフラ ○ EKS(Elastic Kubernetes Service) ■ AWSのマネージドなk8sサービス ○ ECR(Elastic Container Registry) ■ AWSのDockerコンテナのレジストリサービス ○ ALB(Application Load Balancer) ■ AWSのロードバランサー ○ EC2(Elastic Compute Cloud) ■ AWSのマネージドな仮想サーバー ● CI/CD ○ CircleCI ○ GitHub ○ Chatwork

Slide 11

Slide 11 text

EKS cluster worker node群 our service architecture ALB service pod elixir app container ECR AutoScalingGroup EC2 Instance EC2 Instance EC2 Instance end user developer CD tools kubectl git push configmap deployment … etc

Slide 12

Slide 12 text

CircleCI workflow our deployment diagram test lint release build aws auth docker push kubectl apply docker build 言語による違 いはここ push message 各種通知 webhooks start CI/CD deploy/更新 はk8sが実行 v1.1の imageを pull tag: v1.1 v1.1の imageを 適用

Slide 13

Slide 13 text

release build for elixir ● elixirはコンパイル言語 ● elixirのリリースアーカイブ作成機能 ○ 言語ランタイムも一緒にアーカイブしてくれる ○ つまり、同じOS/アーキテクチャのサーバーであれば、ファイルを copyするだけで実行可能 ■ つまり、実行環境にelixirをインストールしなくても良い ○ dockerで動かす場合は、docker buildでイメージにランタイム毎焼けば良い ● workflow ○ strep0. mix deps.get ○ step1. MIX_ENV=prod mix compile ○ step2. MIX_ENV=prod mix release ○ step3. cp _build/prod/ /path/to/app <= /path/to/app を含めてdocker buildすれば良い ○ step4. /path/to/bin/ start

Slide 14

Slide 14 text

conclusion ● k8s環境へのdeploymentの事例を紹介しました ● 言語によらずほぼしくみは同じだと思います ○ つまりRailsだろうがGolangだろうが同じ仕組みで適用可能だと思います ● k8sを利用する事でdeploymentオペレーションをシンプルにできます ● クラウドが提供するマネージドk8sを利用するとk8sの管理も不要になるのでとても 管理が楽になります