本系列文章由余凯执笔创作,联合作者:阿里云容器服务谢石 对本文亦有贡献

前言

近几年,企业基础设施云原生化的趋势越来越激烈,从最开始的 IaaS 化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加激烈。容器网络为了满足客户更高功用和更高的密度,也一直在高速的开展和演进中,这必然对客户对云原生网络的可观测性带来了极高的门槛和挑战。为了提高云原生网络的可观测性,一起便于客户和前后线同学增加对事务链路的可读性,ACK 产研和 AES 联合共建,合作开发 ack net-exporter 和云原生网络数据面可观测性系列,帮忙客户和前后线同学了解云原生网络架构系统,简化对云原生网络的可观测性的门槛,优化客户运维和售后同学处理疑难问题的体验 ,提高云原生网络的链路的稳定性。

俯瞰容器网络,整个容器网络能够分为三个部分:Pod 网段,Service 网段和Node 网段。这三个网络要完成互联互通和拜访操控,那么完成的技能原理是什么?整个链路又是什么,约束又是什么呢?Flannel, Terway 有啥差异?不同形式下网络功用怎么?这些,需求客户在下建立容器之前,就要依据自己的事务场景进行挑选,而建立结束后,相关的架构又是无法转变,所以客户需求对每种架构特色要有充沛了解。比方下图是个简图,Pod 网络既要完成同一个 ECS 的 Pod 间的网络互通和操控,又要完成不同 ECS Pod 间的拜访, Pod 拜访 SVC 的后端可能在同一个ECS 也可能是其他 ECS,这些在不同形式下,数据链转发形式是不同的,从事务侧体现成果也是不一样的。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

本文是[全景分析容器网络数据链路]第三部分,首要介绍 Kubernetes Terway ENIIP 形式下,数据面链路的转转发链路,一是经过了解不同场景下的数据面转发链路,然后探知客户在不同的场景下拜访成果体现的原因,帮忙客户进一步优化事务架构;另一方面,经过深入了解转发链路,然后在遇到容器网络颤动时分,客户运维以及阿里云同学能够知道在哪些链路点进行布置观测手动,然后进一步定界问题方向和原因。

系列一:

全景分析阿里云容器网络数据链路(一)——Flannel

系列二:

全景分析阿里云容器网络数据链路(二)—— Terway ENI

系列四:

全景分析阿里云容器网络数据链路(四)——TerwayIPVLAN+EBPF

系列五:

全景分析阿里云容器网络数据链路(五)—— Terway ENI-Trunking

系列六:

全景分析阿里云容器网络数据链路(六)—— ASM Istio

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 的版其他内核

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

Pod 所运用的的 CIDR 网段和节点的 CIDR 是同一个网段

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

Pod 内部能够看到是有一张网卡的,一个是 eth0,其间 eth0 的 IP 便是 Pod 的 IP,此网卡的 MAC 地址和操控台上的 ENI 的 MAC 地址不一致,一起 ECS 上有多张 ethx 的网卡,阐明 ENI 隶属网卡并不是直接挂在到了 Pod 的网络命名空间

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

Pod 内有只要指向 eth0 的默许路由,阐明 Pod 拜访任何地址段都是从 eth0 为一致的收支口

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

如上图所示,咱们能够容器的网络命名空间中经过 ip addr 看到一个 eth0@if63 的标志位,其间 ‘63′ 这个将会帮忙咱们在 ECS 的 OS 内找到找到和容器网络命名空间中的veth pair 相对一个。在 ECS OS 内咱们经过 ip addr | grep 63: 能够找到 cali44ae9fbceeb 这个虚拟网卡,这个便是 veth pair 在 ECS OS 侧相对的那一个。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

ECS OS 内关于数据流量是怎么判断去哪个容器呢?经过 OS Linux Routing 咱们能够看到,一切意图是 Pod IP 的流量都会被转发到 Pod 对应的 calico 虚拟往卡上,到这儿为止,ECS OS 和 Pod 的网络命名空间现已建立好完好的收支链路装备了。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

