Kubernetes / 云计算

K8S中的网络实现方案

浅时光 · 6月14日 · 2020年 · 11425次已读

Service的地址与Pod的地址是不同网段的,Po文章来源(Source):https://www.dqzboy.comd是配置在Pod内部网络名称空间之上的,是可以ping通的;service的地址是虚拟的,只存在于iptables的ipvs规则当中。

文章来源(Source):https://www.dqzboy.com

各节点的网段是一个网络【节点网络】,Serv文章来源(Source):https://www.dqzboy.comice的网段是一个网络【集群网络】,Pod的网段是一个网络【Pod网络】;接入外部访问时,先到节点网络,然后由节点网络代理至集群网络,再由集群网络代理至Pod网络。

1、一个Pod内有多个容器,同一Pod内的容器间如何通信?

lo通信:本地通信

2、不同宿主机上的Docker容器如文章来源(Source):https://www.dqzboy.com何通信?

如两台宿主机上跑了2个容器,且这2个容器的内部IP是一样的,那么这2个容器之间是无法直接通信的;2个容器之间互相通信的原理是:节点1上的容器发送请求给节点2上的容器,节点1上的容器先经过SNET转换至宿主机后再发送至节点2,节点2通过DNET转换后再发送给对应的容器。

3、K8S中各Pod之间如何通信?

Overlay Network:叠加网络;通过隧道方式来转发2层网络的报文,使得不同宿主机上Pod之间可以直接互相通信。在K8S中考虑到Pod的生命文章来源(Source):https://www.dqzboy.com周期,所以各Pod之间是不会直接通信的,而是由Service与Pod之间进行通信。

如何防止地址冲突?

  • 在每台宿主机上建立docker0桥时可以设置不同的网段,比如节点1设置172.17.1.x,节点2设置172.17.2.x,通过不同的网段来防止地址冲突。

4、Service与Pod文章来源(Source):https://www.dqzboy.com之间如何通信?

  • Service与Pod属于不同的网络,如何直接通信?

Service的地址为宿主机上文章来源(Source):https://www.dqzboy.com的iptables规则上的地址,容器只需要把报文的目标地址指向网关【一般为docker0桥的地址】即可;每个宿主机上都得有相关的iptables或ipvs规则。

  • 如果文章来源(Source):https://www.dqzboy.comPod发生改变了,Service如何知道?

靠标签选择器来反映

  • Service如何改变所有节点上的iptables或ip文章来源(Source):https://www.dqzboy.comvs规则呢?

每个Node节点上运行一个专门的组件,这个组件是每个Node节文章来源(Source):https://www.dqzboy.com点上的守护进程,这个组件为kube-proxy;

注:以上网络方案在K8S本身是不提供的,而是依赖于第三方插件来实现;K8S通过CNI插件体系,来接入外部服务的网络解决方案,CNI:容器网络接口。目前K8S中用的最多的网络插件为flannel。

K8S中的网络实现方案-浅时光博客
3 条回应
  1. happy未知2020-6-17 · 19:38

    学习了

  2. God未知2020-8-13 · 23:09

    感谢,学习到了

  3. Andy未知2020-9-7 · 1:34

    这下明白了

本站已安全运行: | 耗时 0.729 秒 | 查询 107 次 | 内存 18.63 MB