自建 Kubernetes 集群
自建时一般选用 Flannel CNI 网络插件,需要给 Pod 和 Service 分配虚拟网段;节点内的 Pod 互访,直接通过 CNI 网桥在二层进行交互;跨节点之间的 Pod 互访,在 Flannel VxLAN 模式下,通过隧道封装技术来进行网络传输;在 host-gw 模式下,可以直接基于路由的方式,无需封包解包,由于直接将目标 Node 作为下一跳地址,充当网关,所以此模式下要求集群节点必须是二层联通的,不能跨网段。
非集群节点是不能访问集群内部网络,即 Pod 容器网络和 Service 服务网络。一般开发环境为了本地调试,要将本地网络与 Kubernetes 的集群网络打通,可以通过架设 VPN 的方式。
Service 的网络实际就是 kube-proxy 维护的 iptables 规则, 这些规则存在于集群所有节点上,所以从任何一个节点访问 都可以定位到其代理的 Endpoints 列表。ClusterIP 的存在也只是为了找出其代理的 endpoint 地址做 DNAT 目标地址转换。
如果是 NodePort 类型的 Service,流入请求的目标 Pod 地址可能不在当前节点,这时就会做 SNAT 替换数据包的源 IP 地址,当然这里也能通过配置来控制 NodePort 仅将流量转发到当前节点的 Pod,具体可以参看 Service 的外部流量控制文档:https://kubernetes.io/zh-cn/docs/tutorials/services/source-ip/
阿里容器服务 ACK
- Flannel
Flannel 是 ACK 的网络插件,使用独立于 VPC 网段的 Pod 的网段分配给 Pod。在 ACK 中,Flannel 插件采用的是阿里云 VPC ,报文经过阿里云 VPC 的路由表直接转发,不需要 Vxlan 等隧道封装技术封装报文,所以比 Flannel 默认的 Vxlan 模式具有更高的通信性能。
差异很清晰,如果选用 ACK Flannel 插件,跨节点通信并没有使用 vxlan 技术,而是通过云上基础产品 VPC 的全局路由来实现。
他通过一个 CCM(Cloud Controller Manager)组件维护 VPC 上 Pod 网段的路由表,来实现 Pod 的跨节点通信。
当集群网络组件为 Flannel 时,CCM 组件负责打通容器与节点间网络,实现容器跨节点通信。CCM 会将节点的 Pod 网段信息写入 VPC 的路由表中,从而实现跨节点的容器通信。该功能无需配置,安装即可使用。
这时 VPC 路由如果收到目的地址是某一个节点 pod 网段的 IP 地址,就会把这个网络包转发到对应的节点上,然后再根据主机的路由表,将其转发到 CNI 网桥上。
笔者公司生产两套集群,一套自建,一套买的阿里云 ACK 托管版本,都是选用的 Flannel CNI 插件。两套集群在同一个 VPC 下,有一天在自建的集群 Pod 中可以直接 ping 通托管集群的 Pod IP,而且在非集群 Node 上(同 VPC)也可以直接 ping 通托管集群的 pod ip,这时去仔细翻了翻 ACK 的文档,才发现 ACK 下的 Flannel 插件没有使用 vxlan 技术,而是基于 VPC 路由转发。
- Terway
Terway是阿里云开源的基于专有网络VPC的容器网络接口CNI(Container Network Interface)插件,基于阿里云的弹性网卡(ENI)构建网络,将原生的弹性网卡(ENI)分配给 Pod 实现 Pod 网络。
支持多种模式:
- VPC:Pod 网段不同于节点的网络的网段,通过 Aliyun VPC 路由表打通不同节点间的容器网络。
- ENI:容器的网卡是 Aliyun 弹性网卡,Pod 的网段和宿主机的网段是一致的。
在 ENI 模式下,ENI 网络就是从阿里云的 VPC 网络中创建和绑定一个弹性网卡到节点上, 然后 Pod 利用这个弹性网卡和别的网络互通。
Pod 与 Node 都在一个 VPC 网络中,共享相同的 CIDR 网段,Pod 会通过弹性网卡资源直接分配 VPC 中的 IP 地址,不需要额外指定虚拟 Pod 网段,而且集群中所有的 Pod 在同一个 VPC 子网中。
详情可参看 Terway 的设计文档:https://github.com/AliyunContainerService/terway/blob/main/docs/design.md
华为云容器引擎 CCE
- 容器隧道网络模型
这种与自建时 Flannel 网络插件 vxlan 模式一样,在节点网络基础上通过隧道封装,构建的独立于节点网络平面的容器网络平面,CCE 集群容器隧道网络使用的封装协议也是 VXLAN。
- VPC 网络
此模式与 ACK 下的 Flannel 插件类似,都是利用 VPC 的路由转发能力来实现跨节点通信。
VPC 网络采用 VPC 路由方式与底层网络深度整合,由于没有隧道封装的消耗,容器网络性能相对于容器隧道网络有一定优势。VPC 网络集群由于 VPC 路由中配置有容器网段与节点 IP 的路由,可以支持集群外直接访问容器实例等特殊场景。
- 云原生网络2.0
云原生网络2.0是自研的新一代容器网络模型,深度整合了虚拟私有云VPC的弹性网卡(Elastic Network Interface,简称ENI)和辅助弹性网卡(Sub Network Interface,简称Sub-ENI)的能力,直接从 VPC 网段内分配容器 IP 地址,支持ELB直通容器,绑定安全组,绑定弹性公网IP,享有高性能。
这里和 ACK 的 Terway 类似,利用弹性网卡,直接从 VPC 划分 IP 地址给容器。
与传统模式的通信区别:
- 节点内 Pod 间通信:直接通过 VPC 的弹性网卡/弹性辅助网卡进行流量转发。
- 跨节点Pod间通信:直接通过 VPC 的弹性网卡/弹性辅助网卡进行流量转发。
腾讯容器服务 TKE
- GlobalRouter 模式
GlobalRouter 网络模式是容器服务 TKE 基于底层私有网络 VPC 的全局路由能力,实现了容器网络和 VPC 互访的路由策略。该网络模式特征包含以下几点:
- 容器路由直接通过 VPC。
- 容器与节点分布在同一网络平面。
- 容器网段分配灵活,容器 IP 段不占用 VPC 的其他网段。
看完描述,和 ACK 的 Flannel 或者 Terway 的 VPC 模式,以及 CCE 的 VPC 网络模式,提供的功能都是一样的,甚至描述读下来都是一模一样的。
- VPC-CNI 模式
与 ACK Terway 的 ENI 模式,CCE 的云原生网络2.0模式一样,基于弹性网卡,直接从 VPC 分配 IP 给容器。
VPC-CNI 模式是容器服务 TKE 基于 CNI 和 VPC 弹性网卡实现的容器网络能力。
其中 VPC-CNI 模式分为共享网卡模式和独占网卡模式,两种网络模式适用于不同的场景。您可以根据业务需要选择不同的网络模式。
- 共享网卡模式:Pod 共享一张弹性网卡,IPAMD 组件为弹性网卡申请多个 IP 给到不同的 Pod。
- 独占网卡模式:每个 Pod 有独立的弹性网卡,性能更高。受机型影响,不同节点可使用的弹性网卡数量有限,单节点 Pod 密度更低。