Slide 1

Slide 1 text

Rails on EKS マイグレーション 失敗パターンを検証してみた SATORI株式会社 納谷太陽

Slide 2

Slide 2 text

自己紹介 @NayaTaiyo ● 年齢:25歳 ● 会社:SATORI株式会社 ● 好きな食べ物:ラーメン、カレー ● 趣味:音楽を聴くこと ● 好きな技術:Ansible、Kubernetes、AWS ● Qiita:@nayaaaa
 ● GitHub:nayataiyo

Slide 3

Slide 3 text

なぜやろうと思ったか? ● 最近転職してRailsを学習する必要がある ● ITインフラ 勉強もサボるわけに いかない 何か効率 良い方法 ないか 🤔 そういえ Kubernetes勉強したときにITインフラについて 網羅的に学習できた気がしたな....

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Rails マイグレーションと ? マイグレーション(migration) Active Recordと呼 れるRails 標準機能 1つで あり、データベーススキーマが長期にわたって進化を安定して繰り返せるようにす るため 仕組みです。 マイグレーション機能 おかげで、スキーマ変更を生SQLで記述せずに、Rubyで作 成されたマイグレーション用 DSL(ドメイン固有言語)を用いてテーブル 変更を 簡単に記述できます。 ■ 公式ドキュメント https://railsguides.jp/active_record_migrations.html

Slide 6

Slide 6 text

# 失敗時:直近に戻す→確認 bin/rails rollback STEP=1 bin/rails db:version # 生成→適用→確認 bin/rails g model novice name:string description:text bin/rails db:migrate bin/rails db:version # 変更(列追加)→適用→確認 bin/rails g migration AddNayanayaToNovices nayanaya:text bin/rails db:migrate bin/rails db:version

Slide 7

Slide 7 text

というようにめちゃくちゃ便利な機能です!!     で 本題 失敗パターン ど ようなも がある かな?

Slide 8

Slide 8 text

Rails on EKSマイグレーション 失敗パターン ● 複数 db:migrateが同時実行 ● InitContainerにdb:migrateを記述する ● Resource不足で OOMKilled ※他にも様々なパターン(IAM権限やDB権限不足など)が  あるかもしれないですが検証まで行えた これらになります。

Slide 9

Slide 9 text

複数 db:migrateが同時実行 ● Deployment マニフェストに以下 ような記述をして applyすると?

Slide 10

Slide 10 text

Datadogで確認すると以下 ようなエラーを発見 👀

Slide 11

Slide 11 text

結果めちゃくちゃ時間がかかった....

Slide 12

Slide 12 text

InitContainerにdb:migrateを記述 ● 何がまずいか? ○ InitContainerでdb:migrateがこけるとアプリケーションコンテナが起動しな い ○ 複数 db:migrateも同時実行されてしまう ○ エラーが発生した際にログ 確認がしづらい

Slide 13

Slide 13 text

そもそもInitcontainerってなんだっけ? 単一 Pod 、Pod内にアプリケーションを実行している複数 コ ンテナを持つことができますが、同様に、アプリケーションコンテナ が起動する前に実行されるInitコンテナも1つ以上持つことができ ます。 また、Initコンテナ そ Pod 準備ができる前に完了する必要 があります。 ■ 公式ドキュメント https://kubernetes.io/ja/docs/concepts/workloads/pods/init-containers/

Slide 14

Slide 14 text

実際にInitcontainerでこけた例👇

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

Resource 不足で OOMKilled ● 何がまずいか? ○ resources:limits 制限によりOOMKilled発生 ○ OOMKilledによりPODがCrashLoopBackOffとなる

Slide 17

Slide 17 text

OOMとresources:limitsと ? OOM アウトオブメモリ(Out Of Memory) 略でシステムが必要 とするメモリ容量を確保できず、処理 続行が不可能となり発生 するエラー こと。 resources:limits Kubernetesで 、コンテナによって使用される リソース 最大量 設定値 こと。メモリ量とCPUが定義できる。 ■ 公式ドキュメント https://kubernetes.io/ja/docs/tasks/configure-pod-container/assign-memory-res ource/

Slide 18

Slide 18 text

● OOMKilled→ClashLoopBackOFFにSTATUSが変化している kubectl getコマンドで確認してみると 👀

Slide 19

Slide 19 text

kubectl describeコマンドで確認してみると 👀

Slide 20

Slide 20 text

適切なリソース 調整が必要 or resources:limitsを設定しない?

Slide 21

Slide 21 text

余談な ですが.... 登壇って失敗パターンを見える化してる発表ってあんまりないですよ ?

Slide 22

Slide 22 text

まとめ ● db:migrate ジョブで分離し、CI/CDなどで制御する。 ● 適切なリソース 調整が必要 ● 初めて オンライン登壇 👏 👉 初めて触る技術が多かった で学びが多かった 良かったです。   と いえ、実務で扱っているわけで ない で有識者 方ナレッジ募です。

Slide 23

Slide 23 text

Datadog トライアル期間終了 ● お気づきかもしれないですが、検証途中でDatadog トライア ル期間が終了した で途中 スライドからkubectlコマンドで 確認する形としています😭 Proプランに入会しようかなぁ....

Slide 24

Slide 24 text

参考リンク ● https://kubernetes.io/ja/docs/concepts/workloads/pods/init-containers/ ● https://kubernetes.io/ja/docs/tasks/configure-pod-container/assign-memor y-resource/ ● https://speakerdeck.com/takeru_ichii_0901/rails-on-kubernetes-tousuru-00?sli de=58 ● https://qiita.com/MahoTakara/items/ef8ce41dfb5bc9308185 ● https://medium.com/codex/database-migration-when-your-service-is-runni ng-in-kubernetes-abbe9697421d

Slide 25

Slide 25 text

ご清聴ありがとうございました!!