Slide 1

Slide 1 text

Kubernetes Networking 101 Kubernetes Novice Tokyo #4 Presented by @inductor

Slide 2

Slide 2 text

自己紹介 名前: 太田 航平 (@inductor) 所属: HPE 役職: ソリューションアーキテクト Kubernetes SIG-Docs Japanese localization owner Cloud Native Ambassador Docker Meetup Tokyo、CNDT2020運営

Slide 3

Slide 3 text

Kubernetesのネットワークは複雑

Slide 4

Slide 4 text

ていうか、そもそもコンテナの ネットワークが複雑!

Slide 5

Slide 5 text

今日のゴール ● Dockerのネットワークがわかる ● DockerとKubernetesのなりたちの違いがわかる ○ DockerとKubernetesのネットワーク的な要件の違い ● Kubernetesでネットワークをつなげる仕組みの登場人物がわかる → コンテナネットワーク完全に理解した

Slide 6

Slide 6 text

アジェンダ ● Dockerのネットワーク ○ コンテナとネットワークの関係 ● Kubernetesのネットワーク ○ DockerとKubernetesのネットワーク要件の違い ■ Docker→Kubernetesに思考を引き上げる場合に生まれるネットワークの問題 ■ Kubernetesでの解決策 ● Kubernetesのネットワークを形作るコンポーネントとその役割 ○ kube-proxy ○ CNI ■ よく使われるCNIの特徴

Slide 7

Slide 7 text

Dockerのネットワーク

Slide 8

Slide 8 text

Dockerのよくあるユースケース Docker Compose 80:80 3000 3306

Slide 9

Slide 9 text

Dockerのよくあるユースケース Docker Compose 80:80 3000 3306 Webなので公開 アプリは 内部だけ DBは 内部だけ

Slide 10

Slide 10 text

Dockerとネットワーク、ボリューム Volume Volume Volume Docker Volume Docker Container Docker Network docker0 bridge ローカルの80 仮想NIC 仮想NIC 仮想NIC 10.0.0.0/24 172.16.0.0/24

Slide 11

Slide 11 text

ネットワークとボリュームは外部割り当て? Volume Volume Volume Docker Volume Docker Container Docker Network docker0 bridge ローカルの80 仮想NIC 仮想NIC 仮想NIC 10.0.0.0/24 172.16.0.0/24

Slide 12

Slide 12 text

ネットワークとボリュームは外部割り当て Volume Volume Volume Docker Volume Docker Container Docker Network docker0 bridge ローカルの80 仮想NIC 仮想NIC 仮想NIC

Slide 13

Slide 13 text

ネットワークとボリュームは外部割り当て Volume Volume Volume Docker Volume Docker Container Docker Network docker0 bridge ローカルの80 仮想NIC 仮想NIC 仮想NIC Kubernetes Novice Tokyo #2 のセッション資料が詳しいので 合わせてご覧ください

Slide 14

Slide 14 text

Dockerネットワークの種類 ● bridge - 指定がない場合にデフォルトで使用 ○ 所属するコンテナが直接通信でき、お手軽 ● macvlan - macvlanが使える ○ 仮想NICにMACアドレスが持てる ○ VMから移行したい場合などに使えるかも?ただし ホストのNICが使えなくなる制限有 ● none - 「何も繋がない」ができる ○ loopback(127.0.0.1)以外に仮想NICが繋がらないモード ● Network plugins - その他サードパーティのプラグインを使う場合 ○ プラグイン自体とても少なく利用例が ほとんどない

Slide 15

Slide 15 text

コンテナとネットワークの関係

Slide 16

Slide 16 text

を話す前にコンテナの仕組みを さらっと復習します

Slide 17

Slide 17 text

コンテナの仕組み / /home /var /tmp /var/a /var/b /var/c /tmp/d ここに、あるLinuxホストのファイルシステムがあります

Slide 18

Slide 18 text

コンテナの仕組み / /home /var /tmp /var/a /var/b /var/c /tmp/d / / / / pivot_root pivot_root pivot_root pivot_root あるディレクトリをルートに見せかける pivot_root

Slide 19

Slide 19 text

コンテナの仕組み / /home /var /tmp /var/a /var/b /var/c /tmp/d / / / / namespace namespace namespace namespace ユーザーIDやNW、プロセス空間などを分離する namespace root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24

