理解k8s网络

单机上的两个Pod如何通信

network_in_node.png

  • Pod通过network namespace与主机网络隔离
  • Pod中存在一个虚拟以太网设备对(veth pair),一端(eth0)在Pod的network namespace中,另一端(ethxx)在主机网络中
  • Host的多个veth通过bridge网络相连,所以单机Pod间的通信本质上是多个虚拟设备构成的桥接网络

多机上的两个Pod如何通信

network_cross_node.png

  • 多机场景下,需要将不同主机网络相连

Service 的原理

services.png

  • services本身与网络拓扑没有关系
  • services包括一个虚拟的ip地址
  • kube-proxy(one per node)根据services的定义修改iptables规则,将发往services ip的包,路由到对应的pod地址

Ingress 的原理

img.png

  • LoadBalancer不同,Ingress只需要一个独立Ip地址,可以路由到多个Service
  • Ingress需要一个配套的IngressController,来完成实际的流量分配
  • IngressController需要将自身端口暴露到集群外部以供访问,可能是通过NodePort

什么是Linux namespace

Linux namespace是内核提供的功能,是Linux容器化技术的基石,可以通过unshare命令调用。 container

什么是虚拟以太网设备(veth)

linux虚拟以太网设备是network interface的一种,可以在没有物理设备的情况下,对网络进行逻辑分区。