K8s中pod的数据通讯

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了K8s中pod的数据通讯相关的知识,希望对你有一定的参考价值。

参考技术A

k8s的网络通讯方式

k8s的网络模型假定是所有Pod都在一个可以直接联通的扁平的网路空间,我们需要自己实现这个网络假设,将不同节点上的Docker容器之间的互相访问先打通,然后运行K8s。

同一个Pod内的多个容器: 同一个pod共享一个网络命名空间,共享同一个linux协议栈

同一个节点各pod之间的通讯: 通过docker0网桥直接发送数据,不通过flannel

pod与service之间的通讯: 各节点的iptables规则。

pod到外网: pod向外网发送请求,查找路由表转发数据包到宿主机的网卡,宿主机网卡完成路由选择后,iptables执行Masquerade,把源IP更改为著网卡的IP,然后向外网发送请求。

flannel的功能是让集群中的不同节点主机创建的Docker容器具有集群唯一的虚拟IP地址,能够在这些Ip地址之间建立

一个覆盖网络(OverlayNetwork),通过这个覆盖网络,将数据包原封不动传递到目标容器内部。

不同节点的pod之间的访问:

首先,在node服务器上会安装flanneld的守护进程,这个进程会监听一个端口,这个端口是用于接收和转发数据包的端口,flanneld进程启动以后,会开启一个网桥叫flannel0,flannel0会抓取docker0转发的数据包,docker0会分配自己的IP到对应的pod上,如果是同一台主机中的不同pod的话,他们之间的通讯走的是docker0网桥。如果是不同节点之间的pod进行通讯,数据包源地址写自己的ip,目标地址写目标地址的ip,然后将数据发送到docker0网桥也就是网关,此时flannel0有自己钩子函数,将数据从docker0抓取,flannel0是flanneld开启端口,数据到了flanneld之后会将数据报文进行一个封装,然后将数据转发到目标节点,然后到了目标节点之后会将数据进行一次解封,到达目标节点的flanneld,然后数据会进行二次解封,flanneld会通过自己的端口将数据发送到docker0网桥,然后在对数据进行转发,从而发送到相应的目标pod。

这里的etcd与flannel的关系:

存储管理flannel可分配的IP地址段资源

监控etcd中每个pod的实际地址,并在内存中建立维护pod节点路由表。

flannel启动以后会向etcd中插入需要分配的网段以及这些网段分别分配在哪个节点上。

以上是关于K8s中pod的数据通讯的主要内容,如果未能解决你的问题,请参考以下文章

k8s 持久化存储-常见的存储卷介绍

部署k8s集群存储-数据卷

Kubernetes之三 k8s中的pod

遇到问题--k8s---数据库同域名切换后pod读取的还是老数据库

遇到问题--k8s---数据库同域名切换后pod读取的还是老数据库

遇到问题--k8s---数据库同域名切换后pod读取的还是老数据库