在 veth pair 中完成了多个 Pod 共享一个 ENI 的方法来提升了 ECS 的 Pod 布置密度,那么怎么知道 Pod 是被分配到哪个 ENI 呢?Terway Pod 是经过 daemonset 的方法布置在每个节点上的,经过下面命令能够看到每个节点上的 Terway Pod。经过 terway-cli show factory 命令能够看到节点上的隶属 ENI 数量、MAC 地址以及每个 ENI 上的 IP

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

故 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 场景。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

对这 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

场景一:拜访 Pod IP,同节点拜访 pod

环境

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

cn-hongkong.10.0.1.82 节点上存在 nginx-7d6877d777-zp5jg 和 10.0.1.104

内核路由

nginx-7d6877d777-zp5jg IP地址 10.0.1.104 ,该容器在宿主机体现的 PID 是1094736,该容器网络命名空间有指向容器 eth0 的默许路由

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

该容器 eth0 在 ECS OS 内对应 veth pair 是 calif03b26f9a43

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

在 ECS OS 内,有指向 Pod IP,下一跳为 calixxxx 的路由,经过前文能够知道 calixxx 网卡是和每个 pod 内的 veth1 组成的 pair,所以,pod 内拜访 SVC 的 CIDR 会有指向 veth1 的路由,不会走默许的 eth0 路由。

故:calixx 网卡在这儿的首要作用是用于:

  1. 节点拜访 Pod

  2. 当节点或许 Pod 拜访 SVC 的 CIDR 时,会走 ECS OS 内核协议栈转化,走到 calixxx 和 veth1 拜访 pod。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

小结:能够拜访到意图端

nginx-7d6877d777-zp5jg netns eth0 能够抓到数据包

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

nginx-7d6877d777-zp5jg calif03b26f9a43 能够抓到数据包

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

数据链路转发示意图

  • 会经过 calicao 网卡,每个非 hostnetwork 的 pod 会和 calicao 网卡构成 veth pair,用于和其他 pod 或 node 进行通讯

  • 整个链路不会和恳求不会经过 pod 所分配的 ENI,直接在 OS 的 ns 中射中 Ip rule 被转发

  • 整个恳求链路是 OS -> calixxxxx -> ECS Pod net eth0

  • 整个链路会经过两次内核协议栈:ECS OS 和 Pod

  • 数据链路要经过两次内核协议栈,是 Pod1 协议栈、ECS1 协议栈

场景二:拜访 Pod IP/SVC IP(Cluster or Local),同节点 pod 拜访 pod(pod归于同or不同ENI)

环境

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

cn-hongkong.10.0.1.82 节点上存在 nginx-7d6877d777-zp5jg 和 10.0.1.104

cn-hongkong.10.0.1.82 节点上存在 centos-67756b6dc8-h5wnp 和 10.0.1.91

Service 是 nginx , ClusterIP 是 192.168.2.115 ExternalIP 是 10.0.3.62

内核路由

nginx-7d6877d777-zp5jg IP地址 10.0.1.104 ,该容器在宿主机体现的 PID 是1094736,该容器网络命名空间有指向容器 eth0 的默许路由

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

该容器 eth0 在 ECS OS 内对应 veth pair 是 calif03b26f9a43

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

用上述相似方法能够发现 centos-67756b6dc8-h5wnp 的 veth pair的 cali44ae9fbceeb,Pod 网络空间只要默许路由。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

在 ECS OS 内,有指向 Pod IP,下一跳为 calixxxx 的路由,经过前文能够知道 calixxx 网卡是和每个 pod 内的 veth1 组成的 pair,所以,pod 内拜访 SVC 的 CIDR 会有指向 veth1 的路由,不会走默许的 eth0 路由。

故:calixx 网卡在这儿的首要作用是用于:

  1. 节点拜访 Pod

  2. 当节点或许 Pod 拜访 SVC 的 CIDR 时,会走 ECS OS 内核协议栈转化,走到 calixxx和 eth0 拜访 pod。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

阐明相关的路由转发是在 ECS OS 层面进行的,Pod 的 calixx 网卡起到了一个桥梁和连通的作用。

源端 ECS 上的 IPVS 规矩(假如拜访的是 SVC IP)

假如同节点上拜访的是 SVC 的IP(ClusterIP or ExternalIP),在节点上咱们检查 SVC 的相关 IPVS 转发规矩:

