Slide 1

Slide 1 text

怖くない! コンテナ初心者に送る やさしいKubernetes入門

Slide 2

Slide 2 text

本発表の主旨 ▫ Kubernetesのとっつきづらさ ▫ 多くの専門用語 ▫ 複雑なアーキテクチャ ▫ 捉えにくい全体像 ▫ 英語・中国語のみのドキュメント 日本語で補足補完し Kubernetesの概要・全体像を理解 2

Slide 3

Slide 3 text

HELLO! Name HN Co., Mission 斎藤辰徳 (サイトウ・タツノリ) bbrfkr (ビビリフクロウ) TIS株式会社 技術施策推進(インフラ) ▫ 技術支援 ▫ 技術啓蒙 3

Slide 4

Slide 4 text

Agenda ▫ コンテナとDocker ▫ Kubernetesとは ▫ Kubernetesのアーキテクチャ ▫ Kubernetesに触れてみる ▫ まとめ 4

Slide 5

Slide 5 text

コンテナとDocker Summary of container and Docker

Slide 6

Slide 6 text

Container Container コンテナとは ▫ 他のプロセスから隔離された プロセス実行環境 ▫ コンテナの特徴 ▫ 高速な起動 ▫ 高い可搬性 ▫ 高いリソース利用効率 Infrastructure Operating System Bin/Lib App Bin/Lib App Container Engine 6

Slide 7

Slide 7 text

Dockerとは ▫ コンテナ/イメージのライフサイクルを管理するOSS 7 Ship Run Build イメージの共有 イメージの作成 Docker file コンテナの実行

Slide 8

Slide 8 text

Dockerのここがイマイチ ▫ 可用性 ▫ 監視 ▫ 負荷分散 ▫ スケーリング ▫ 大量コンテナの管理 8

Slide 9

Slide 9 text

Dockerのここがイマイチ ▫ 可用性 サービス継続稼働のために必ず欲しい Docker Host Docker Host Docker Host Resource Pool 9

Slide 10

Slide 10 text

Dockerのここがイマイチ ▫ 監視 コンテナの正常動作をモニターしたい 10

Slide 11

Slide 11 text

Dockerのここがイマイチ ▫ 負荷分散 コンテナへのアクセスを仲介するモノが欲しい ? 11 IP: ???

Slide 12

Slide 12 text

Dockerのここがイマイチ ▫ スケーリング コンテナの負荷に応じてオートスケールしたい 12

Slide 13

Slide 13 text

Dockerのここがイマイチ ▫ 大量コンテナの管理 ▫ 対象サービスに関連するコンテナを一発で起動・停止したい ▫ どのホストにどのコンテナが乗っているかを意識したくない Docker Host Docker Host 13 Docker Host Docker Host Docker Host

Slide 14

Slide 14 text

14 Kubernetesとは What is Kubernetes?

Slide 15

Slide 15 text

Kubernetes(k8s) ▫ Dockerの課題を解決するようなOSS ▫ Dockerホストをクラスタリング ▫ コンテナアプリの本番運用基盤を形成 15

Slide 16

Slide 16 text

k8sが解決する課題 ▫ 可用性 Hostのクラスタ化による障害時のコンテナ再起動 Docker Host Docker Host Docker Host Resource Pool 16

Slide 17

Slide 17 text

k8sが解決する課題 ▫ 監視 Liveness、Readinessによる死活・健全性監視の実現 17

Slide 18

Slide 18 text

k8sが解決する課題 ▫ 負荷分散 Podアクセスへの仲介であるService(svc)の実装 18 IP: ??? svc svc IP: x.x.x.x IP: x.x.x.x

Slide 19

Slide 19 text

k8sが解決する課題 ▫ スケーリング HorizontalPodAutoscaler(hpa)によるオートスケーリング 19 hpa hpa !!

Slide 20

Slide 20 text

k8sが解決する課題 ▫ 大量コンテナの管理 ▫ ManifestファイルによるInfrastructure as Code(IaC)化 ▫ IaC化によるコンテナのオーケストレーション Docker Host 20 Docker Host Docker Host Mani fest Mani fest Delete Create

Slide 21

Slide 21 text

k8sが解決する課題 ▫ 可用性 ▫ 監視 ▫ 負荷分散 ▫ スケーリング ▫ 大量コンテナの管理 21 Hostのクラスタ化 Liveness、Readiness Service HorizontalPodAutoscaler Manifestファイル

