K8S的网络通讯
文章目录
1. 概念
K8S 设定是提供了一个扁平化的网络, 比如在任何Node上面的POD 都可以实现直接通信. 但是在底层却要使用很多转换来实现.
比如使用 Open vSwitch打通不同Node 之间Docker的网络(https://blog.csdn.net/qq_21047625/article/details/89683077)
目前存在的三种通讯模式如下:
一个POD的内部的多个容器- 共享网络
各个POD之间的通讯- overlay NetWork
Pod和Service之间的通讯-Iptables
2. Overlay NetWork 实现
Flannel 是 CoreOS 团队针对K8s设计的一种网络规划服务, 是让所有的集群中所有的POD拥有全局唯一的IP, 并且基于这些IP可以建立一个覆盖网络(Overlay NetWork), 使得这些IP可以互相访问.
2.1 POD的全局IP唯一性
主要是通过不同主机的不同的Docker0地址来实现不同实现的不同的宿主机的容器IP不会重复
2.2 POD的通过IP互相访问
2.2.1 同一台主机的POD通过Docker0 就可以访问
docker0 网桥的相关知识可以参考下面博客
https://blog.csdn.net/qq_21047625/article/details/88727611
2.2.2 不同主机POD之间使用IP访问
上图所示, 10.1.13.2 想要访问 10.1.20.3 , 他们分别在两台主机上, 这个时候需要借助 Flannel 来实现
Flannel 会在宿主机建一个 Flanneld 的守护进程和Flannel0 网桥
Flanneld会监听宿主机的端口, 用来将接收其他主机的数据, 和将当前主机的数据转发出去
Flannel0 则会收集 docker0 网桥转发出来的数据
那么10.1.13.2 想要访问 10.1.20.3 数据流程大约如下
10.1.13.2 将数据包给 docker0, 被 Fannel0 收集到, 给到 Flanneld, 这里Fanneld 会从etcd 查询一下, 10.1.20.3 对应的docker0 在哪一个主机, 这里查询出来是 192.168.99.12
后续Fanneld 会对数据包封装一下, 在外面套一层, 成为来源是 192.168.66.11, 目标是 192.168.66.12 的包.
通过外部网络路由到 192.168.66.12, 被他的Fanneld 截获, 在做拆包的操作, 成为一个来源是 10.1.15.2, 目标是 10.1.20.3 的包 丢给 Fannel0, Fannel0再给 docker0, 这个时候 这台主机的docker0 , 就知道把包转发给 10.1.20.3 了.
这样完成了一个跨主机的通讯