一.简介
我们都知道pod是k8s的最小单元,但pod有IP吗?pod中的所有容器都有IP吗?同一节点node的pod之间如何通信?不同节点node的pod之间如何通信?pod与service之间怎么通信?外部网络访问服务是如何与pod中的容器通信的?
什么是overlay技术?基于的overylay的vxlan又是什么?
实验基础环境
二.k8s如何通信
0.网络基础命令
1.容器之间的通信
每个pod都有一个IP,同一pod中,无论有多少个容器,仅有一个容器有IP,这个容器是pause容器,也叫根容器,pod的IP与根容器的IP相同,其他容器都共享这个IP的,容器之间是通过localhost+port访问的。其实pod就可以当做一台服务器,容器当做服务,这样服务没有IP也很好理解。
2.pod之间的通信
在k8s集群中,pod之间可以互相访问,无论是否在同一个node节点。这样的话,同一个node节点内pod怎么分配IP的,在不同node节点上的pod又是怎么分配IP?无论是否在不在一个node节点上,IP肯定是不能一样的。
同一node节点中,不同的pod都拥有一个全局的IP地址,pod直接通过IP访问,实际上不同pod的veth都通过cni0网桥连接起来,通过cni0实现访问。
在初始化master节点时指定了--pod-network-cidr=10.100.0.0/16,通过以上命令,可以看到
不同node节点中,pod之间的访问,通过flanneld将其流量封装在UDP数据包中,路由到目的地,查看节点上的路由,到达不同node节点通过flannel.1转发。
整个流程为:容器中的应用将数据包通过pod的eth0的发送出去,然后数据包发送到容器对应的虚拟以太网接口veth,veth通过cni0相连接的(同一节点pod通信直接通过cni0通信了),数据包通过cni0发送到flannel.1,flannel的路由信息存在etcd中,flannel的代理服务flanned查找路由后,通过node节点的eth0发送出去,到达目的node节点后,在传输层交给flanned守护进程处理,数据被解封装后,发送给flannel.1,然后在发送给cni0,然后发送给对应的虚拟以太网接口veth,最后达到对应的pod。
vxlan报文封装:
3.pod和service之间的通信
在初始化master节点时指定了--service-cidr=10.200.0.0/16,通过以下命令可以看到ClusterIP,nginx服务名和端口。在任意node节点上都可以访问curl 10.200.204.237:80
ClusterIP是一个虚拟IP,其作用是将访问该服务的流程转发到与其绑定的endport(ip+port)上,pod与服务之间的通信是通过iptables的规则实现的。
4.外部网络访问服务是如何与pod中的容器通信
在初始化master节点时指定了--service-cidr=10.200.0.0/16,通过以下命令可以看到ClusterIP,nginx服务名和随机分配了一个NodePort端口号31356。在任意node节点上都可以访问curl nodeip:31356,或通过浏览器访问任意node节点的31356端口。
ClusterIP是一个虚拟IP,其作用是将访问该服务的流程转发到与其绑定的endport(ip+port)上,pod与服务之间的通信是通过iptables的规则实现的。