Cloud Native Developers JP Cluster Networking …? • Kubernetesのネットワークモデル いきなり読んでもなかなか⾟い…。 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 “ ” ...
Cloud Native Developers JP Kubernetesのネットワークを俯瞰して⾒てみる 1. Node Network 2. Pod 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
Cloud Native Developers JP 1/4: Node Network • Kubernetesを構成するNodeが接続するネットワーク – インフラによって実態は異なる • ベアメタル、クラウドプロバイダが提供する仮想ネットワーク、...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
Cloud Native Developers JP 2/4: Pod Network / Cluster Network • 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
Cloud Native Developers JP 3/4: kubeletとCNIプラグイン • PodをCluster Networkに接続(?)させる役割を持つコンポーネント – 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 接続 !
Cloud Native Developers JP Node Node Node NIC NIC NIC 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 にアクセス
Cloud Native Developers JP Cluster Network • Node Network上にソフトウェア的に構成される論理ネットワーク – 公式ドキュメントの中で “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
Cloud Native Developers JP 【再掲】Cluster Networking …! • Kubernetesのネットワークモデル 少しわかったような気がしてくる…? 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 “ ” ...
Cloud Native Developers JP FlannelがどのようにCluster Networkを実現しているか • 全てのPodの仮想NICをLinux Bridgeに接続 • 各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
Cloud Native Developers JP Nodeをまたがる通信の流れ • 別のNode上のPodのIPアドレスに向けてパケットを送信 20 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 192.168.1.2 192.168.2.2 192.168.2.2
Cloud Native Developers JP Nodeをまたがる通信の流れ • Flannelのデーモンプロセスによって、宛先のPodが起動している Node宛てとなるようにヘッダを追加する(VXLANのカプセル化) 21 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 192.168.1.2 192.168.2.2 192.168.2.2 192.168.254.12
Cloud Native Developers JP Nodeをまたがる通信の流れ • 宛先のノードにパケットが送られる 22 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 192.168.1.2 192.168.2.2 192.168.2.2 192.168.254.12
Cloud Native Developers JP Nodeをまたがる通信の流れ • 宛先Node側のFlannelのデーモンプロセスによって、カプセル化が解 除される 23 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 192.168.1.2 192.168.2.2 192.168.2.2
Cloud Native Developers JP Nodeをまたがる通信の流れ • パケットが⽬的のPodに届く 24 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 192.168.1.2 192.168.2.2 192.168.2.2
Cloud Native Developers JP Cluster Networkのまとめ • Cluster Networkは、Node Network上に構成される論理ネットワーク • 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
Cloud Native Developers JP kubeletとCNIプラグイン • PodをCluster Networkに接続(?)させる役割を持つコンポーネント – kubeletがPodを起動するときにCNIプラグインを実⾏することでこれを⾏って いる 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 接続 !
Cloud Native Developers JP CNIプラグインが⾏う処理をもう少し具体的に • CNIのドキュメントの“Overview”より 30 A CNI 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アドレス)
Cloud Native Developers JP Service Network • Service Networkがやってくれること – 所定のホスト名に対して名前解決して、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 にアクセス ?
Cloud Native Developers JP Serviceによる配送の実態(iptablesプロキシモード)2/2 • Birdgeでiptableの宛先変換ルール が適⽤され、いずれかのPodに配 送される kube-proxyとiptablesによってロードバランシングとサービスディスカバリを実現 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
Cloud Native Developers JP Service Networkのまとめ • Serviceを経由する通信では、ク ラスター内DNSで名前解決する • 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
Cloud Native Developers JP まとめ 1. Node Network 2. Pod 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