Slide 20

Slide 20 text

コンテナの仕組み / /home /var /tmp /var/a /var/b /var/c /tmp/d / / / / 各領域のCPU、メモリリソースなどを cgroupで制限 root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24 1CPU 2GB 1CPU 2GB 1CPU 2GB 2CPU 4GB

Slide 21

Slide 21 text

コンテナの仕組み / /home /var /tmp /var/a /var/b /var/c /tmp/d / / / / アプリケーションが動作するために必要なファイルたちを tar.gz形式でパッケージングしてこいつらの上にのっけて ... root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24 1CPU 2GB 1CPU 2GB 1CPU 2GB 2CPU 4GB nginx on Ubuntu Node on Alpine Ruby on CentOS Debian

Slide 22

Slide 22 text

/var /tmp コンテナの仕組み / /home /var/a /var/b /var/c /tmp/d / / / / 展開したファイルシステムの実行ファイルをプロセスとして起動! 1CPU 2GB 1CPU 2GB 1CPU 2GB 2CPU 4GB nginx on Ubuntu Node on Alpine Ruby on CentOS Debian root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24 プロセス起動!

Slide 23

Slide 23 text

/var /tmp コンテナの仕組み / /home /var/a /var/b /var/c /tmp/d / / / / 展開したファイルシステムの実行ファイルをプロセスとして起動! 1CPU 2GB 1CPU 2GB 1CPU 2GB 2CPU 4GB nginx on Ubuntu Node on Alpine Ruby on CentOS Debian root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24 プロセス起動! これ1つ1つがコンテナ

Slide 24

Slide 24 text

/var /tmp コンテナの仕組み / /home /var/a /var/b /var/c /tmp/d / / / / 展開したファイルシステムの実行ファイルをプロセスとして起動! 1CPU 2GB 1CPU 2GB 1CPU 2GB 2CPU 4GB nginx on Ubuntu Node on Alpine Ruby on CentOS Debian root 10.0.0.1/24 root 10.0.0.2/24 root 10.0.0.3/24 root 10.0.0.3/24 プロセス起動! これ1つ1つがコンテナ これがコンテナイメージね

Slide 25

Slide 25 text

Dockerコンテナとネットワークの関係 ● コンテナはさまざまなリソースを隔離した結果生まれるもの ○ ネットワークもその1要素で、 NICは付けたり付けなかったりできる ● Noneドライバーを用いた場合、ネットワーク的に隔離されたコンテナができあが る ● ブリッジの場合は仮想スイッチにどんどん接続されて相互に接続ができる ○ Dockerの内部DNSも勝手に参加するので、コンテナ名がついていれば名前で DNSも引ける ○ 設定ファイルでdb:3306とかweb:80とかapp:3000みたいなことが書けるのはそのおかげ ○ 簡易的ではあるがいわゆる「サービスディスカバリ」の一種

Slide 26

Slide 26 text

ここまでのまとめ ● Dockerのネットワークとボリュームは外からアタッチすることができる ○ docker volume, docker networkコマンドで確認してみてね! ● ネットワーク機構にはいくつかの種類がある ○ 要件に合わせて選択することが可能

Slide 27

Slide 27 text

Kubernetesのネットワーク

Slide 28

Slide 28 text

手元のKubernetesの中身を覗いてみる ● 外部に公開しているLonghornのWeb UIは、TCPの80番でLoadBalancerが アタッチされている ● でも、Dockerではポートの割り当てが発生していない ○ なんで?

Slide 29

Slide 29 text

手元のKubernetesの中身を覗いてみる ● 外部に公開しているLonghornのWeb UIは、TCPの80番でLoadBalancerが アタッチされている ● でも、Dockerではポートの割り当てが発生していない ○ なんで? こたえ: Dockerのネットワークを使っていないから!!!

Slide 30

Slide 30 text

Kubernetesの仕組み ● コンテナを中心とした「分散システム」 ○ 複数のマシンリソース (物理/仮想マシン)をクラスターにまとめて、アプリケーションをいい感じに 動かす ○ (設定次第だけど)どのマシンでコンテナが動いても「同じように」動作する必要がある → マシンの持つネットワークに依存しない透過的なネットワークが必要 それが理由で、Kubernetesのネットワークの基本はOverlay network構成