Service 的 ExternalTrafficPolicy 是 Local

SVC nginx CLusterIP是 192.168.2.115, ExternalIP是10.0.3.62, 后端是10.0.1.104 和10.0.3.58

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

cn-hongkong.10.0.1.82

关于 SVC 的 ClusterIP,能够看到 SVC 的后端两个 Pod 都会被加到 IPVS 的转发规矩

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

关于 SVC 的 ExternalIP,能够看到 SVC 的后端,只要该节点的后端 Pod 10.0.1.104才会被加到 IPVS 的转发规矩

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

在 LoadBalancer 的 SVC 形式下,假如 ExternalTrafficPolicy 为 Local,关于 ClusterIP 来说,会把一切 SVC 后端 Pod 都会加到该节点的 IPVS 转发规矩;关于 ExternalIP,只会把该节点上的 SVC 后端 Pod 才会加到 IPVS 规矩中。假如该节点没有 SVC 后端 Pod,则该节点上的 Pod 拜访 SVC 的 ExternalIP 将会是失败。

Service 的 ExternalTrafficPolicy 是 Cluster

SVC nginx1 CLusterIP 是 192.168.2.253, ExternalIP 是10.0.3.63, 后端是10.0.1.104 和10.0.3.58

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

cn-hongkong.10.0.1.82

关于 SVC 的 ClusterIP,能够看到 SVC 的后端两个 Pod 都会被加到 IPVS 的转发规矩

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

关于 SVC 的 ExternalIP,能够看到 SVC 的后端两个 Pod 都会被加到 IPVS 的转发规矩

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

在 LoadBalancer 的 SVC 形式下,假如 ExternalTrafficPolicy 为 Cluster,关于 ClusterIP 或 ExternalIP 来说,会把一切 SVC 后端 Pod 都会加到该节点的 IPVS 转发规矩。

小结:能够拜访到意图端

Conntrack 表信息

Service nginx 的 ExternalTrafficPolicy 是 Local

SVC nginx CLusterIP 是 192.168.2.115, ExternalIP 是10.0.3.62, 后端是 10.0.1.104 和 10.0.3.58

1.假如拜访的是 SVC 的 ClusterIP,经过 conntrack 信息,能够看到 src 是源端 Pod 10.0.1.91 ,dst 是 SVC ClusterIP 192.168.2.115,dport 是 SVC 中的 port。而且希望是10.0.1.104 来回包给 10.0.1.91 。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

2.假如拜访的是 SVC 的 ExternalIP,经过 conntrack 信息,能够看到 src 是源端 Pod 10.0.1.91 ,dst 是 SVC ExternalIP 10.0.3.62 ,dport 是 SVC 中的 port。而且希望是10.0.1.104 来回包给 10.0.1.91 。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

Service nginx1 的 ExternalTrafficPolicy 是 Cluster

SVC nginx1 CLusterIP 是 192.168.2.253, ExternalIP 是10.0.3.63, 后端是 10.0.1.104 和 10.0.3.58

1.假如拜访的是 SVC 的 ClusterIP,经过 conntrack 信息,能够看到 src 是源端 Pod 10.0.1.91 ,dst 是 SVC ClusterIP 192.168.2.253 ,dport 是 SVC 中的 port。而且希望是 10.0.1.104 来回包给 10.0.1.91 。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

2.假如拜访的是 SVC 的 ExternalIP,经过 conntrack 信息,能够看到 src 是源端 Pod 10.0.1.91 ,dst 是 SVC ExternalIP 10.0.3.63 ,dport 是 SVC 中的 port。而且希望是节点 ECS 的 IP 10.0.1.82 来回包给 10.0.1.91 。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

综上能够看到 src 变换了屡次,故在 Cluster 形式下,会存在丢掉真实客户端IP的状况

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

