Kubernetes的网络
一、k8s网络设计每个pod都拥有一个独立IP地址,pod内所有容器共享一个网络命名空间集群内所有pod都在一个直接连通的扁平网络中,可通过IP直接访问(1)所有容器之间无需NAT就可以直接互相访问(2)所有Node和所有容器之间无需NAT就可以直接互相访问(3)容器自己看到的IP跟其他容器看到的一样二、k8s网络要求k8s的网络模型假定了所有pod都在一个可以直接连通的扁平网络空间中,这在GCE
一、k8s网络设计
- 每个pod都拥有一个独立IP地址,pod内所有容器共享一个网络命名空间
- 集群内所有pod都在一个直接连通的扁平网络中,可通过IP直接访问
(1)所有容器之间无需NAT就可以直接互相访问
(2)所有Node和所有容器之间无需NAT就可以直接互相访问
(3)容器自己看到的IP跟其他容器看到的一样
二、k8s网络要求
k8s的网络模型假定了所有pod都在一个可以直接连通的扁平网络空间中,这在GCE(Google Compute Engine)里面是现成的网络模型,k8s假定这个网络已经存在。而在私有云里搭建k8s集群,就不能假定这个网络已经存在了。我们需要实现这个网络假设,将不同节点的Docker容器之间的互相访问先打通,然后运行k8s
同一个pod内的多个容器之间:localhost
各种pod之间的通讯:Overlay Network
pod与service之间通讯:各节点的Iptables规则
三、Flannel
Flannel 是CoreOS 团队针对Kubernetes 设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker 容器都具有全集群唯一的虚拟IP地址。而且它还能在这些IP 地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内
ETCD 之 Flannel 提供说明:
存储管理Flannel 可分配的IP 地址段资源
监控ETCD 中每个 Pod 的实际地址,并在内存中建立维护 Pod 节点路由表
四、不同情况下网络通信方式
1.同一个Pod 内部通讯:同一个Pod 共享同一个网络命名空间,共享同一个Linux 协议栈,它们之间的访问可以用localhost地址 + 容器端口就可以访问
2. Pod1 与Pod2 在同一台机器,由Docker0 网桥直接转发请求至Pod2,不需要经过Flannel
3.Pod1 与Pod2 不在同一台主机,Pod的地址是与docker0在同一个网段的,但docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的通信只能通过宿主机的物理网卡进行。将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问
4.Pod 至 Service的网络:目前基于性能考虑,全部为iptables 维护和转发
5.Pod 到外网:Pod 向外网发送请求,查找路由表, 转发数据包到宿主机的网卡,宿主网卡完成路由选择后,iptables执行Masquerade,把源IP 更改为宿主网卡的IP,然后向外网服务器发送请求
6.外网访问Pod:Service
更多推荐
所有评论(0)