K8S是没网络功能的要使K8S拥有网络功能要使用第三方的CNI插件实现,第三方插件有很多比如:flannel,calico,canel等等,其中flannel部署简单但没有网络控制的功能,calico部署比较繁琐但功能强大,cannel二者的综合。今天我们就从flannel下手了解K8S的网络插件。
K8S网络通信:
K8S需要用到网络的情况大概有4种:
- 容器间通信同一个Pod中的多个容器间的通信(lo);
- Pod和Pod之间的通信;
- Pod和service间的通信;
- servic与集群外客户端通信。
flannel下载:
https://github.com/coreos/flannel
下载命令
flannel:
flannel拥有三种工作模式:VxLAN,Host-gw,UDP
其中UDP因为比较古老而且性能很差所以现在不使用。
host-gw:
Host-gw的工作原理,其实就是在宿主机上,添加一条到达每个flannel子网的路由,这条路由的下一跳即网关就是相对应的flannel子网所在的“主机”。这些路由规则是flanneld根据容器部署的场景创建和更新的。
Host-gw是flannel中性能最好的模式,但有一定的局限性,宿主机与目标主机之间不能有其他网络。
VxLan:
VxLAN是flannel默认使用的工作模式,他的缺点就是开销会Host-gw但没有局限性。
VxLAN工作原理:
VxLAN
可以从图中看出他会在原数据包外添加额外包头来实现通信。
需要注意的是VxLAN还可以动态使用Host-gw。
flannel configmap字段说明:
- Network:用于为Pod配置网络功能;
例子:10.244.0.0/16 =>
master:10.244.0.0/24
node:10.244.1.0/24 - SubnetLen:把Network切分子网各节点使用时,使用多长的掩码进行切分,默认为24为(切分效果如上个例子);
- SubnetMax:最大可以使用的网络地址;
- SubnetMin:最小可以使用的网络地址;
- Bckend下的Type:设置工作模式,如果需要虽然动态VxLan
"Backend": {
"Type": "vxlan",
"Directroutind": true
}