数据链路转发示意图

  • 会经过 calicao 网卡,每个非 hostnetwork 的 pod 会和 calicao 网卡构成 veth pair,用于和其他 pod 或 node 进行通讯

  • 整个链路不会和恳求不会经过 pod 所分配的 ENI,直接在 OS 的 ns 中射中 Ip rule 被转发

  • 整个恳求链路是 ECS1 Pod1 eth0 -> Pod1 calixxxx -> Pod2 calixxxx -> ECS1 Pod2 eth0

  • 拜访 SVC IP, SVC 会在源端 pod eth0 和 calixxx 网卡捕捉到,在意图端 pod 的 eth0 和 calixxx 时捕捉不到

  • 在 LoadBalancer 的 SVC 形式下,假如 ExternalTrafficPolicy 为 Local,关于 ClusterIP 来说,会把一切 SVC 后端 Pod 都会加到该节点的 IPVS 转发规矩;关于 ExternalIP,只会把该节点上的 SVC 后端 Pod 才会加到 IPVS 规矩中。

  • 在 LoadBalancer 的 SVC 形式下,假如 ExternalTrafficPolicy 为 Cluster,关于 ClusterIP 或 ExternalIP 来说,会把一切 SVC 后端 Pod 都会加到该节点的 IPVS 转发规矩,一起无法保留 src 地址。

  • 数据链路要经过三次内核协议栈,是 Pod1 协议栈、ECS1 协议栈、Pod2 协议栈

场景三:拜访 PodIP ,异节点 pod 间互访

环境

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

cn-hongkong.10.0.1.82 节点上存在 centos-67756b6dc8-h5wnp 和 10.0.1.91

cn-hongkong.10.0.3.49 节点上存在 nginx-7d6877d777-lwrfc 和 10.0.3.58

内核路由

centos-67756b6dc8-h5wnp IP地址 10.0.1.104 ,该容器在宿主机体现的 PID 是2211426,该容器网络命名空间有指向容器 eth0 的默许路由

用上述相似方法能够发现 centos-67756b6dc8-h5wnp 的veth pair的 cali44ae9fbceeb,Pod 网络空间只要默许路由。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

在 ECS OS 内,有指向 Pod IP,下一跳为 calixxxx 的路由,经过前文能够知道 calixxx 网卡是和每个 pod 内的 veth1 组成的 pair,所以,pod 内拜访 SVC 的 CIDR 会有指向 veth1 的路由,不会走默许的 eth0 路由。

故:calixx 网卡在这儿的首要作用是用于:

  1. 节点拜访 Pod

  2. 当节点或许 Pod 拜访 SVC 的 CIDR 时,会走 ECS OS 内核协议栈转化,走到 calixxx和 eth0 拜访 pod,关于意图为外部地址,则走 Pod 所属的 ENI 出 ECS 进入到了 VPC。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

小结:能够拜访到意图端

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

数据链路转发示意图

  • 会经过 calicao 网卡,每个非 hostnetwork 的 pod 会和 calicao 网卡构成 veth pair,用于和其他 pod 或 node 进行通讯

  • 整个链路恳求会经过 pod 所分配的 ENI,直接在 OS 的 ns中射中 Ip rule 被转发;

  • 出 ECS 后,依据要拜访的 pod 和该 pod ENI 所属 vswitch,射中 VPC 路由规矩或许直接 VSW 上的二层转发;

  • 整个恳求链路是 ECS1 Pod1 eth0-> ECS1 Pod1 calixxxxx-> ECS1 ethx -> vpc route rule(如有) -> ECS2 ethx -> ECS2 Pod2 calixxxxx -> ECS2 Pod2 eth0

  • 数据链路要经过四次内核协议栈,Pod1 协议栈、ECS1 协议栈、Pod2 协议栈、ECS2 协议栈

场景四:群内非 SVC 后端 pod 地点节点拜访 SVC ClusterIP

环境

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

cn-hongkong.10.0.3.49 节点上存在 nginx-7d6877d777-h4jtf 和 10.0.3.58cn-hongkong.10.0.1.82 节点上存在 centos-67756b6dc8-h5wnp 和 10.0.1.91Service1 是 nginx , ClusterIP 是 192.168.2.115 ExternalIP 是 10.0.3.62

Service2 是 ngin1 , ClusterIP 是 192.168.2.253 ExternalIP 是 10.0.3.63

内核路由

内核路由部分现已在场景二和场景三小结中详细阐明,这儿不再进行过多论述

源端 ECS 上的的 IPVS 规矩​

