前言
近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的 IaaS 化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度,也一直在高速的发展和演进中,这必然对客户对云原生网络的可观测性带来了极高的门槛和挑战。为了提高云原生网络的可观测性,同时便于客户和前后线同学增加对业务链路的可读性,ACK 产研和 AES 联合共建,合作开发 ack net-exporter 和云原生网络数据面可观测性系列,帮助客户和前后线同学了解云原生网络架构体系,简化对云原生网络的可观测性的门槛,优化客户运维和售后同学处理疑难问题的体验 ,提高云原生网络的链路的稳定性。
鸟瞰容器网络,整个容器网络可以分为三个部分:Pod 网段,Service 网段和Node 网段。这三个网络要实现互联互通和访问控制,那么实现的技术原理是什么?整个链路又是什么,限制又是什么呢?Flannel, Terway 有啥区别?不同模式下网络性能如何?这些,需要客户在下搭建容器之前,就要依据自己的业务场景进行选择,而搭建完毕后,相关的架构又是无法转变,所以客户需要对每种架构特点要有充分了解。比如下图是个简图,Pod 网络既要实现同一个 ECS 的 Pod 间的网络互通和控制,又要实现不同 ECS Pod 间的访问, Pod 访问 SVC 的后端可能在同一个ECS 也可能是其他 ECS,这些在不同模式下,数据链转发模式是不同的,从业务侧表现结果也是不一样的。
本文是[全景剖析容器网络数据链路]第三部分,主要介绍 Kubernetes Terway ENIIP 模式下,数据面链路的转转发链路,一是通过了解不同场景下的数据面转发链路,从而探知客户在不同的场景下访问结果表现的原因,帮助客户进一步优化业务架构;另一方面,通过深入了解转发链路,从而在遇到容器网络抖动时候,客户运维以及阿里云同学可以知道在哪些链路点进行部署观测手动,从而进一步定界问题方向和原因。
Terway ENIIP模式架构设计
弹性网卡 (ENI) 支持配置多个辅助 IP 的功能,单个弹性网卡 (ENI) 根据实例规格可以分配 6-20 个辅助 IP,ENI 多 IP 模式就是利用了这个辅助 IP 分配给容器,从而大幅提高了 Pod 部署的规模和密度。
在网络联通的方式上,Terway 支持选择 Veth pair 策略路由和ipvlan l两种方案,Terway 主要考虑了这些:
1. 在节点上如何把弹性网卡 (ENI) 的辅助 IP 的流量都走对应的弹性网卡出去,并使用弹性网卡本身的 mac 地址而不被丢包
2.如何兼容容器服务目前广泛的 Centos 7.x 的 3.10 的版本的内核
Pod 所使用的的 CIDR 网段和节点的 CIDR 是同一个网段
Pod 内部可以看到是有一张网卡的,一个是 eth0,其中 eth0 的 IP 就是 Pod 的 IP,此网卡的 MAC 地址和控制台上的 ENI 的 MAC 地址不一致,同时 ECS 上有多张 ethx 的网卡,说明 ENI 附属网卡并不是直接挂在到了 Pod 的网络命名空间
Pod 内有只有指向 eth0 的默认路由,说明 Pod 访问任何地址段都是从 eth0 为统一的出入口
如上图所示,我们可以容器的网络命名空间中通过 ip addr 看到一个 eth0@if63 的标志位,其中 ‘63' 这个将会协助我们在 ECS 的 OS 内找到找到和容器网络命名空间中的veth pair 相对一个。在 ECS OS 内我们通过 ip addr | grep 63: 可以找到 cali44ae9fbceeb 这个虚拟网卡,这个就是 veth pair 在 ECS OS 侧相对的那一个。
ECS OS 内对于数据流量是怎么判断去哪个容器呢?通过 OS Linux Routing 我们可以看到,所有目的是 Pod IP 的流量都会被转发到 Pod 对应的 calico 虚拟往卡上,到这里为止,ECS OS 和 Pod 的网络命名空间已经建立好完整的出入链路配置了。
在 veth pair 中实现了多个 Pod 共享一个 ENI 的方式来提升了 ECS 的 Pod 部署密度,那么如何知道 Pod 是被分配到哪个 ENI 呢?Terway Pod 是通过 daemonset 的方式部署在每个节点上的,通过下面命令可以看到每个节点上的 Terway Pod。通过 terway-cli show factory 命令可以看到节点上的附属 ENI 数量、MAC 地址以及每个 ENI 上的 IP
故 Terway ENIIP 模式总体可以归纳为:
- 在网络联通的方式上,采用选择 Veth pair 策略路由
- 一对 veth pair 来联通宿主机和 pod 的网络空间,pod 的地址是来源于弹性网卡的辅助 IP 地址,并且节点上需要配置策略路由来保证辅助 IP 的流量经过它所属的弹性网卡。
- 同主机上的容器通信直接通过主机上的路由到同一个主机上别的容器对应的 veth 上
- 不同主机的容器通信经过 VPC 的网络进行转发到对应的机器上,再通过机器上的路由转发到容器中
- 容器和其所在的宿主机之间的通信直接通过连接到宿主机 namespace 的veth pair 和路由打通
- 容器到其他主机通过 VPC 的网络转发到对应的机器,其他主机到容器通过 VPC 网络转发到对应的弹性网卡,然后通过路由转发到容器的 Veth 上
- 容器到专线和共享服务也都是通过 VPC 的网络转发
- 容器到公网的访问经过 VSwitch 配置的 SNAT 网关直接将源 IP 转换成 EIP 的地址到外部网络
- 弹性网卡 (ENI) 支持配置多个辅助 IP 的功能,单个弹性网卡 (ENI) 根据实例规格可以分配 6-20 个辅助 IP,ENI 多 IP 模式就是利用了这个辅助 IP 分配给容器,从而大幅提高了 Pod 部署的规模和密度。
Terway ENIIP 模式容器网络数据链路剖析
针对容器网络特点,我们可以将 Terway ENI 模式下的网络链路大体分为以 Pod IP 对外提供服务和以 SVC 对外提供服务两个大的 SOP 场景,进一步细分,可以归纳为 7 个不同的小的 SOP 场景。
对这 8 个场景的数据链路梳理合并,这些场景可以归纳为下面 8 类典型的场景:
TerwayENI 架构下,不同的数据链路访问情况下,可以总结归纳为为 8 类:
- 访问 Pod IP, 同节点访问 Pod
- 访问 Pod IP/SVC IP(Cluster or Local),同节点 pod 间互访(pod 属于同or不同ENI)
- 访问 PodIP ,异节点 pod 间互访
- 集群内非 SVC 后端 pod 所在节点访问 SVC ClusterIP
- Cluster 模式,集群内非 SVC 后端 pod 所在节点访问 SVC External IP
- Local 模式,集群内非 SVC 后端 pod 所在节点访问 SVC External IP
- 集群外访问 SVC External IP