Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

K8s(gke)をプロダクトに投入するまでの話

1,664 views

Published on

geekNightの資料です

Published in: Technology
  • Be the first to comment

K8s(gke)をプロダクトに投入するまでの話

  1. 1. k8s(GKE)をプロダクトに 投入するまでの話 市ヶ谷Geek★Night 2017.12.20 株式会社オプト 柴田幸輝
  2. 2. Agenda - 自己紹介&前置き - k8sに惹かれた理由 - 小規模システムにk8sを導入する - まとめ (本資料では、Kubernetesの表記をk8sで統一します。)
  3. 3. 自己紹介&前置き
  4. 4. - 名前: 柴田 幸輝 - 所属: 株式会社オプト - 役割: 雑務(Spark / React / GAE(Go) / k8s / マネージャー 他) - 技術メモ:https://qiita.com/uryyyyyyy 自己紹介
  5. 5. - DevOpsやりたいエンジニア募集! - 公式サイト: https://www.opt.ne.jp/opttechnologies/ - 技術マガジン: http://tech-magazine.opt.ne.jp/ Opt Technologiesについて
  6. 6. k8sをプロダクトで使っている方 (゚∀゚)ノ 最初に質問
  7. 7. この発表は、 「k8sに興味あるけど導入したことがない方」 向けに 「小規模プロダクトに導入した時のTips」 を伝えることを目指します。 既に運用している方は、 もっといいやり方があればぜひ教えてください 前置き
  8. 8. 話さないこと - k8sについての基礎 - 運用のベストプラクティス(僕が知りたい) - 中規模以上のプロダクトでの運用ノウハウ - GCP以外での構成 前置き
  9. 9. k8sに惹かれた理由
  10. 10. 以下を実現するのに有用なツールだと思ったからです - Infrastructure as Code(IaC) - マイクロサービスアーキテクチャ k8sに惹かれた理由
  11. 11. - k8sへは「こういう構成にして」という指示だけ出す - 現在との差分を気にしないので設定がシンプル - クラッシュなどで構成がズレても勝手に修復する - コンテナを作って壊すだけなのでImmutableに出来る - 「スノーフレークサーバー」になりにくい Infrastructure as Code(IaC)
  12. 12. - コンテナ化による実行環境まで含んだプロセス - 同じ物理サーバでJava8とJava9が共存するのも容易 - 開発時でも本番時とほぼ同等の環境を再現出来る - 仮想化のオーバーヘッドが少ない - サービスを小分けにしても問題ない - 必要なサービスだけスケールされることが出来る マイクロサービスアーキテクチャ
  13. 13. いざプロダクトに導入するには考慮することが多い。。 慣れるために、 まずは小規模システムで導入してみましょう。 とはいえ... セキュリティ アクセス制御 ステージングと本番の差異安全なデプロイ オートスケール メトリクス・監視 ネットワーク・SSL DB接続先など環境固有の情報
  14. 14. 小規模システムに k8sを導入する
  15. 15. - とある社内向けサービス - GCP上で運用している - アプリサーバー(Play Framework) - DBサーバー1台(Cloud SQL) - GCSとのやり取りがある - (フロントはWebでSPAだけど今回は無視) 対象とするシステム
  16. 16. 対象とするシステム LB GCE DB GCS SSL
  17. 17. 1. サンプルアプリを通じて設計・動作確認をする 2. イメージを作成してローカルでの動作確認をする 3. 設定をテンプレート化して本番で動かす k8s化のステップ
  18. 18. 1. サンプルアプリを通じて 設計・動作確認をする
  19. 19. Kubernetes in Actionがわかりやすかったです。 (MEAPで読んでましたが、最終版がリリースされたようですね) これ一冊でだいたいは作れる気に なるのでオススメ k8sをちゃんと学ぶ
  20. 20. 構成を考えてみる Ingress SSL Node Node Service Pod Pod Web App SQL proxy Web App SQL proxy Config Map Secret Config Map Secret
  21. 21. Ingressを使うことでGKEが、SSL証明書を使って、GCPで管理しているIP を使って、LBを用意してくれる SSL / 外部IPの管理
  22. 22. 公式でProxyのDocker Imageが提供されているので それをpodに載せる https://cloud.google.com/sql/docs/mysql/connect-docker Cloud SQLへの接続 ↑ここで接続先を切り替える
  23. 23. DB接続先やパスワードなどは環境ごとに異なります。 こういう情報はDocker Imageに含めず、 後から差し込む必要があります。 - 実行時引数で渡す - 簡単で良いが、数が多いと見にくい - Containerのenvに列挙する - https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/ - 同じKeyのenvを何度も記載するのが大変 - Config Mapに含めて配布する 環境固有の情報の管理
  24. 24. - Config Mapに含めて配布する - ○ 環境変数が一箇所にまとまる - ✕ pod起動時にconfigMapが読まれるので、同じpodでも立ち上がるタイミング によっては設定が変わりうる。 環境固有の情報の管理
  25. 25. Cloud SQLへのアクセス権限などは、それ用のCredentialを作りsecretに 含めて配布します。 (secretの作成は、後述のHelmでtemplateから作れます) Credentialの管理
  26. 26. ログは、GKEが自動で取ってくれます。 メトリクスは、CPUやメモリの類は取ってくれます。 (playアプリのメトリクスを取るために kamon-stackdriverを作ったりしました。ぜひ。) ログ・メトリクス収集
  27. 27. 2. イメージを作成して ローカルでの動作確認をする
  28. 28. - Docker Imageを作ったら、minikube上で走らせる - minikubeでローカルのdocker imageを使う - Ingressは用意出来ないので、Service(Node Port)経由でアクセスす るか、podにport forwardingする - Forward a local port to a port on the pod - ローカルではCloud SQL proxyではなく実DBを用意する ローカルでの動作確認
  29. 29. ローカルでの動作確認 dockerd imageimage DB process Pod Web App Service ローカル
  30. 30. 3. 設定をテンプレート化して 本番で動かす
  31. 31. 設定のテンプレート化 k8sの各種設定(pod, service, configMap)は、 ローカル・ステージング・本番で異なることがあります → Helm (package manager for k8s) を使うことで、 環境の差異を考慮したテンプレートを作れます
  32. 32. 設定のテンプレート化(Pod)
  33. 33. 設定のテンプレート化(Secret)
  34. 34. まとめ
  35. 35. インフラ全体像
  36. 36. k8s全体像 Ingress SSL Node Node Service Pod Pod Web App SQL proxy Web App SQL proxy Config Map Secret Config Map Secret
  37. 37. まとめ - 小さい規模で徐々に試していけそう - 中規模の場合、サブシステムだけ分離するなど - 一度k8sに載れば、MicroService化していけそう - IaCを大方実践できるようになった - k8sを使うことで、設定通りの環境が維持出来る - ローカルでも本番で同じpodを再現できる - DeployもHelmコマンド一つでいける

×