依据场景二小结中的源端 ECS 上的 IPVS 规矩, 咱们能够得到:无论在哪种 SVC 形式下,关于 ClusterIP 来说,会把一切 SVC 后端 Pod 都会加到该节点的 IPVS 转发规矩

小结:能够拜访到意图端

Conntrack 表信息

Service nginx 的 ExternalTrafficPolicy 是 Local

SVC nginx CLusterIP 是 192.168.2.115, ExternalIP 是 10.0.3.62, 后端是 10.0.1.104 和 10.0.3.58

cn-hongkong.10.0.1.82

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

源端 ECS 上 src 是源端 Pod 10.0.1.91 ,dst 是 SVC ClusterIP 192.168.2.115,dport 是 SVC 中的 port。而且希望是 10.0.3.58 来回包给 10.0.1.91 。

cn-hongkong.10.0.3.49

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

意图端 ECS 上 src 是源端 Pod 10.0.1.91 ,dst 是 pod 的 IP 10.0.3.58,dport 是 pod 的 port。而且希望此 pod 来回包给 10.0.1.91 。

Service nginx1 的 ExternalTrafficPolicy 是 Cluster

SVC nginx1 CLusterIP 是 192.168.2.253, ExternalIP 是 10.0.3.63, 后端是 10.0.1.104 和 10.0.3.58

cn-hongkong.10.0.1.82

源端 ECS 上 src 是源端 Pod 10.0.1.91 ,dst 是 SVC ClusterIP 192.168.2.115,dport 是 SVC 中的 port。而且希望是 10.0.3.58 来回包给 10.0.1.91 。

cn-hongkong.10.0.3.49

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

意图端 ECS 上 src 是源端 Pod 10.0.1.91 ,dst 是 pod 的 IP 10.0.3.58,dport 是 pod的 port。而且希望此 pod 来回包给 10.0.1.91 。

关于 ClusterIP 来说,源端 ECS 会把一切 SVC 后端 Pod 都会加到该节点的 IPVS 转发规矩,意图端 ECS 是捕获不到任何 SVC ClusterIP 信息的,只能捕获到源端 Pod 的 IP,所以回包的时分会回到源端 Pod 的隶属网卡上。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

数据链路转发示意图

  • 会经过 calicao 网卡,每个非 hostnetwork 的 pod 会和 calicao 网卡构成 veth pair,用于和其他 pod 或 node 进行通讯

  • 整个链路恳求会经过 pod 所分配的 ENI,直接在 OS 的 ns 中射中 Ip rule 被转发;

  • 出 ECS 后,依据要拜访的 pod 和该 pod ENI 所属 vswitch,射中 VPC 路由规矩或许直接 VSW 上的二层转发;

  • 整个恳求链路是

去方向

ECS1 Pod1 eth0 -> ECS1 Pod1 calixxxxxx -> ECS1 主网卡 eth0 -> vpc route rule(如有) -> ECS2 隶属网卡ethx -> ECS2 Pod2 calixxxxx -> ECS2 Pod2 eth0

回方向

ECS2 Pod2 eth0 -> ECS2 Pod2 calixxxxx -> ECS2 隶属网卡ethx -> vpc route rule(如有) -> ECS1 隶属网卡 eth1 -> ECS1 Pod1 calixxxxxx -> ECS1 Pod1 eth0

  • 关于 ClusterIP 来说,源端 ECS 会把一切 SVC 后端 Pod 都会加到该节点的 IPVS 转发规矩,意图端 ECS 是捕获不到任何 SVC ClusterIP 信息的,只能捕获到源端 Pod 的 IP,所以回包的时分会回到源端 Pod 的隶属网卡上。

  • 数据链路要经过四次内核协议栈,Pod1 协议栈、ECS1 协议栈、Pod2 协议栈、ECS2 协议栈

场景五:Cluster 形式,集群内非 SVC 后端 pod 地点节点拜访 SVC External IP

环境

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

cn-hongkong.10.0.3.49 节点上存在 nginx-7d6877d777-h4jtf 和 10.0.3.58cn-hongkong.10.0.1.82 节点上存在 centos-67756b6dc8-h5wnp 和 10.0.1.91

Service2 是 ngin1 , ClusterIP 是 192.168.2.253 ExternalIP 是 10.0.3.63

内核路由

