Kubernetes从Docker网络模型(Net方式的网络模型)中独立出来形成一套新的网络模型。该网络模型的目标是:每一个Pod都拥有一个扁平化共享网络命名空间的IP,称为PodIP。
通过PodIp,Pod能够跨网络与其他物理机和Pod进行通信。
一个Pod一个IP的模型创建了一个干净、反向兼容的模型。在该模型中,从端口分配、网络、域名解析、服务发现、负载均衡、应用配置和迁移等角度,Pod都能够被看成虚拟机或物理机,这样应用就能够平滑地从非容器环境迁移到同一个Pod内的容器环境。
一、容器间通信
Pod是容器的集合,Pod包含的容器都运行在同一个宿主机上,这些容器将拥有同样的网络空间,容器之间能够相互通信,它们能够在本地访问其他容器的端口。
Pod中的所有容器都是互通的,而Pod对外可以看成一个完整的网络单元。
二、Pod间通信
Kubernetes网络模型是一个扁平化的网络平面,在这个网络平面内,Pod作为一个网络单元同Kubernetes Node的网络处于同一层级。
需要满足以下条件:
1).Pod间通信:Pod1和Pod2(同主机),Pod1和Pod3(跨主机)能够通信。
2).Node与Pod间通信:Node1和Pod1/Pod2(同主机),Pod3(跨主机)能够通信。
可以通过第三方网络插件来创建覆盖网络,比如Flannel和Open vSwitch等。
三、Service到Pod通信
Service在Pod之间起到服务代理的作用,对外表现为一个单一访问接口,将请求转发给Pod,Service的网络转发是Kubernetes实现服务编排的关键一环。
Kubernetes Proxy组件负责实现虚拟IP路由和转发,而在容器覆盖网络之上又实现了Kubernetes层级的虚拟转发网络。
Kubernetes Proxy需要满足以下功能:
1).转发访问Service的虚拟IP的请求到Endpoints。
2).监控Service和Endpoints的变化,实时刷新转发规则。
3).提供负载均衡能力。
Kubernetes Proxy有两种实现机制:Userspace和Iptables,可以通过Kubernetes Proxy的启动参数--proxy-mode指定。
1.Userspace模式
在Userspace模式下,Kubernetes Proxy将会为每一个Service在主机上启用随机端口进行监听,并且创建Iptables规则重定向访问Service虚拟IP的请求到这个端口上,而Kubernetes Proxy将请求转发到Endpoints。
在此模式下,Kubernetes Proxy起到反向代理的作用,请求的转发由Kubernetes Proxy在用户空间下完成。
Kubernetes Proxy需要监控Endpoints的变化,实时刷新转发规则。
2.Iptables模式
在Iptables模式下,Kubernetes Proxy则是完全通过创建Iptables规则,直接重定向访问Service虚拟IP的请求到Endpoints。而当Endpoints发生变化的时候,Kubernetes Proxy会刷新相关的Iptables规则。
在此模式下,Kubernetes Proxy只是负责监控Service和Endpoints,更新Iptables规则,报文的转发依赖于Linux内核,默认的负载均衡策略是随机方式。