一篇讲给自己听的k8s网络模型
不要吹灭你的灵感和你的想象力; 不要成为你的模型的奴隶。——文森特・梵高
k8s网络模型的实现,致力于解决一下场景:
紧密耦合的容器到容器之间的通信
抽象的Pod 到Pod之间的通信
Pod到Service之间的通信
集群外部和内部组件之间的通信
同一个Pod内的容器之间的通信
同一个Pod内的容器共享IP, 端口不同,可以直接通过localhost通信
可以直接使用IPC进行通信(例如消息队列或者管道)
不同Pod内的容器通信
同一个Node上的Pod之间通信
他们网段是一样的,都是从Docker0上分配的,同一个网桥,可以直接通信
对于pod发送的非本地数据,都会通过Docker 0 路由中转到宿主机中
不同Node上的Pod之间通信
不同Node上的两个Pod之间的通信,要达到两个条件:
在整个k8s集群中对Pod的IP 进行统一分配,不能有冲突
找到一种方法,将Pod的IP 和 所在的Node 的IP 进行关联
Pod 和Service 之间的通信
Service是对Pod的抽象,为的是Pod能进行水平扩展, 从而可以通过Service来负载均衡的访问Pod。
每一个Nodes上部署的kube-proxy会把对Service的访问,转发到后端的多个Pod上
Service的ClusterIP与NodePort等概念是kube-proxy通过Iptables的NAT转换实现的,对Cluster IP 和 Port的访问可以在任意的Node上运行,这是因为每个Node上的kube-proxy针对该Service都设置了相同的转发规则。
开源网络组件
Flannel
Flannel缺省采用的是UDP, 在大流量的情况下还要反复测试可用性
总结
了解了k8s网络模型是了解k8s内部通信机制的前提,下一篇将带大家了解k8s的服务发现的方式!