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

小さく始めるKubernetes/The First Kubernetes

bells17
July 27, 2020

小さく始めるKubernetes/The First Kubernetes

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

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

bells17

July 27, 2020
Tweet

More Decks by bells17

Other Decks in Programming

Transcript

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

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

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

    LINEからのWebhook Requestを受けるサーバーはHerokuに置きたい + 開発⾔語はNode.js ▶ DBはMySQL + 基本toBサービスなのでそこまで負荷は⾼く無いが、シフトを管理す るテーブルなど、⼀部のデータについてはレコード数がそこそこ多く なる可能性が⾼い
  4. 試してみると ▶ AppEngineには以下の2種類があることがわかった + Standard Environment + Flexible Environment ▶

    Flexible Environmentの場合、デプロイにかなり時間がかかることがわかった + 試してみた感じ1度のデプロイで20-30分くらいかかった記憶がある ▶ Rubyは当時Flexible Environmentしか対応していなかった デプロイが遅いのがちょっとつらいという結論に
  5. 案1 - 普通にCompute Engineでやる ▶ やること⾃体は特に問題なくできそうな感じ(当たり前だけど) ▶ ただ環境を構築して、何かあったときに⾃動でスケーリングできるようにして、デプロイ とかもいい感じにやるのは結構構築/運⽤のコストが⾼そう +

    インフラ・CI/CD周りを担当してたのが僕だけだったので ▶ また、インフラ周りで何かあったときやインフラ周りで何か変えたい場合に対応コスト もちょっと⾼い気がした できれば別の⽅法がいいなぁ〜という気持ち
  6. 調べ始めたとき ▶ Kubernetes⾃体知らないのでどうやって調べたらいいかわからんかった ▶ 初⼼者には公式ドキュメントがちょっと敷居⾼かった記憶 + その時tutorialのページとかってあったっけか? ▶ 当時はGKEもそんなにチュートリアル的なドキュメントが多くなかった印象 ▶

    ブログとかの記事もある程度まとまった情報はほとんどヒットしなかった気がする ▶ ⽇本語で書かれたKubernetesに関する本もなかったんじゃないかという記憶 ▶ DeploymentでPodというやつを作って、ServiceとIngressとかいうやつでロードバラン サー作ってアクセスできるようにするんだーというところまで辿り着くまでそこそこ苦労 した記憶がある + Ingress作ってロードバランサーでアクセスできるようにするまでの⼀連の作業とかにつ いての情報もなかったので後からメモを公開した記憶がある(https://bit.ly/2ZI0ssW)
  7. ⼤変だけどちょっとわかってきた ▶ 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が作成されるっぽい
  8. ただ運⽤する上で最低限これくらいはやっておきたい ▶ デプロイは誰でも簡単にできるようにしたい + Github + CircleCIでデプロイできるように ▶ モニタリングもできるように +

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

    Loggingでアプリケーションなどのログが⾒れる ▶ サイトが落ちたり明らかに負荷が⾼くなっている状況であればアラートがメールやSlackに 通知される くらいはできるようになった
  10. この時点で理解してた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からデプロイを⾃動化できる
  11. Kubernetesでやるべきことはたくさんある ▶ プロジェクト + 環境などでnamespaceを 分割する ▶ PodDisruptionBudgetを設定することで クラスターアップグレードの際のアプリ ケーションのダウンタイムが発⽣しないよ

    うにできる ▶ sidecarパターンを使うことで1コンテナに 複数の責務を持たせない ▶ terminationGracePeriodSecondsなどを 設定することでアプリケーションの処理終 了前にコンテナが⽌まるのを防ぐ ▶ resources.request/limitsを設定する ▶ NetworkPolicyを設定して不必要な経路か らのリクエストを防⽌する ▶ Readiness/Liveness Probeによるヘルス チェックを設定する ▶ PodSecurityPolicyを設定してnamespace 内部の制御を⾏う
  12. 今はKubernetesを学びやすいコンテンツも多い ▶ Kubernetes公式ドキュメントのチュートリアル(Katakodaを使った実際のコマンドがブラ ウザで試せる) ▶ GKE/EKS/AKSなどの豊富なチュートリアル ▶ 「Docker/Kubernetes 実践コンテナ開発⼊⾨」/「15Stepで習得 Dockerから⼊る

    Kubernetes」といったKubernetesの⼊⾨に最適な書籍 ▶ courseraやudemyなどのKubernetes⼊⾨向けの動画コンテンツ ▶ より詳細なことが知りたい場合はCloud Native Days Tokyo/Kubernetes Meetup Tokyoな どのスライド/セッション動画など
  13. まとめ ▶ ⼩規模な環境でのKubernetesの導⼊事例についてお話しました ▶ Kubernetesを導⼊する場合、今回のような⼩規模な環境からの導⼊を⾏うとKubernetesの学習 コストも⽐較的⼩さく抑えられると思います ▶ また、⼩さく導⼊することで⾃分たちにマッチしている/していないといったことの判断も⾏いや すいと思われます ▶

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

    Over 100,000 users 事例として紹介したらくしふを作っている株式会社クロスビットではエンジニアを
 絶賛募集中です! 興味を持ってくれた⽅は https://bit.ly/2ZMkrXa にアクセスしてみてください
  15. 参考資料 ▶ 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/