Slide 31

Slide 31 text

Kubernetesの仕組み Pod Pod Pod Pod network(overlay) Service Network(overlay) Node Network(not overlay) 普通のサーバーがつながる ネットワーク ClusterIPなどサービス間の 通信で使うネットワーク コンテナ(Pod)自体に IPアドレスを持たせるためのネッ トワーク kube-proxy CNI

Slide 32

Slide 32 text

Kubernetesの仕組み Pod Pod Pod Node Network(not overlay) Pod network(overlay) Service Network(overlay) 普通のサーバーがつながる ネットワーク ClusterIPなどサービス間の 通信で使うネットワーク コンテナ(Pod)自体に IPアドレスを持たせるためのネッ トワーク Podが入れ替わっても 同じように動作する Nodeが障害を起こすと Podは自動で退避 kube-proxy CNI

Slide 33

Slide 33 text

Kubernetesのネットワークコンポーネント ● kube-proxy - 各ノードで動作 ○ 各ノードでコンテナネットワークへの入り口を作る役割 ■ 無いと、コンテナの外と中の経路が通らない ○ Linuxのiptablesやipvsを利用(最近ではeBPFベースの実装もある ) ○ Serviceの実装 ■ https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/service.go ● CNI(Container Network Interface) - クラスター全体で動作 ○ Docker network driver相当のプラグイン機構を提供 ○ Overlay Networkを提供 ○ 外のネットワーク(プロトコル)とKubernetesのネットワークをつなげる ○ 無いと、NodeのステータスがReadyにならない

Slide 34

Slide 34 text

Kubernetesのネットワークコンポーネント ● kube-proxy ○ 各ノードでコンテナネットワークへの入り口を作る役割 ○ Linuxのiptablesやipvsを利用(最近ではeBPFベースの実装もある ) ○ Serviceの実装 ■ https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/service.go ● CNI(Container Network Interface) ○ Docker network driver相当のプラグイン機構を提供 ○ クラスター全体のOverlay Networkを提供 ○ 外のネットワーク(プロトコル)とKubernetesのネットワークをつなげる ○ 無いと、NodeのステータスがReadyにならない

Slide 35

Slide 35 text

Kubernetesのネットワークコンポーネント ● kube-proxy ○ 各ノードでコンテナネットワークへの入り口を作る役割 ○ Linuxのiptablesやipvsを利用(最近ではeBPFベースの実装もある ) ○ Serviceの実装 ■ https://github.com/kubernetes/kubernetes/blob/master/pkg/proxy/service.go ● CNI(Container Network Interface) ○ Docker network driver相当のプラグイン機構を提供 ○ クラスター全体のOverlay Networkを提供 ○ 外のネットワーク(プロトコル)とKubernetesのネットワークをつなげる ○ 無いと、NodeのステータスがReadyにならない CNIでアタッチしたNIC kube-proxyでコンテナ外 からの通信を流す

Slide 36

Slide 36 text

いろいろなCNI ● Calico ○ 最も人気&歴史がある ○ BGP(L3)ベースのネットワークでスケールしやすい ● Cilium ○ eBPFを用いた高パフォーマンス &スケーラブルなプラグイン ○ 最近人気になってきた ○ GKEでも最近導入がアナウンスされた ● Weave Net ● Amazon VPC CNI plugin

Slide 37

Slide 37 text

ここまでのまとめ ● Kubernetesが複数マシンを束ねて動かすためにはOverlay networkが重要 ● CNIはOverlay networkの構築と、Pod(コンテナ)にネットワークの機能を 与えるためのコンポーネント ● kube-proxyは、ノードに流れてきたPod向け通信をPodに流す役割を持つ

Slide 38

Slide 38 text

ここまでのまとめ ● Kubernetesが複数マシンを束ねて動かすためにはOverlay networkが重要 ● CNIはOverlay networkの構築と、Pod(コンテナ)にネットワークの機能を 与えるためのコンポーネント ● kube-proxyは、ノードに流れてきたPod向け通信をPodに流す役割を持つ 完全に理解できましたか?

Slide 39

Slide 39 text

(質問があれば)Q&Aタイム

Slide 40

Slide 40 text

おわり