内核路由部分现已在场景二和场景三小结中详细阐明,这儿不再进行过多论述

源端 ECS 上的的 IPVS 规矩

依据场景二小结中的源端 ECS 上的 IPVS 规矩, 咱们能够得到:ExternalTrafficPolicy 为 Cluster 形式下,关于 ExternalIP 来说,会把一切 SVC 后端 Pod 都会加到该节点的 IPVS 转发规矩

小结:能够拜访到意图端

Conntrack 表信息

Service nginx1 的 ExternalTrafficPolicy 是 Cluster

SVC nginx1 CLusterIP是 192.168.2.253, ExternalIP 是10.0.3.63, 后端是 10.0.1.104 和 10.0.3.58

cn-hongkong.10.0.1.82

源端 ECS 上 src 是源端 Pod 10.0.1.91 ,dst 是 SVC ExternalIP 10.0.3.63,dport 是 SVC 中的 port。而且希望是 10.0.3.58 来回包给源端 ECS 的地址 10.0.1.82。

cn-hongkong.10.0.3.49

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

意图端 ECS 上 src 是源端 Pod 地点的 ECS 地址 10.0.1.82 ,dst 是 pod 的 IP 10.0.3.58,dport 是 pod 的 port。而且希望此 pod 来回包给源端 ECS 的地址10.0.1.82。

在 ExternalTrafficPolicy 为 Cluster 下,关于 ExternalIP 来说,源端 ECS 会把一切 SVC 后端 Pod 都会加到该节点的 IPVS 转发规矩,意图端 ECS 是捕获不到任何 SVC ExternalIP 信息的,只能捕获到源端 Pod 地点的 ECS 的 IP,所以回包的时分会回到源端 Pod 地点的 ECS 的主网卡上,这一点显着和场景四小结中拜访 CusterIP 有很显着差异 。

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

数据链路转发示意图

  • 会经过 calicao 网卡,每个非 hostnetwork 的 pod 会和 calicao 网卡构成 veth pair,用于和其他 pod 或 node 进行通讯

  • 整个链路恳求会经过 pod 所分配的 ENI,直接在 OS 的 ns 中射中 Ip rule 被转发;

  • 出 ECS 后,依据要拜访的 pod 和该 pod ENI 所属 vswitch,射中 VPC 路由规矩或许直接 VSW 上的二层转发;

  • 整个恳求链路是 ECS1 Pod1 eth0 -> ECS1 Pod1 calixxxx -> ECS1 主网卡ENI eth0 -> vpc route rule(如有) -> ECS2 隶属网卡ethx -> ECS2 Pod2 calixxx -> ECS2 Pod2 eth0

  • 在 ExternalTrafficPolicy 为 Cluster 下,关于 ExternalIP 来说,源端 ECS 会把一切 SVC 后端 Pod 都会加到该节点的 IPVS 转发规矩,意图端 ECS 是捕获不到任何 SVC ExternalIP 信息的,只能捕获到源端 Pod 地点的 ECS 的 IP,所以回包的时分会回到源端 Pod 地点的 ECS 的主网卡 。

  • 数据链路要经过四次内核协议栈,Pod1 协议栈、ECS1 协议栈、Pod2 协议栈、ECS2 协议栈

场景六:Local 形式,集群内非 SVC 后端 pod 地点节点拜访 SVC External IP

环境

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

cn-hongkong.10.0.3.49 节点上存在 nginx-7d6877d777-h4jtf 和 10.0.3.58

cn-hongkong.10.0.1.82 节点上存在 centos-67756b6dc8-h5wnp 和 10.0.1.91

Service1 是 nginx , ClusterIP是 192.168.2.115 ExternalIP是 10.0.3.62

内核路由

内核路由部分现已在场景二和场景三小结中详细阐明,这儿不再进行过多论述

源端 ECS 上的的 IPVS 规矩

Service 的 ExternalTrafficPolicy 是 Local

SVC nginx CLusterIP是 192.168.2.115, ExternalIP 是 10.0.3.62, 后端是 10.0.1.104 和 10.0.3.58

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

cn-hongkong.10.0.1.82

关于 SVC 的 ExternalIP,能够看到 SVC 的后端,无任何转发规矩

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

