Service的地址与Pod的地址是不同网段的,Pod是配置在Pod内部文章来源(Source):浅时光博客网络名称空间之上的,是可以ping通的;se文章来源(Source):浅时光博客rvice的地址是虚拟的,只存在于iptables的ipvs规则当中。
各节点的网段是一个网络【节点文章来源(Source):https://www.dqzboy.com网络】,文章来源(Source):https://www.dqzboy.comService的网段是一个网络【集群网络】,Pod的网段是一个网络【Pod网络】;接入外部访问时,先到节点网络,然后由节点网络代理至集群网络,再由集群网络代理至Pod网络。
1、一个Pod内有多个容器,同一Pod内的容器间如何通信?
lo通信:本地通信
如两台宿主机上跑了2个容器,且这2个容器的内部IP是一样的,那么这2个容器之间是无法直接通信的;2个容器之间互相通信的原理是:节点1上的容器发送请求给节点2上的容器,节点1上的容器先经过SNET转换至宿主机后再发送至节点2,节点2通过DNET转换后再发送给对应的容器。
Overlay Network:叠加网络;通过隧道方式来转发2层网络的报文,使得不同宿主机上Pod之间可以直接互相通信。在K8S中考虑到Pod的生命周期,所以各Pod之间是不会直接通信的,而是由Service与Pod之间进行通信。
如何防止地址冲突?
- 在每台宿主机上建立docker0桥时可以设置不同的网段,比如节点1设置172.17.1.x,节点2设置172.17.2.x,通过不同的网段来防止地址冲突。
- Service与Pod属于不同的网络,如何直接通信?
Service的地址为宿主机上的iptables规则上的地址,容器只需要把报文的目标地址指向网关【一般为docker0桥的地址】即可;每个宿主机上都得有相关文章来源(Source):https://www.dqzboy.com的iptables或ipvs规则。
靠标签选择器来反映
- 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)协议进行许可,转载时请以超链接形式标明文章原始出处和作者信息
免责声明:本站发布的内容(图片、视频和文字)以及一切破解补丁、注册激活和软件解密分析文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。访问和下载本站内容,说明您已同意上述条款!
这下明白了
感谢,学习到了
学习了