小さく始めるKubernetes/The First Kubernetes

小さく始めるKubernetes/The First Kubernetes

Kubernetes Novice Tokyo #3
https://k8s-novice-jp.connpass.com/event/181410/
で発表した資料です

動画はこちら
https://youtu.be/wOzJYmPSB0I?t=3020

3499a1d71fa70b8ee44816ca9e7329fe?s=128

bells17

July 27, 2020
Tweet

Transcript

  1. ⼩さく始めるKubernetes Kubernetes Novice Tokyo #3 (2020/07/25) @bells17

  2. ▶ Daiki Hayakawa / @bells17 ▶ Software Enginner ▶ 主に

    Kubernetes 関連コンポーネントの開発など ▶ @bells17_
  3. 今⽇話すこと ▶ 初めてをKubernetesを導⼊したときの話しを簡単に事例を交えながら 紹介します ▶ Kubernetesの導⼊をするのはできれば⼩さいところから導⼊するのが オススメということを話します

  4. 注意事項 ▶ 本当にKubernetes初⼼者でまだ(ほとんど)触ったことがない、といっ た⽅向けのお話なので、もうすでにKubernetesを触ったことがあると いう⽅にとっては当たり前なレベルの内容になっています

  5. この事例について

  6. この事例について ▶ 副業でスタートアップのお⼿伝いをしたときの話しです + らくしふ(https://rakushifu.jp/)というLINEボットを使った
 シフト管理サービスでの事例について話します ▶ 時期的には2017年6⽉頃のお話です ▶ 状況としてはプロダクトのモックアップを⼀部の企業の⽅に利⽤して

    いただいていて、これから本格的に作っていく、というタイミングでし た ▶ エンジニアは僕の他にメインで開発していた⽅が2~3名ほど ▶ 僕の担当範囲はインフラ・CI/CD + ⼀部開発のサポート
  7. None
  8. 要件 ▶ メインのAPIと企業側利⽤向けアプリケーションはGCPに構築したい + スタートアップ向けディスカウントの関係で + 開発⾔語はRuby + Rails ▶

    LINEからのWebhook Requestを受けるサーバーはHerokuに置きたい + 開発⾔語はNode.js ▶ DBはMySQL + 基本toBサービスなのでそこまで負荷は⾼く無いが、シフトを管理す るテーブルなど、⼀部のデータについてはレコード数がそこそこ多く なる可能性が⾼い
  9. 図にするとこんな感じ

  10. はじめ

  11. AppEngine + Cloud SQL使うのがラクそう

  12. 試してみると ▶ AppEngineには以下の2種類があることがわかった + Standard Environment + Flexible Environment ▶

    Flexible Environmentの場合、デプロイにかなり時間がかかることがわかった + 試してみた感じ1度のデプロイで20-30分くらいかかった記憶がある ▶ Rubyは当時Flexible Environmentしか対応していなかった デプロイが遅いのがちょっとつらいという結論に
  13. 他のやり⽅についても調べてみた

  14. 案1 - 普通にCompute Engineでやる ▶ やること⾃体は特に問題なくできそうな感じ(当たり前だけど) ▶ ただ環境を構築して、何かあったときに⾃動でスケーリングできるようにして、デプロイ とかもいい感じにやるのは結構構築/運⽤のコストが⾼そう +

    インフラ・CI/CD周りを担当してたのが僕だけだったので ▶ また、インフラ周りで何かあったときやインフラ周りで何か変えたい場合に対応コスト もちょっと⾼い気がした できれば別の⽅法がいいなぁ〜という気持ち
  15. 案2 - GKEとかいうのを使ってみる ▶ ⾯⽩そうなので使ってみたかった Dockerやdocker-composeは触ったことあるし、 Kubernetesは名前くらいは聞いたことがあった ▶ さっと⾒てみた感じKubernetesを使えば本番環境でコンテナをいい感じに使えるっぽい ことがわかった(この段階だと何がいい感じに使えるのかよくわからん)

    ▶ 本番環境でコンテナ使えるってことは、スケーリングとかデプロイ周りとかの運⽤でか なり楽できるのでは?という予想 ちょっと試してみたい
  16. None
  17. ということでKubernetes(GKE)について 本格的に調べ始めた

  18. 調べ始めたとき ▶ Kubernetes⾃体知らないのでどうやって調べたらいいかわからんかった ▶ 初⼼者には公式ドキュメントがちょっと敷居⾼かった記憶 + その時tutorialのページとかってあったっけか? ▶ 当時はGKEもそんなにチュートリアル的なドキュメントが多くなかった印象 ▶

    ブログとかの記事もある程度まとまった情報はほとんどヒットしなかった気がする ▶ ⽇本語で書かれたKubernetesに関する本もなかったんじゃないかという記憶 ▶ DeploymentでPodというやつを作って、ServiceとIngressとかいうやつでロードバラン サー作ってアクセスできるようにするんだーというところまで辿り着くまでそこそこ苦労 した記憶がある + Ingress作ってロードバランサーでアクセスできるようにするまでの⼀連の作業とかにつ いての情報もなかったので後からメモを公開した記憶がある(https://bit.ly/2ZI0ssW)
  19. ⼤変だけどちょっとわかってきた ▶ Podってdocker-composeみたいな複数コンテナをまとめて管理できる単位なんだなー ▶ デバッグしたいときはdocker run/execするみたいにkubectl run/execすればいいんだー ▶ kubectl logs使うとコンテナの標準(エラー)出⼒が⾒れるんだなー

    ▶ kubectl set image を使うとイメージが更新されて、デプロイできるんだー + 今考えると普通に kubectl replace(その時 apply なかったはず)するのがベストプラク ティスなんだけど、調べ始めたときは知らなかった ▶ Podの数を増やしたいときはDeploymentのspec.replicasの数を調整すればいいんだー + 今ならHorizontal Pod Autoscaler使うけど ▶ なんか知らんけどService type: NodePortっていうのを作らないとIngressのロードバラン サーが使えないらしい ▶ Ingressってのを作るとCloud LoadBalancerが作成されるっぽい
  20. 最終的にGKEを使って構築

  21. とりあえず構築はできた

  22. ただ運⽤する上で最低限これくらいはやっておきたい ▶ デプロイは誰でも簡単にできるようにしたい ▶ モニタリングもできるように ▶ 閾値を超えたらアラートが上がるように ▶ アプリケーションのログも誰でも確認できるように

  23. ただ運⽤する上で最低限これくらいはやっておきたい ▶ デプロイは誰でも簡単にできるようにしたい + Github + CircleCIでデプロイできるように ▶ モニタリングもできるように +

    Stackdriver Monitoringでダッシュボードを作成 ▶ 閾値を超えたらアラートが上がるように + アラートもStackdriver Monitoringで設定 ▶ アプリケーションのログも誰でも確認できるように + GKEの場合オプションを有効にするとStackdriver Loggingにログが⾃動で収集される ▶ 上記を(簡単にでも)ドキュメントにまとめて共有
  24. None
  25. ここまでやって ▶ Githubで特定のプレフィックスのタグをつけてpushしたら⾃動でデプロイできる ▶ GKE(Kubernetes)を使ってるので仮にプロセスやNodeが落ちても⾃動復旧される ▶ Stackdriver Montoringのダッシュボードで基本的なメトリクスが⾒れる ▶ Stackdriver

    Loggingでアプリケーションなどのログが⾒れる ▶ サイトが落ちたり明らかに負荷が⾼くなっている状況であればアラートがメールやSlackに 通知される くらいはできるようになった
  26. この時点で理解してたKubernetesのこと ▶ Kubernetesのyamlは⻑いからとりあえず公式 ドキュメントとかにあるのをコピペして、必要 な項⽬を書き換え/追記して使うのが良さそう ▶ Pod≒docker-composeみたいなやつという
 雑な理解 ▶ Deployment使うとRolling

    Update/Podの⾃動 復旧などができる ▶ スケーリングしたいときはDeploymentの spec.replicasの値を変えればいい ▶ デバッグしたいときはkubectl exec/run・ kubectl logs・kubectl port-forwardあたりを 使えば良い ▶ kubectl get/describeを使うと現在の状況が 確認できる ▶ Service/Ingressでロードバランサーと連携で きてインターネットからアクセスできるよう になる ▶ namespaceを使うとリソースの置き場を分 割できる ▶ GKEのService Accountを利⽤して Kubernetesに接続~操作できる + CircleCIからデプロイを⾃動化できる
  27. Kubernetesでやるべきことはたくさんある ▶ プロジェクト + 環境などでnamespaceを 分割する ▶ PodDisruptionBudgetを設定することで クラスターアップグレードの際のアプリ ケーションのダウンタイムが発⽣しないよ

    うにできる ▶ sidecarパターンを使うことで1コンテナに 複数の責務を持たせない ▶ terminationGracePeriodSecondsなどを 設定することでアプリケーションの処理終 了前にコンテナが⽌まるのを防ぐ ▶ resources.request/limitsを設定する ▶ NetworkPolicyを設定して不必要な経路か らのリクエストを防⽌する ▶ Readiness/Liveness Probeによるヘルス チェックを設定する ▶ PodSecurityPolicyを設定してnamespace 内部の制御を⾏う
  28. あるんだが、初めから全て完璧にやろうとす るとめっちゃ⼤変 (どこまでやればOKと⾔えるのかわからない)

  29. ⼤変なので、初めはできるだけ⼩さい範囲から Kubernetesを始めて⾒るのがオススメ
 (もちろんベストプラクティスなどを知っている
 のに越したことはないけど)

  30. 今回のケースで⾔えば ▶ サービス⽴ち上げのタイミングで、β版など初期段階であれば利⽤企業も実験的に試して もらっている段階なので最悪サービスが⼀瞬⽌まったとしても⼤きな影響はない ▶ サービス⽴ち上げの段階なので、利⽤ユーザー数も少ない ▶ toBサービスなので利⽤ユーザー数がtoCに⽐べると少ない といった状況なので⽐較的Kubernetesをゆるめに導⼊することができた

  31. 新規でなくても⼩さく導⼊できるケースはあるはず ▶ 運⽤してるサービスの⼀部の機能だけをKubernetesに置き換えてみる + 例えばWebサービスの管理画⾯だけをKubernetesに置き換えるとか ▶ 既存のサービスで新規で追加するアプリケーションでKubernetesを利⽤してみるとか

  32. Kubernetesを初めて導⼊する場合 ▶ Kubernetesの導⼊を検討していたメンバー以外はKubernetesのことを全く/ほとんど知ら ないというケースも少なくない ▶ Kubernetesを⼩さく導⼊することで、検討メンバー以外のメンバーもKubernetesを使っ た開発/運⽤に⽐較的気楽に慣れていくキッカケが作りやすい ▶ メンバー全員が「Kubernetesってこういう感じで使うんだ」という共通認識が広がれば他 のところにKubernetesを導⼊するときのコストが下がる

    ▶ ⼩さく導⼊してみて⾃分たちにフィットしていると思えばKubernetesの利⽤範囲を広げて いく、という選択ができる ▶ 逆にフィットしなかった場合にもKubernetesをやめて既存の⽅法にリプレイスするという ことが選択しやすい ▶ ⼩さく導⼊し、Kubernetesとその周辺環境を育てていく
  33. 今はKubernetesを学びやすいコンテンツも多い ▶ Kubernetes公式ドキュメントのチュートリアル(Katakodaを使った実際のコマンドがブラ ウザで試せる) ▶ GKE/EKS/AKSなどの豊富なチュートリアル ▶ 「Docker/Kubernetes 実践コンテナ開発⼊⾨」/「15Stepで習得 Dockerから⼊る

    Kubernetes」といったKubernetesの⼊⾨に最適な書籍 ▶ courseraやudemyなどのKubernetes⼊⾨向けの動画コンテンツ ▶ より詳細なことが知りたい場合はCloud Native Days Tokyo/Kubernetes Meetup Tokyoな どのスライド/セッション動画など
  34. まとめ

  35. まとめ ▶ ⼩規模な環境でのKubernetesの導⼊事例についてお話しました ▶ Kubernetesを導⼊する場合、今回のような⼩規模な環境からの導⼊を⾏うとKubernetesの学習 コストも⽐較的⼩さく抑えられると思います ▶ また、⼩さく導⼊することで⾃分たちにマッチしている/していないといったことの判断も⾏いや すいと思われます ▶

    ⼩さく導⼊することで導⼊検討を⾏っている以外のメンバーにも実際にKubernetesを触ってもら うことができ、実際の運⽤上の問題を素早くキャッチアップ~対応することに繋がり、メンバー全 員にKubernetesを知ってもらうきっかけにもなると思います ▶ 今はKubernetesに⼊⾨しやすいコンテンツが豊富なので、とりあえずKubernetesを試してみる といった障壁もかなり⼩さいのではないかと思います ▶ まずは⼩さく導⼊し、Kubernetesとその周辺環境を育てていくのが良いのではないかと思います
  36. さいごに 会社名 株式会社クロスビット Domain HR Saas Issue WFM(Workforce Management) Traction

    Over 100,000 users 事例として紹介したらくしふを作っている株式会社クロスビットではエンジニアを
 絶賛募集中です! 興味を持ってくれた⽅は https://bit.ly/2ZMkrXa にアクセスしてみてください
  37. 参考資料 ▶ 15Stepで習得 Dockerから⼊るKubernetes http://www.amazon.co.jp/dp/B08221TFBH ▶ Docker/Kubernetes 実践コンテナ開発⼊⾨ http://www.amazon.co.jp/dp/B07GP1Q3VT ▶

    Kubernetes best practices: How and why to build small container images https://cloud.google.com/blog/products/gcp/ kubernetes-best-practices-how-and-why-to-build-small-container-images ▶ 本番環境のKubernetesマニフェストに 最低限必要な 7 のこと https://speakerdeck.com/masayaaoyama/jkd1812-prd-manifests ▶ [レポート] コンテナおよびKubernetesのベストプラクティストップ5 #reinvent #CON307 https://dev.classmethod.jp/articles/ reinvent2019-container-best-practices/
  38. Thanks / Question? ▶ Daiki Hayakawa, @bells17 ▶ Slide: https://speakerdeck.com/bells17

    ▶ @bells17_