プライベートクラウドにおける Kubernetes デプロイパターン

203e5cc4766b6b4d2360f8329b8e7559?s=47 O. Yuanying
September 07, 2018

プライベートクラウドにおける Kubernetes デプロイパターン

プライベートクラウドにおいて Kubernetes control plane を自前でデプロイする際のパターンです。

203e5cc4766b6b4d2360f8329b8e7559?s=128

O. Yuanying

September 07, 2018
Tweet

Transcript

  1. プライベートクラウドにおける Kubernetes デプロイパターン OTSUKA, Motohiro / Yuanying Z Lab Corporation

    Tech-on Meet Up #02
  2. この資料の取り扱いについては、 以下の URL を参照してください。 https://個人の見解.jp

  3. Agenda 1. 私 2. Kubernetes 3. Kubernetes アーキテクチャ 4. Kubernetes

    デプロイパターン 5. まとめ
  4. Who am I ? • OTSUKA, Motohiro / Yuanying ◦

    Z Lab Corporation ◦ 言語 ▪ Ruby (2007 - ) ▪ Python (2014 - ) ▪ Go (2017 - ) ◦ 趣味 ▪ ロードバイク (2009 - ) ▪ トライアスロン (2010 - )
  5. Currently I’m interested in...

  6. Kubernetes

  7. What is Kubernetes?

  8. Server Server Server Server App App App App App App

    App App コンテナ (App+Env) を管理、配布。 (どちらかというと Ansible, Chef, Puppet が競合ソフトウェア?)
  9. Kubernetes アーキテクチャ

  10. None
  11. apiserver

  12. apiserver Pod name: hoge

  13. apiserver etcd Pod name: hoge

  14. apiserver etcd Pod name: hoge Pod name: hoge Pod name:

    hoge Pod name: hoge
  15. apiserver scheduler etcd Pod name: hoge

  16. apiserver etcd scheduler Pod name: hoge node: 01 Pod name:

    hoge Pod name: hoge Pod name: hoge node: 01
  17. apiserver etcd scheduler kubelet kubelet kubelet kubelet kubelet Pod name:

    hoge node: 01
  18. apiserver etcd scheduler kubelet kubelet kubelet kubelet kubelet Pod name:

    hoge node: 01
  19. apiserver etcd scheduler kubelet kubelet kubelet kubelet kubelet

  20. apiserver etcd scheduler kubelet kubelet kubelet kubelet kubelet ReplicaSet name:

    fuga replica: 2
  21. apiserver etcd scheduler kubelet kubelet kubelet kubelet kubelet ReplicaSet name:

    fuga replica: 2 controller manager
  22. apiserver etcd scheduler kubelet kubelet kubelet kubelet kubelet ReplicaSet name:

    fuga replica: 2 controller manager Pod name: hoge Pod name: hoge
  23. apiserver etcd scheduler kubelet kubelet kubelet kubelet kubelet ReplicaSet name:

    fuga replica: 2 controller manager Pod name: hoge node: 03 Pod name: hoge node: 04
  24. apiserver etcd scheduler kubelet kubelet kubelet kubelet kubelet ReplicaSet name:

    fuga replica: 2 controller manager Pod name: hoge node: 03 Pod name: hoge node: 04
  25. apiserver etcd scheduler kubelet kubelet kubelet kubelet kubelet controller manager

    cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin
  26. apiserver etcd scheduler kubelet kubelet kubelet kubelet kubelet controller manager

    cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy
  27. apiserver controller manager scheduler etcd kubelet kubelet kubelet kubelet kubelet

    cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy dashboard dns metrics-server ingress-controller node-probrem-detector
  28. どこからどこまでが Kubernetes なのか?

  29. Kubernetes? https://github.com/kubernetes/community/blob/master/contributors/design-proposals/cluster-lifecycle/self-hosted-kubernetes.md

  30. apiserver controller manager scheduler etcd kubelet kubelet kubelet kubelet kubelet

    cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy dashboard dns metrics-server ingress-controller node-probrem-detector
  31. 通信要件

  32. apiserver controller manager scheduler etcd kubelet kubelet kubelet kubelet kubelet

    cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy dashboard dns metrics-server ingress-controller node-probrem-detector • all containers can communicate with all other containers without NAT • all nodes can communicate with all containers (and vice-versa) without NAT • the IP that a container sees itself as is the same IP that others see it as 1. Cluster Networking
  33. apiserver controller manager scheduler etcd kubelet kubelet kubelet kubelet kubelet

    cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy dashboard dns metrics-server ingress-controller node-probrem-detector 2. API Server (REST)
  34. apiserver controller manager scheduler etcd kubelet kubelet kubelet kubelet kubelet

    cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy dashboard dns metrics-server ingress-controller node-probrem-detector 3. etcd (gRPC)
  35. apiserver controller manager scheduler etcd kubelet kubelet kubelet kubelet kubelet

    cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy dashboard dns metrics-server ingress-controller node-probrem-detector 4. apiserver -> kubelet (REST) • apiserver から各 kubelet の REST の endpoint に到達可能でなければならない!
  36. これらのコンポーネントをどう配置していくのか??

  37. Kubernetes デプロイパターン

  38. 1. トラディショナルスタイル

  39. master apiserver scheduler cm master apiserver scheduler cm node kubelet

    node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin etcd etcd etcd etcd etcd etcd サーバには etcd/master などのロール が割り当てられる。 各コンポーネントはパッケージマネー ジャにてインストールされ、 init によっ て管理。 chef/ansible/puppet などの ツールにて各コンポーネント をデプロイ。
  40. master apiserver scheduler cm master apiserver scheduler cm etcd etcd

    master apiserver scheduler cm etcd node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin etcd と master を同居させてサーバ台 数削減。
  41. その他のアドオンどうするの?

  42. master apiserver scheduler cm master apiserver scheduler cm etcd etcd

    master apiserver scheduler cm etcd addons metrics-s ingress-c dns dashboad addons metrics-s ingress-c dns dashboad node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin
  43. 2. コンテナ化

  44. master apiserver scheduler cm master apiserver scheduler cm etcd etcd

    master apiserver scheduler cm etcd addons metrics-s ingress-c dns dashboad addons metrics-s ingress-c dns dashboad node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin 単に systemd の unit ファイル中の Exec を docker run にしただけ。
  45. master apiserver scheduler cm master apiserver scheduler cm etcd etcd

    master apiserver scheduler cm etcd node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin Deployment dashboad dashboad Deployment dns dns Deployment metrics-s metrics-s Deployment ingress-c ingress-c
  46. master apiserver scheduler cm master apiserver scheduler cm etcd etcd

    master apiserver scheduler cm etcd node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet node kubelet kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin Deployment dashboad dashboad Deployment dns dns Deployment metrics-s metrics-s Deployment ingress-c ingress-c addon が Kubernetes の管理下になることで、 k8s エコシステム上での管理が可能に。 • Prometheus での監視を一元化。 • ログ収集を一元化。 • オートヒーリングやロードバランシングなど k8s の機能を利用可能。
  47. Static Pods Node kubelet kube-apiserver Pod Manifest Pod Manifest IPC

    Network PID Hostname cgroup cgroup Nginx Confd manifest directory Kubelet が Pod のマニフェストを読み込む場所 1. kube-apiserver 2. ローカルのマニフェストディレクトリ
  48. node kubelet node kubelet node kubelet node kubelet node kubelet

    node kubelet Deployment dashboad dashboad Deployment dns dns Deployment metrics-s metrics-s Deployment ingress-c ingress-c Static Pod etcd scheduler cm apiserver Static Pod etcd scheduler cm apiserver Static Pod etcd scheduler cm apiserver Static Pod kube-proxy cni-plugin Static Pod kube-proxy cni-plugin Static Pod kube-proxy cni-plugin kube-proxy cni-plugin kube-proxy cni-plugin kube-proxy cni-plugin
  49. node kubelet node kubelet node kubelet node kubelet node kubelet

    node kubelet Deployment dashboad dashboad Deployment dns dns Deployment metrics-s metrics-s Deployment ingress-c ingress-c Static Pod etcd scheduler cm apiserver Static Pod etcd scheduler cm apiserver Static Pod etcd scheduler cm apiserver Static Pod kube-proxy cni-plugin Static Pod kube-proxy cni-plugin Static Pod kube-proxy cni-plugin kube-proxy cni-plugin kube-proxy cni-plugin kube-proxy cni-plugin Kubernetes API で各コンポーネントの状態が把握可能。 ただし、ローリングアップデートなどは不可能、デプロイ自体 は k8s 外で行うことになる。
  50. 公式: 「Static Pods なんて使ってんじゃねーよ!」 https://kubernetes.io/docs/tasks/administer-cluster/static-pod/

  51. 3. Kubernetes 化

  52. node kubelet node kubelet node kubelet node kubelet node kubelet

    node kubelet Deployment dashboad dashboad Deployment dns dns Deployment metrics-s metrics-s Deployment ingress-c ingress-c Static Pod etcd scheduler cm apiserver Static Pod etcd scheduler cm apiserver Static Pod etcd scheduler cm apiserver Static Pod Static Pod Static Pod DS kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy DS cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin
  53. apiserver や controller manager, scheduler は? http://www.theblaze.com/blog/2013/01/24/finally-the-answer-sort-of-for-what-came-first-the-chicken-or-the-egg/

  54. node kubelet node kubelet node kubelet node kubelet node kubelet

    node kubelet Deployment dashboad dashboad Deployment dns dns Deployment metrics-s metrics-s Deployment ingress-c ingress-c Static Pod etcd scheduler cm apiserver Static Pod etcd scheduler cm apiserver Static Pod etcd scheduler cm apiserver Static Pod Static Pod Static Pod DS kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy DS cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin 必須 addons を k8s 上で動かし、コアコンポーネントを Static Pod で動かすのが現在のスタンダード。
  55. それでも全てを Kubernetes の管理下におきたい。

  56. 4. Self-hosted Kubernetes

  57. node kubelet node kubelet node kubelet node kubelet node kubelet

    node kubelet Deployment dashboad dashboad Deployment dns dns Deployment metrics-s metrics-s Deployment ingress-c ingress-c DS kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy kube-proxy DS cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin cni-plugin Deployment etcd etcd etcd DS apiserver apiserver apiserver Deployment scheduler scheduler Deployment cm cm いくつかのデプロイツールでサポート。
  58. なぜ全てを Kubernetes の管理下におきたいのか。

  59. Self-hosted Kubernetes 化によるメリット 1. Small dependencies 2. Deployment consistency 3.

    Introspection 4. Cluster Upgrades 5. Easier Highly-Available Configurations
  60. Self-hosted Kubernetes 化によるメリット • Kubernetes の control plane を Kubernetes

    によって管理させることで、その他のデ プロイツールへの依存を排除し、インフラを含めた全てのアプリケーションの管理を Kubernetes へと一元化。 ◦ Kubernetes 上のアプリケーション管理のノウハウをそのままインフラである Kubernetes の管理に適 用可能。 ▪ HPA によるオートスケール ▪ オートヒーリング ▪ ロードバランシグ ▪ ローリングアップデート • アプリケーションをクラウドネイティブにするだけでなく、そのインフラもクラウドネイ ティブに。
  61. Kubernetes もコンテナオーケストレーションのための、 アプリケーションである! Kubernetes で管理させよう!

  62. まとめ

  63. まとめ • アプリケーションはクラウドネイティブなアーキテクチャに。 ◦ Kubernetes 上で動かそう。 • Kubernetes のデプロイは? ◦

    トラディショナルに VM/ サーバ 上にペットのように可愛がる? ◦ パッケージマネージャでインストールして依存関係地獄に陥らないようにコンテナ化? ◦ 簡単に Kubernetes 上に乗せられるコンポーネントは Kubernetes で管理? ◦ 全てを Kubernetes で管理?
  64. One more thing...

  65. オンプレミスであっても、 そもそも Kubernetes を使いたいだけであって、 管理なんてしたくないよ…。

  66. Kubernetes as a Service

  67. Thanks! We are hiring?