概述
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的这三个函数背后到底做了什么事情
cmdAdd

cmdDel

cmdCheck
