Kubernetes 容器网络模型和典型实现( 四 )

  • 在 backendServer 返回AllocIP调用(IP 地址)结果后 , 插件调用不同网络类型下的NetnsDriver`Setup`接口实现来完成从容器网卡通往主机网卡的链路设置 , 其中:ENIMultiIP和VPCIP均是采用vethDriver的链路模式 , 步骤包括:Create veth pairAdd IP addr for container interfaceAdd routesHost side namespace configAdd host routes and rulesVPCENI稍有不同是为每个 Pod 在 VPC 平面上绑定一个 eni , 其中包括两次NetnsDriver接口调用:vethDriverrawNicDriver(主要实现 VPC 平面网络路由设置 , 包括缺省路由和网关等配置)
  • 综上图示:
    Kubernetes 容器网络模型和典型实现
    本文插图
    为什么需要支持上述三种网络类型?根本上是由阿里云 vpc 网络基础设施所决定 , 同时覆盖阿里云主流应用对 vpc 网络资源的使用场景需求 。 另一方面是对标 Amazon AWS 的容器网络解决方案 , 在基于 VPC 和 ENI 的网络设施上能支持同等功能 。
    ENI 多 IP、VPC ENI 和 VPC IP 的主要区别在于前两者下的 Pod 网段和 VPC 网段是相同的 , 而 VPC IP 的网段和节点的宿主机网段不同 。 这样使得在 ENI 网络环境下的 IP 路由完全在 VPC 的 L2 网络平面上进行 , 而 VPC IP 网络需要在 VPC 路由表中进行配置 Pod 网段的下一跳主机 , 和 Flannel 的路由模式类似 。 可以看出 , ENI 网络能带来更灵活的路由选择和更好的路由性能 。 如下两个截图反映其不同路由特点:
    VPC ENI 网络:
    Kubernetes 容器网络模型和典型实现
    本文插图
    VPC IP 网络:
    Kubernetes 容器网络模型和典型实现
    本文插图
    ENI 多 IP(1 个主 IP/多个辅助 IP)网络下有 2 种路由模式:veth策略路由和ipvlan 。 两者本质区别在于使用不同的路由模式 , 前者使用veth pair的策略路由 , 后者使用ipvlan网络路由 。 策略路由需要在节点上配置策略路由条目来保证辅助 IP 的流量经过它所属的弹性网卡 。 ipvlan实现了一个网卡虚拟出多个子网卡和不同的 IP 地址 , eni 将其辅助 IP 绑定到这些虚拟出来的子网卡上形成一个与 vpc 平面打通的 L3 网络 。 这种模式使 ENI 多 IP 的网络结构比较简单 , 性能相对veth策略路由网络也更好 。 两种网络模式切换通过配置即可完成(缺省是vethpair):
    值得一提的是 Terway 还实现了 ENI 多 IP 地址资源池的管理和分配机制 。 networkService中的eniIPFactory为每个 eni 网卡创建一个 goroutine , 该 eni 网卡上的 eniIP 的分配释放都在这个 goroutine 中完成 。 在创建一个 eniIP 时扫描已经存在的 eni 网卡 , 如该 eni 还存在空闲的 eniIP , 该 goroutine 会通过ipResultChan返回给eniIPFactory一个分配的 IP 。 如果所有的 eni 网卡的 eniIP 都分配完毕 , 会先创建一个新的 eni 网卡和对应的 goroutine , 首次创建 eni 网卡时无需做 IP 分配 , 直接返回 eni 网卡主 IP 即可 。 eniIP 释放是逆向的 , 在 eni 网卡的最后一个 eniIP 释放时 , 整个 eni 网卡资源会释放掉 。
    另外 , 有一个startCheckIdleTickergoroutine 会定期扫描地址池的MaxPoolSize和MinPoolSize水位 , 在低于和高出水位阀值时会对地址池 eniIP 资源进行进行创建和释放 , 使得地址池 IP 资源处于一个可控水位范围中 。 为了保证资源状态一致性 , 有一个startGarbageCollectionLoopgoroutine会定期扫描 IP 地址是否在用或过期状态 , 如检测到会进行资源 GC 操作 。 最后 , Pod 资源状态数据都持久化在本地的一个boltDB文件中/var/lib/cni/terway/pod.db , 即使 Pod 已经在 apiServer 中删除 , GetPod会从本地boltDB中读取副本数据 。 在 Pod 已经删除但副本还存在 DB 的情况下 , GC goroutine检 测到会执行清理 。 截图简述:


    推荐阅读