Slide 22

Slide 22 text

Kubernetesのアーキテクチャ Kubernetes architecture

Slide 23

Slide 23 text

k8sオブジェクト k8sのアーキテクチャレイヤ k8sクラスタ 23 deploy rs svc ing Pod kube-apiserver Kubernetesによって 抽象化されたオブジェ クト群でコンテナアプリ を実現 k8sオブジェクトの機能 を実現するためのサー バ群 deploy: Deployment rs: ReplicaSet ing: Ingress svc: Service

Slide 24

Slide 24 text

コンテナアプリの実現 k8sユーザ エンドユーザ 24 rs deploy: Deployment rs: ReplicaSet ing: Ingress svc: Service イメージレジストリ deploy svc ing pod pod pod url kubectl create -f : 作成 : ユーザアクセス

Slide 25

Slide 25 text

知っておきたい k8s用語 ▫ Pod ▫ Deployment ▫ ReplicaSet ▫ Service ▫ Ingress ▫ HorizontalPodAutoscaler 25

Slide 26

Slide 26 text

Pod ▫ 複数コンテナをまとめたもの ▫ k8sが扱う最小単位 ▫ コンテナ間でIPを共有 ▫ コンテナ間でボリュームを共有 ▫ Pod単位での作成/削除 ▫ 共にスケールすべきコンテナを 格納 pod Shared Volume IP 26

Slide 27

Slide 27 text

▫ コンテナアプリのデプロイ方式を定義 pod pod Deployment(deploy) revision=1 revision=2 27 pod deploy rs rs rs deploy pod pod image: docker.io/httpd command: - "httpd" - "-DFOREGROUND"

Slide 28

Slide 28 text

▫ 要求数分のPodが起動している状態を保持 pod ReplicaSet(rc) replicas=2 replicas=2 28 rs rs pod pod pod pod

Slide 29

Slide 29 text

Service(svc) ▫ Pod達に対するエンドポイント (IPと名前) pod IP: ??? ? !! IP: 172.16.0.100 名前: tomcat 29 pod pod svc pod IP: ??? pod IP: ??? pod IP: ??? pod IP: ??? pod IP: ???

Slide 30

Slide 30 text

pod pod pod Ingress(ing) ▫ エンドユーザがServiceにアクセス可能なURLを提供 30 svc pod pod pod svc ing url

Slide 31

Slide 31 text

HorizontalPodAutoscaler(hpa) ▫ Podのオートスケールを実現 ▫ DeploymentやReplicaSetに紐づきPod数を操作 31 deploy rs hpa deploy rs hpa pod pod pod pod !!

Slide 32

Slide 32 text

k8sオブジェクト k8sのアーキテクチャレイヤ k8sクラスタ 32 deploy rs svc ing pod kube-apiserver Kubernetesによって 抽象化されたオブジェ クト群でコンテナアプリ を実現 k8sオブジェクトの機能 を実現するためのサー バ群 deploy: Deployment rs: ReplicaSet ing: Ingress svc: Service

Slide 33

Slide 33 text

k8sを構成するサーバ群 Master kube-apiserver kube-controller-manager kube-scheduler etcd etcd k8sユーザ エンドユーザ Node kubelet kube-proxy CNI実装 Node kubelet kube-proxy CNI実装 ... App Pod ... Ingress Controller 33 ... ユーザアクセス ... APIコール

Slide 34

Slide 34 text

k8sを構成するサーバ群 ▫ Masterサーバのプロセス群 ▫ kube-apiserver ▫ APIエンドポイントとして機能 ▫ kube-controller-manager ▫ 各種コントローラを実行・管理 ▫ kube-scheduler ▫ PodのNodeへの割り当て 34

Slide 35

Slide 35 text

k8sを構成するサーバ群 ▫ etcdサーバのプロセス群 ▫ etcd ▫ k8sクラスタの構成情報を格納するKVS ▫ クラスタを構成するNodeの情報 ▫ ReplicaSetの現在の複製数 ▫ Podの現在の状態 ▫ etc... 35

Slide 36

Slide 36 text