依据场景二小结中的源端 ECS 上的 IPVS 规矩, 咱们能够得到:ExternalTrafficPolicy 为 Local 形式下,关于 ExternalIP 来说,只会把本节点上的 SVC 的后端 Pod 加到节点上的 IPVS 转发规矩,假如该节点没有 SVC 后端,则不会有任何能够转发的规矩。

小结:不能够拜访到意图端

Conntrack 表信息

Service 的 ExternalTrafficPolicy 是 Local

SVC nginx1 CLusterIP 是 192.168.2.253, ExternalIP 是10.0.3.63, 后端是 10.0.1.104 和 10.0.3.58

cn-hongkong.10.0.1.82 无任何 conntrack 记录表生成

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

数据链路转发示意图

  • 会经过 calicao 网卡,每个非 hostnetwork 的 pod 会和 calicao 网卡构成 veth pair,用于和其他 pod 或 node 进行通讯

  • 整个链路恳求不会经过 pod 所分配的 ENI,直接在 OS 的 ns 中射中 Ip rule 被转发;

  • 整个恳求链路是 ECS1 Pod1 eth0 -> ECS1 Pod1 calixxxx -> ECS host 空间 ipvs/iptables 规矩,无后端转发 ep 停止链路。

  • ExternalTrafficPolicy 为 Local 形式下,关于 ExternalIP 来说,只会把本节点上的 SVC 的后端 Pod 加到节点上的 IPVS 转发规矩,假如该节点没有 SVC 后端,则不会有任何能够转发的规矩。

场景七:集群外拜访 SVC External IP

环境

全景剖析阿里云容器网络数据链路(三):Terway ENIIP
全景剖析阿里云容器网络数据链路(三):Terway ENIIP

cn-hongkong.10.0.3.49 节点上存在 nginx-7d6877d777-h4jtf 和 10.0.3.58cn-hongkong.10.0.1.47 节点上存在 nginx-7d6877d777-kxwdb 和 10.0.1.29

Service1 是 nginx , ClusterIP是 192.168.2.115 ExternalIP是 10.0.3.62

SLB 相关装备

在 SLB 操控台,能够看到 lb-j6cw3daxxukxln8xccive虚拟服务器组的后端服务器组是两个后端 nginx pod的 ENI eni-j6c4qxbpnkg5o7uog5kr 和 eni-j6c6r7m3849fodxdf5l7

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

从集群外部角度看,SLB 的后端虚拟服务器组是 SVC 的后端 Pod 所属的两个 ENI 网卡,内网的 IP 地址便是 Pod 的地址

小结:能够拜访到意图端

全景剖析阿里云容器网络数据链路(三):Terway ENIIP

数据链路转发示意图

  • 数据链路:client -> SLB -> Pod ENI + Pod Port -> ECS1 Pod1 eth0

  • 数据链路要经过二次内核协议栈,Pod1 协议栈和 ECS 协议栈

总结

本篇文章首要聚集 ACK 在 Terway ENIIP 形式下,不同 SOP 场景下的数据链路转发路径。伴随着客户对功用的极致追求的需求,在 Terway ENIIP 形式下,总共能够分为 7 个 SOP 场景,并对这七个场景的转发链路,技能完成原理,云产品装备等一一梳理并总结,这对咱们遇到 Terway ENIIP 架构下的链路颤动、最优化装备,链路原理等供给了开始指引方向。在 Terway ENIIP 形式下,使用 veth pair 来联通宿主机和 pod 的网络空间,pod 的地址是来源于弹性网卡的辅佐 IP 地址,而且节点上需求装备战略路由来保证辅佐 IP 的流量经过它所属的弹性网卡,经过此种方法能够完成 ENI 多 Pod 共享,大大提升了 Pod 的布置密度,但是 veth pair 必然会使用 ECS 的内核协议栈进行转发,此架构下功用必然不如 ENI 形式,ACK 产研为了提升功用,结合内核的 ebpf 和 ipvlan 技能,开发了 Terway ebpf + ipvlan 架构。下一系列咱们将进入到 Terway ENIIP 形式的全景解析——《ACK全景分析阿里云容器网络数据链路(四)—— Terway IPVLAN+EBPF》。

点击此处检查阿里云容器服务