6 Kubernetes imposes the following fundamental requirements on any networking implementation (barring any intentional network segmentation policies): 1. pods on a node can communicate with all pods on all nodes without NAT 2. agents on a node (e.g. system daemons, kubelet) can communicate with all pods on that node Note: For those platforms that support Pods running in the host network (e.g. Linux): 3. pods in the host network of a node can communicate with all pods on all nodes without NA “ ” ...
Network / Cluster Network 3. kubeletとCNIプラグイン 4. Service Network ⼤雑把に4つに分けて考えるとよさそう 9 Node Node Node NIC NIC NIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin
インフラによって実態は異なる • ベアメタル、クラウドプロバイダが提供する仮想ネットワーク、...etc 10 Node Node Node NIC NIC NIC Pod Pod VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin
• Node Network上にソフトウェア的に構成される論理ネットワーク – クラスター内の全Podが、互いのIPアドレスでNATなしで通信可能 • 他にも要件がある(後述) 11 Node Node Node NIC NIC NIC Pod Pod VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin
kubeletがPodを起動するときにCNIプラグインを実⾏することでこれを⾏って いる 12 Node Node Node NIC NIC NIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin 接続 !
Pod Pod VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod VNIC ? 4/4: Service Network • Podに対する通信において、以下のような機能を提供する – 名前解決 – ロードバランシング – サービスディスカバリ 13 kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin 例:ホスト名を名前解決。複数のPodにロードバランシング ホスト名: backend.sockshop.svc にアクセス
公式ドキュメントの中で “Cluster Networking” と呼ばれているモノ – クラスターを⾃⼒構築する場合、Flannel, Calicoなどのソフトウェアを使って構 築するのが⼀般的(Kubernetesの指定のものがあるわけではない) 16 Node Node Node NIC NIC NIC Pod Pod VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin Pod VNIC
17 Kubernetes imposes the following fundamental requirements on any networking implementation (barring any intentional network segmentation policies): 1. pods on a node can communicate with all pods on all nodes without NAT 2. agents on a node (e.g. system daemons, kubelet) can communicate with all pods on that node Note: For those platforms that support Pods running in the host network (e.g. Linux): 3. pods in the host network of a node can communicate with all pods on all nodes without NAT “ ” ...
各NodeでLinux Bridgeによってサブネットが構成される • Nodeをまたがる通信は、Flannelのデーモンプロセスによってカプセ ル化されて他Nodeに透過的に送信される 19 Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin
Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin 192.168.1.2 192.168.2.2 192.168.2.2
NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin 192.168.1.2 192.168.2.2 192.168.2.2 192.168.254.12
Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin 192.168.1.2 192.168.2.2 192.168.2.2 192.168.254.12
NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin 192.168.1.2 192.168.2.2 192.168.2.2
Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin 192.168.1.2 192.168.2.2 192.168.2.2
• Flannel, CalicoなどのCluster Networkソリューションを利⽤して実現 • フラットにクラスター内のPodが接続された状態を作るなど、いくつかの Kubernetesの要件を満たす必要がある 25 Node Node Node NIC NIC NIC Pod Pod VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin Pod VNIC
いる 27 Node Node Node NIC NIC NIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin 接続 !
plugin is responsible for inserting a network interface into the container network namespace (e.g. one end of a veth pair) and making any necessary changes on the host (e.g. attaching the other end of the veth into a bridge). It should then assign the IP to the interface and setup the routes consistent with the IP Address Management section by invoking appropriate IPAM plugin. “ ” • つまり、だいたい以下のようなことをやっている – PodにNICをinsertする – Node上で必要な処理を⾏う(FlannelではLinux Bridgeにvethをアタッチする) – NICにIPアドレスを割り当てる(PodのIPアドレス)
所定のホスト名に対して名前解決して、ServiceのIPアドレスを得る – ServiceのIPアドレスに対してリクエストを送信するとロードバランスされる – ロードバランシングのメンバーは⾃動で追加・除外される 37 Node Node Node NIC NIC NIC Pod Pod VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod VNIC ホスト名: backend.sockshop.svc にアクセス ?
EndpointSliceリソース をウォッチ • Serviceリソースの記述内容に合 わせてNode上のiptablesを更新 – Service IPを、ロードバランス対象の PodのいずれかのIPに変換するように ルールを記述する – ロードバランスメンバーの追加・除 外もiptablesの更新で実現 kube-proxyとiptablesによってロードバランシングとサービスディスカバリを実現 39 Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon kp kube-proxy iptables API Server edit 宛先変換ルール Endpoint or EndpointSlice watch
40 Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon kp kube-proxy iptables API Server watch edit 宛先変換ルール 10.106.232.14 -> 192.168.2.2 Endpoint or EndpointSlice
• Serviceリソースを作成すると所 定のDNSレコードが作成される • Pod内のコンテナは、クラスター 内DNSで名前解決するように設定 されている(この設定はkubelet が⾏っている) Kubernetesクラスター内で起動しているDNSサーバーを利⽤ 42 Node NIC Pod Pod Pod VNIC VNIC VNIC CoreDNS VNIC NIC k kubelet container /etc/resolv.conf
kube-proxyがiptablesを更新する ことで、ロードバランシングと サービスディスカバリを実現 45 Node NIC Pod Pod veth0 Linux Bridge veth1 veth0 veth1 Pod veth3 veth3 Flannel daemon kp kube-proxy iptables API Server Service / Endpoint watch edit 宛先変換ルール 10.106.232.14 -> 192.168.2.2
Network / Cluster Network 3. kubeletとCNIプラグイン 4. Service Network Kubernetesの⼤雑把に4つに分けて考えるとよさそう 48 Node Node Node NIC NIC NIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC Pod Pod Pod VNIC VNIC VNIC kubelet + CNI Plugin kubelet + CNI Plugin kubelet + CNI Plugin