云计算 / Kubernetes

K8S中的网络实现方案

温馨提示:本文最后更新于2021-03-02 18:40:48,某些文章具有时效性,若有错误或已失效,请在下方留言或提交工单提交工单
浅时光 · 6月14日 · 2020年 · 本文967个字,预计阅读3分钟 47707次已读

Service的地址与Pod的地址是不同网段的,Pod是配置在Pod内部网络名称空间之上的,是可以ping通的;service的地址是虚拟的,只存在于iptables的ipvs规则当中。

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

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

lo通信:本地通信

2、不同宿主机上的Docker容器如何通信?

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

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

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

如何防止地址冲突?

文章来源(Source):浅时光博客
  • 在每台宿主机上建立docker0桥时可以设置不同的网段,比如节点1设置172.17.1.x,节点2设置172.17.2.x,通过不同的网段来防止地址冲突。

4、Service与Pod之间如何通信?

  • Service与Pod属于不同的文章来源(Source):浅时光博客网络,如何直接通信?

Service的地址为宿主机上的iptables规则上的地址,容器只需要把报文的目标地址指向网关【一般为docker0桥的地址】即可;每个宿主机上都得有相关的iptables或ipvs规则。

  • 如果Pod发生改变了,Service如何知道?

靠标签选择器来反映

  • Service如何改变所有节点上的iptables或ipvs规则呢?

每个Node节点上运行一个专门的组件,这个组件是每个Node节点上的守护进程,这个组件为kube-proxy;

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




本文作者:浅时光
原文链接:https://www.dqzboy.com/2689.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可
转载时请以超链接形式标明文章原始出处和作者信息

3 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

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

    这下明白了

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

    感谢,学习到了

  3. happy未知2020-6-17 · 19:38

    学习了