k8sを構成するサーバ群 ▫ Nodeサーバのプロセス群 ▫ kubelet ▫ 実際にPodを実行するエージェント ▫ kube-proxy ▫ Serviceの仮想IPへのアクセスをPodに転送 ▫ CNI(Container Network Interface)実装 ▫ コンテナネットワークを実現 36

Slide 37

Slide 37 text

k8sのネットワーク(コンテナネットワーク) ▫ 別ホスト上のPod同士は直接通信できない 37 Node Node pod pod pod pod docker0(仮想ブリッジ) docker0(仮想ブリッジ)

Slide 38

Slide 38 text

k8sのネットワーク(コンテナネットワーク) ▫ CNI実装により別ホスト上のPod同士が通信可能に 38 Node Node pod pod pod pod 例) CNI実装=flannelの場合 flannelによるSDN(L2) docker0(仮想ブリッジ) docker0(仮想ブリッジ)

Slide 39

Slide 39 text

k8sのネットワーク(Serviceネットワーク) ▫ Serviceが払出したIP(ClusterIP)にアクセスすると kube-proxyが背後のPodへのアクセスに変換 39 Node Node pod2 pod1 pod4 pod3 svc IP: 10.1.0.100 kube-proxy kube-proxy dest: 10.1.0.100 dest: pod4 flannelによるSDN(L2) docker0(仮想ブリッジ) docker0(仮想ブリッジ)

Slide 40

Slide 40 text

40 Kubernetesに触れてみる Try Kubernetes

Slide 41

Slide 41 text

k8sクラスタの構築方法 ▫ クラウドのマネージドサービスを使う ▫ GKE、EKS、AKSなど ▫ 自前で作る ▫ ツールを使う ▫ 一から手動 41 k8sクラスタを管理する立場の方には ぜひ一度挑戦してみることをおススメ

Slide 42

Slide 42 text

k8sクラスタ構築時のつまずきポイント Q: A: 42 kubeletが起動してくれない! サーバのswapが有効になっていませんか? kubeletはswap領域が存在していると起動しないよう になっています。 またdockerのcgroup driverとkubeletのcgroup driverが一致していない時もkubeletは起動しません。 あわせて確認してください。

Slide 43

Slide 43 text

k8sクラスタ構築時のつまずきポイント Q: A: 43 Serviceの仮想IPからPodにアクセスできない! まずはkube-proxyが正しく動作していることを確認 します。動作している場合はコンテナネットワークが 上手く形成できていない可能性があります。特に手動 構築でflannelを利用しているときはdockerとの連携 が正しく行われていることを確認しましょう。

Slide 44

Slide 44 text

k8sクラスタ構築時のつまずきポイント Q: A: 44 kubernetes-dashboardってBasic認証できない? kubernetes-dashboardのManifestにオプションを付 与して展開することで可能です。ただし、Basic認証 を利用するにはkube-apiserverが認可方式にRBACだ けでなく、ABAC(Attribute Based Access Control) を利用する設定にする必要があります。

Slide 45

Slide 45 text

k8sクラスタ構築時のつまずきポイント Q: A: 45 Cloud ProviderにAWSを使いたい! 「kubeadm init」する前に以下の設定をしましょう。 1. EC2インスタンスとSecurityGroupにタグ 「KubernetesCluster=<クラスタ名>」をつける 2. kubeletの起動オプションに「--cloud- provider=aws」をつける 3. kubeadmのconfigに「cloudProvider: aws」と 「nodeName: 」をつける

Slide 46

Slide 46 text

k8sの遊び場 ▫ Katacoda 46

Slide 47

Slide 47 text

k8sの遊び場 ▫ Katacoda 47

Slide 48

Slide 48 text

k8sの遊び場 ▫ Play with Kubernetes(PWK) 48

Slide 49

Slide 49 text

Kubernetesの遊び場 49 ▫ Play with Kubernetes(PWK) まとめ Conclusion

Slide 50

Slide 50 text

まとめ ▫ Kubernetes(k8s) ▫ Dockerホストのクラスタリング ▫ コンテナアプリの本番運用基盤を形成 ▫ Kubernetesのアーキテクチャ ▫ k8sオブジェクトレイヤとk8sクラスタレイヤ ▫ 前者はk8sユーザが、後者はクラスタ管理者が意識 k8sには固有の概念が多いので 触りながら理解していきましょう 50

Slide 51

Slide 51 text

51