Share
Embed
Kubernetes Networking 101
Kohei Ota
August 25, 2020
Transcript
40 slides
-
自己紹介 名前: 太田 航平 (@inductor) 所属: HPE 役職: ソリューションアーキテクト Kubernetes
SIG-Docs Japanese localization owner Cloud Native Ambassador Docker Meetup Tokyo、CNDT2020運営 -
アジェンダ • Dockerのネットワーク ◦ コンテナとネットワークの関係 • Kubernetesのネットワーク ◦ DockerとKubernetesのネットワーク要件の違い ▪
Docker→Kubernetesに思考を引き上げる場合に生まれるネットワークの問題 ▪ Kubernetesでの解決策 • Kubernetesのネットワークを形作るコンポーネントとその役割 ◦ kube-proxy ◦ CNI ▪ よく使われるCNIの特徴 -
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 -
ネットワークとボリュームは外部割り当て? 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 -
ネットワークとボリュームは外部割り当て Volume Volume Volume Docker Volume Docker Container Docker Network
docker0 bridge ローカルの80 仮想NIC 仮想NIC 仮想NIC -
ネットワークとボリュームは外部割り当て Volume Volume Volume Docker Volume Docker Container Docker Network
docker0 bridge ローカルの80 仮想NIC 仮想NIC 仮想NIC Kubernetes Novice Tokyo #2 のセッション資料が詳しいので 合わせてご覧ください -
Dockerネットワークの種類 • bridge - 指定がない場合にデフォルトで使用 ◦ 所属するコンテナが直接通信でき、お手軽 • macvlan -
macvlanが使える ◦ 仮想NICにMACアドレスが持てる ◦ VMから移行したい場合などに使えるかも?ただし ホストのNICが使えなくなる制限有 • none - 「何も繋がない」ができる ◦ loopback(127.0.0.1)以外に仮想NICが繋がらないモード • Network plugins - その他サードパーティのプラグインを使う場合 ◦ プラグイン自体とても少なく利用例が ほとんどない -
コンテナの仕組み / /home /var /tmp /var/a /var/b /var/c /tmp/d /
/ / / pivot_root pivot_root pivot_root pivot_root あるディレクトリをルートに見せかける pivot_root -
コンテナの仕組み / /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 -
コンテナの仕組み / /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 -
コンテナの仕組み / /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 -
/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 プロセス起動! -
/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つがコンテナ -
/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つがコンテナ これがコンテナイメージね -
Dockerコンテナとネットワークの関係 • コンテナはさまざまなリソースを隔離した結果生まれるもの ◦ ネットワークもその1要素で、 NICは付けたり付けなかったりできる • Noneドライバーを用いた場合、ネットワーク的に隔離されたコンテナができあが る •
ブリッジの場合は仮想スイッチにどんどん接続されて相互に接続ができる ◦ Dockerの内部DNSも勝手に参加するので、コンテナ名がついていれば名前で DNSも引ける ◦ 設定ファイルでdb:3306とかweb:80とかapp:3000みたいなことが書けるのはそのおかげ ◦ 簡易的ではあるがいわゆる「サービスディスカバリ」の一種 -
Kubernetesの仕組み • コンテナを中心とした「分散システム」 ◦ 複数のマシンリソース (物理/仮想マシン)をクラスターにまとめて、アプリケーションをいい感じに 動かす ◦ (設定次第だけど)どのマシンでコンテナが動いても「同じように」動作する必要がある →
マシンの持つネットワークに依存しない透過的なネットワークが必要 それが理由で、Kubernetesのネットワークの基本はOverlay network構成 -
Kubernetesの仕組み Pod Pod Pod Pod network(overlay) Service Network(overlay) Node Network(not
overlay) 普通のサーバーがつながる ネットワーク ClusterIPなどサービス間の 通信で使うネットワーク コンテナ(Pod)自体に IPアドレスを持たせるためのネッ トワーク kube-proxy CNI -
Kubernetesの仕組み Pod Pod Pod Node Network(not overlay) Pod network(overlay) Service
Network(overlay) 普通のサーバーがつながる ネットワーク ClusterIPなどサービス間の 通信で使うネットワーク コンテナ(Pod)自体に IPアドレスを持たせるためのネッ トワーク Podが入れ替わっても 同じように動作する Nodeが障害を起こすと Podは自動で退避 kube-proxy CNI -
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にならない -
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にならない -
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でコンテナ外 からの通信を流す -
いろいろなCNI • Calico ◦ 最も人気&歴史がある ◦ BGP(L3)ベースのネットワークでスケールしやすい • Cilium ◦
eBPFを用いた高パフォーマンス &スケーラブルなプラグイン ◦ 最近人気になってきた ◦ GKEでも最近導入がアナウンスされた • Weave Net • Amazon VPC CNI plugin