Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

▶ Daiki Hayakawa / @bells17 ▶ Software Enginner ▶ 主に Kubernetes 関連コンポーネントの開発など ▶ @bells17_

Slide 3

Slide 3 text

今⽇話すこと ▶ 初めてをKubernetesを導⼊したときの話しを簡単に事例を交えながら 紹介します ▶ Kubernetesの導⼊をするのはできれば⼩さいところから導⼊するのが オススメということを話します

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

この事例について

Slide 6

Slide 6 text

この事例について ▶ 副業でスタートアップのお⼿伝いをしたときの話しです + らくしふ(https://rakushifu.jp/)というLINEボットを使った
 シフト管理サービスでの事例について話します ▶ 時期的には2017年6⽉頃のお話です ▶ 状況としてはプロダクトのモックアップを⼀部の企業の⽅に利⽤して いただいていて、これから本格的に作っていく、というタイミングでし た ▶ エンジニアは僕の他にメインで開発していた⽅が2~3名ほど ▶ 僕の担当範囲はインフラ・CI/CD + ⼀部開発のサポート

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

要件 ▶ メインのAPIと企業側利⽤向けアプリケーションはGCPに構築したい + スタートアップ向けディスカウントの関係で + 開発⾔語はRuby + Rails ▶ LINEからのWebhook Requestを受けるサーバーはHerokuに置きたい + 開発⾔語はNode.js ▶ DBはMySQL + 基本toBサービスなのでそこまで負荷は⾼く無いが、シフトを管理す るテーブルなど、⼀部のデータについてはレコード数がそこそこ多く なる可能性が⾼い

Slide 9

Slide 9 text

図にするとこんな感じ

Slide 10

Slide 10 text

はじめ

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

試してみると ▶ AppEngineには以下の2種類があることがわかった + Standard Environment + Flexible Environment ▶ Flexible Environmentの場合、デプロイにかなり時間がかかることがわかった + 試してみた感じ1度のデプロイで20-30分くらいかかった記憶がある ▶ Rubyは当時Flexible Environmentしか対応していなかった デプロイが遅いのがちょっとつらいという結論に

Slide 13

Slide 13 text

他のやり⽅についても調べてみた

Slide 14

Slide 14 text

案1 - 普通にCompute Engineでやる ▶ やること⾃体は特に問題なくできそうな感じ(当たり前だけど) ▶ ただ環境を構築して、何かあったときに⾃動でスケーリングできるようにして、デプロイ とかもいい感じにやるのは結構構築/運⽤のコストが⾼そう + インフラ・CI/CD周りを担当してたのが僕だけだったので ▶ また、インフラ周りで何かあったときやインフラ周りで何か変えたい場合に対応コスト もちょっと⾼い気がした できれば別の⽅法がいいなぁ〜という気持ち

Slide 15

Slide 15 text

案2 - GKEとかいうのを使ってみる ▶ ⾯⽩そうなので使ってみたかった Dockerやdocker-composeは触ったことあるし、 Kubernetesは名前くらいは聞いたことがあった ▶ さっと⾒てみた感じKubernetesを使えば本番環境でコンテナをいい感じに使えるっぽい ことがわかった(この段階だと何がいい感じに使えるのかよくわからん) ▶ 本番環境でコンテナ使えるってことは、スケーリングとかデプロイ周りとかの運⽤でか なり楽できるのでは?という予想 ちょっと試してみたい

Slide 16

Slide 16 text

No content

Slide 17

Slide 17 text

ということでKubernetes(GKE)について 本格的に調べ始めた

Slide 18

Slide 18 text

調べ始めたとき ▶ Kubernetes⾃体知らないのでどうやって調べたらいいかわからんかった ▶ 初⼼者には公式ドキュメントがちょっと敷居⾼かった記憶 + その時tutorialのページとかってあったっけか? ▶ 当時はGKEもそんなにチュートリアル的なドキュメントが多くなかった印象 ▶ ブログとかの記事もある程度まとまった情報はほとんどヒットしなかった気がする ▶ ⽇本語で書かれたKubernetesに関する本もなかったんじゃないかという記憶 ▶ DeploymentでPodというやつを作って、ServiceとIngressとかいうやつでロードバラン サー作ってアクセスできるようにするんだーというところまで辿り着くまでそこそこ苦労 した記憶がある + Ingress作ってロードバランサーでアクセスできるようにするまでの⼀連の作業とかにつ いての情報もなかったので後からメモを公開した記憶がある(https://bit.ly/2ZI0ssW)

Slide 19

Slide 19 text

⼤変だけどちょっとわかってきた ▶ 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が作成されるっぽい

Slide 20

Slide 20 text

最終的にGKEを使って構築

Slide 21

Slide 21 text

とりあえず構築はできた

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

ただ運⽤する上で最低限これくらいはやっておきたい ▶ デプロイは誰でも簡単にできるようにしたい + Github + CircleCIでデプロイできるように ▶ モニタリングもできるように + Stackdriver Monitoringでダッシュボードを作成 ▶ 閾値を超えたらアラートが上がるように + アラートもStackdriver Monitoringで設定 ▶ アプリケーションのログも誰でも確認できるように + GKEの場合オプションを有効にするとStackdriver Loggingにログが⾃動で収集される ▶ 上記を(簡単にでも)ドキュメントにまとめて共有

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

ここまでやって ▶ Githubで特定のプレフィックスのタグをつけてpushしたら⾃動でデプロイできる ▶ GKE(Kubernetes)を使ってるので仮にプロセスやNodeが落ちても⾃動復旧される ▶ Stackdriver Montoringのダッシュボードで基本的なメトリクスが⾒れる ▶ Stackdriver Loggingでアプリケーションなどのログが⾒れる ▶ サイトが落ちたり明らかに負荷が⾼くなっている状況であればアラートがメールやSlackに 通知される くらいはできるようになった

Slide 26

Slide 26 text

この時点で理解してた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からデプロイを⾃動化できる

Slide 27

Slide 27 text

Kubernetesでやるべきことはたくさんある ▶ プロジェクト + 環境などでnamespaceを 分割する ▶ PodDisruptionBudgetを設定することで クラスターアップグレードの際のアプリ ケーションのダウンタイムが発⽣しないよ うにできる ▶ sidecarパターンを使うことで1コンテナに 複数の責務を持たせない ▶ terminationGracePeriodSecondsなどを 設定することでアプリケーションの処理終 了前にコンテナが⽌まるのを防ぐ ▶ resources.request/limitsを設定する ▶ NetworkPolicyを設定して不必要な経路か らのリクエストを防⽌する ▶ Readiness/Liveness Probeによるヘルス チェックを設定する ▶ PodSecurityPolicyを設定してnamespace 内部の制御を⾏う

Slide 28

Slide 28 text

あるんだが、初めから全て完璧にやろうとす るとめっちゃ⼤変 (どこまでやればOKと⾔えるのかわからない)

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

Kubernetesを初めて導⼊する場合 ▶ Kubernetesの導⼊を検討していたメンバー以外はKubernetesのことを全く/ほとんど知ら ないというケースも少なくない ▶ Kubernetesを⼩さく導⼊することで、検討メンバー以外のメンバーもKubernetesを使っ た開発/運⽤に⽐較的気楽に慣れていくキッカケが作りやすい ▶ メンバー全員が「Kubernetesってこういう感じで使うんだ」という共通認識が広がれば他 のところにKubernetesを導⼊するときのコストが下がる ▶ ⼩さく導⼊してみて⾃分たちにフィットしていると思えばKubernetesの利⽤範囲を広げて いく、という選択ができる ▶ 逆にフィットしなかった場合にもKubernetesをやめて既存の⽅法にリプレイスするという ことが選択しやすい ▶ ⼩さく導⼊し、Kubernetesとその周辺環境を育てていく

Slide 33

Slide 33 text

今はKubernetesを学びやすいコンテンツも多い ▶ Kubernetes公式ドキュメントのチュートリアル(Katakodaを使った実際のコマンドがブラ ウザで試せる) ▶ GKE/EKS/AKSなどの豊富なチュートリアル ▶ 「Docker/Kubernetes 実践コンテナ開発⼊⾨」/「15Stepで習得 Dockerから⼊る Kubernetes」といったKubernetesの⼊⾨に最適な書籍 ▶ courseraやudemyなどのKubernetes⼊⾨向けの動画コンテンツ ▶ より詳細なことが知りたい場合はCloud Native Days Tokyo/Kubernetes Meetup Tokyoな どのスライド/セッション動画など

Slide 34

Slide 34 text

まとめ

Slide 35

Slide 35 text

まとめ ▶ ⼩規模な環境でのKubernetesの導⼊事例についてお話しました ▶ Kubernetesを導⼊する場合、今回のような⼩規模な環境からの導⼊を⾏うとKubernetesの学習 コストも⽐較的⼩さく抑えられると思います ▶ また、⼩さく導⼊することで⾃分たちにマッチしている/していないといったことの判断も⾏いや すいと思われます ▶ ⼩さく導⼊することで導⼊検討を⾏っている以外のメンバーにも実際にKubernetesを触ってもら うことができ、実際の運⽤上の問題を素早くキャッチアップ~対応することに繋がり、メンバー全 員にKubernetesを知ってもらうきっかけにもなると思います ▶ 今はKubernetesに⼊⾨しやすいコンテンツが豊富なので、とりあえずKubernetesを試してみる といった障壁もかなり⼩さいのではないかと思います ▶ まずは⼩さく導⼊し、Kubernetesとその周辺環境を育てていくのが良いのではないかと思います

Slide 36

Slide 36 text

さいごに 会社名 株式会社クロスビット Domain HR Saas Issue WFM(Workforce Management) Traction Over 100,000 users 事例として紹介したらくしふを作っている株式会社クロスビットではエンジニアを
 絶賛募集中です! 興味を持ってくれた⽅は https://bit.ly/2ZMkrXa にアクセスしてみてください

Slide 37

Slide 37 text

参考資料 ▶ 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/

Slide 38

Slide 38 text

Thanks / Question? ▶ Daiki Hayakawa, @bells17 ▶ Slide: https://speakerdeck.com/bells17 ▶ @bells17_