Terway 网络模式介绍¶
本文介绍常见的 Terway 模式。
VPC¶
此模式下,集群 Pod 的 IP 从一个全局的虚拟子网分配(不属于任何 VPC 网络), 并需要借助 CCM 组件配置 VPC 路由以打通 Pod 跨节点通信。
- Pod 对外访问都需要先通过 eth0 转发到主机之后再转发
- 对于同节点不同 Pod 之间互相访问,不需要借助 VPC 网络,直接借助节点上的与 Pod 的直连路由实现
- 对于 Pod 跨节点的访问,需要转发至 VPC 网络。所以需要 CCM 组件完成跨节点的 VPC 路由的配置
- Pod 的 IP 是虚拟的,不属于 VPC 网段,类似与 calico 等 CNI
部署及使用参考 VPC 模式使用。
ENI¶
此模式下,Terway 将 ECS 实例的弹性网卡直接挂载到 Pod 的网络命名空间内,所以 Pod 拥有最佳性能, 但缺点是 Pod 可部署的数量将受到 ECS 实例的限制。此模式下,Pod 的网段与宿主机的网段是一致的。
- Pod 内有两张网卡,分别是 eth0 和 veth1。Pod 的默认路由在 eth0,所以 Pod 访问外部会从 eth0 转发到 VPC 网络。 而 Pod 内设置有转发 Servcice 的路由从 veth1 转发,所以 Pod 访问 Service 的流量需要先经过 veth1 转发到主机,再经过主机的网络协议栈转发到目标。
- 此模式下 Pod 的可部署数量受到 ECS 实例规格的极大限制: Pod 数量 = ECS 实例的弹性网卡数量
- 此模式下因为 Pod 独占网卡,所以拥有最佳性能
部署及使用参考 ENI 模式使用
ENIIP¶
ENI 模式 Pod 独占 ENI,所以性能足够好,但 Pod 部署密度较低。ENI 支持配置多个辅助 IP 的功能,单个 ENI 根据实例规格可以分配 6-20 个辅助 IP, ENIIP 模式就是利用了这个辅助 IP 分配给容器,从而大幅提高了 Pod 部署的规模和密度。在网络连通的方式上,Terway 支持选择 veth pair 策略路由和 ipvlan 两种方案。
Veth-pair¶
此模式下,Pod 访问外部都会通过 eth0 转发到主机上, 再经过主机转发到 VPC 网络中。Pod 的网卡和 VPC 模式的网卡类似, 都是通过一对 Veth-pair 来连通宿主机和 Pod 的网络空间,但是和 VPC 路由方式区别在于:Pod 的地址是来源于弹性网卡的辅助 IP 地址, 所以节点上需要配置策略路由来保证辅助 IP 的流量经过 Pod 的 IP 所属的弹性网卡转发:
- Pod 的 IP 与节点属于同一网段
- Pod 访问 Service 通过主机转发
- 每一个弹性网卡对应主机的每一个策略路由,这确保了来源于 Pod 流量可以从正确的弹性网卡转发
- 此模式依赖 Calico felix 组件实现网络策略
自建集群目前无部署 ENIIP + Veth 模式,暂不推荐
ipvlan¶
此模式下,基于 Cilium 的 CNI-chaining 模式,ipvlan 作为 Main CNI ,可以实现单个网卡虚拟出来多个子网卡, Terway 将弹性网卡的辅助 IP 绑定到 ipvlan 的不同子网卡上来打通网络。Cilium 作为 meta CNI,为 ipvlan 子接口附加 ebpf 程序, 完成 Service 访问加速以及 NetworkPolicy。使用这种模式使 ENIIP 的网络结构足够简单,性能也相对 veth 策略路由较好。需要内核至少大于 4.2。
- 使用的是 ipvlan L2 模式
- 会为每一个用于 Pod 的弹性网卡创建子接口,解决父子接口不通的问题
- Pod 内只有一张 eth0 网卡,并且 Pod 的网关指向 VPC 网络,这意味着 Pod 访问外部时不会经过主机转发
- 依赖 Cilium 实现 Service 解析以及 NetworkPolicy
- 有内核版本要求,必须大于 4.2
自建集群不支持运行 ENIIP + ipvlan 模式,有通信问题
ENI-Trunking(正在公测)¶
在上述模式中, Pod 可使用的虚拟交换机和安全组都是集群级别,也不支持 Pod 固定 IP。ENI-Trunking 支持通过一组 CRD 来声明 Pod 级别的网络配置,并通过 PodSelector 绑定到 Pod,通过这样可以实现:
- 为一组 Pod 配置独立的虚拟交换机、安全组等
- 支持固定 Pod 的 IP,但仅支持 StatefulSet 类型
限制:
- 目前是公测状态,尚未 GA
- 仅支持部分机型
- 只支持在 ENIIP 模式下启用,但可以与之共存
CRD:
-
PodNetworking:trunk 模式下引入的自定义资源,用来描述一个网络平面的配置信息。一个网络平面可以配置独立的 vSwitch、安全组等信息。集群内可以配置多个网络平面信息。 podNetworking 通过标签选择器来匹配 Pod,被匹配的 Pod 将使用 trunking 模式。
apiVersion: network.alibabacloud.com/v1beta1 kind: PodNetworking metadata: name: test-networking spec: allocationType: type: Elastic/Fixed # Fixed: 固定 IP 策略, 仅对有状态 Pod 生效 releaseStrategy: TTL releaseAfter: "5m0s" selector: podSelector: matchLabels: foo: bar namespaceSelector: matchLabels: foo: bar vSwitchOptions: - vsw-aaa securityGroupIDs: - sg-aaa
当 CR 实例创建,Terway 会进行状态同步,同步完成后设置状态为 Ready,只有当为 Ready,才能被 Pod 使用:
-
PodENI:用于 Terway 记录每个 Pod 使用的网络信息,每个 trunk 模式的 Pod 将有一个同名的资源,自动创建不可修改
apiVersion: network.alibabacloud.com/v1beta1 kind: PodENI ... spec: allocation: eni: id: eni-bp16h6wuzpa9w2vdm5dn <--- pod 使用的eni id mac: 00:16:3e:0d:7b:c2 zone: cn-hangzhou-i ipType: releaseAfter: 0s type: Elastic <--- podIP 分配策略 ipv4: 192.168.51.99 status: instanceID: i-bp1dkga3et5atja91ixt <--- ecs 实例 ID podLastSeen: "2021-07-19T11:23:55Z" status: Bind trunkENIID: eni-bp16h6wuzpa9utho0t2o
数据流:
- 每个 ECS 节点将分配一个弹性网卡用于 Trunking 网卡,类似传统交换机的 Trunk 网口
- Pod 对外所有访问都会通过主机转发。再经过主机的 Trunking 网卡转发到目标弹性网卡。 注: Terway 插件会在 Trunking 网卡的 TC hook 打上或摘除 Vlan tag,数据包根据 vlan tag 匹配到目标弹性网卡。
自建集群不支持运行 ENIIP-Trunking 模式