概述
Terway与Flannel的区别
对比项
|
Terway
|
Flannel
|
---|---|---|
性能 | Pod ip即为VPC中ip,无NAT损耗支持独占ENI模式,几乎无损。 | 配合VPC路由,Pod ip为虚拟ip,存在NAT转换损耗。 |
安全 | 支持使用网络策略Network Policy。 | 不支持使用网络策略Network Policy。 |
ip管理 | 无需按节点分配ip段,随用随分配,ip无浪费。支持为Pod配置固定IP及独立虚拟交换机、安全组。 | 节点维度划分ip段,大规模集群下ip浪费多。 |
SLB | SLB后端直接对接Pod,支持业务无中断升级。 | SLB后端不能直接对接Pod,需要通过NodePort转发。 |
使用体验
ack使用Terway创建集群
注意点
- 创集群时不用选pod cidr
- pod虚拟交换机数量必须>=虚拟交换机(给node用的)
- 不用选择节点IP数量
- 创建出来的节点,pod cidr为空
- 如果创集群选了多个pod虚拟交换机,同一个node上的pod不在同一个子网
- 扩容出来的节点IP是连续的(创集群时提示尽量把节点分配到不同网段)(TODO待验证:怀疑同一个节点池内共用一个vswitch,另外创建节点池可能会选择别的vswitch)
- 部署local dns,发现新创的pod的IP分配时紧跟着所在node IP的
- 再扩容一个节点,node IP就不连续了
系统框架
按照部署和调用方式划分,Terway包含daemon和binary两部分(../plugin/terway):
- daemon: 供
binary
调用,分配和管理网络资源 - binary:与
kubelet
交互及daemon
交互,配置Pod的网络连接
当一个Pod被调度到节点上时,Kubelet
监听到Pod
创建在自己节点上时, 会通过runtime(docker...)
创建sandbox
容器来hold
住各种namespace
,然后通过cni
调用terway binary
来处理网络namespace
, terway binary
调用terway daemon
来获取网络资源,terway daemon
调用Aliyun Openapi
分配网络资源并返回给terway binary
,最后terway binary
为容器的网络namespace
配置网络和联通网络。
通信方式
Terway有多种容器网络的配置通信方式:
- VPC: Pod网段不同于节点的网络的网段,通过Aliyun VPC路由表打通不同节点间的容器网络。
- ENI: 容器的网卡是Aliyun弹性网卡,Pod的网段和宿主机的网段是一致的。
- ENI多IP:一个Aliyun弹性网卡可以配置多个辅助VPC的IP,将这些辅助IP址映射和分配到Pod中,这种Pod的网段和宿主机网段也是一致的。
本文主要介绍ENI多IP模式
实现细节
在cni的binary程序中,通常只用实现cmdAdd, cmdCheck和cmdDel三个函数,然后通过PluginMain函数注入到cni的plugin框架即可,因此这里主要介绍Terway的这三个函数背后到底做了什么事情