作者:余凯
本系列文章由余凯执笔创造,联合作者:阿里云容器服务 谢石 对本文亦有奉献
前语
近几年,企业基础设施云原生化的趋势越来越激烈,从最开端的 IaaS 化到现在的微服务化,客户的颗粒度精细化和可观测性的需求愈加激烈。容器网络为了满意客户更高功能和更高的密度,也一直在高速的发展和演进中,这必然对客户对云原生网络的可观测性带来了极高的门槛和挑战。为了提高云原生网络的可观测性,一起便于客户和前后线同学增加对业务链路的可读性,ACK 产研和AES联合共建,合作开发 ack net-exporter 和云原生网络数据面可观测性系列,协助客户和前后线同学了解云原生网络架构体系,简化对云原生网络的可观测性的门槛,优化客户运维和售后同学处理疑难问题的体验 ,提高云原生网络的链路的稳定性。
鸟瞰容器网络,整个容器网络能够分为三个部分:Pod 网段,Service 网段和 Node 网段。这三个网络要完成互联互通和拜访操控,那么完成的技能原理是什么?整个链路又是什么,约束又是什么呢?Flannel, Terway有啥区别?不同形式下网络功能如何?这些,需要客户在下树立容器之前,就要依据自己的业务场景进行挑选,而树立结束后,相关的架构又是无法转变,所以客户需要对每种架构特色要有充分了解。比方下图是个简图,Pod 网络既要完成同一个 ECS 的 Pod 间的网络互通和操控,又要完成不同 ECS Pod 间的拜访, Pod 拜访 SVC 的后端可能在同一个 ECS 也可能是其他 ECS,这些在不同形式下,数据链转发形式是不同的,从业务侧体现成果也是不一样的。
本文是[全景分析容器网络数据链路]第二部分,首要介绍 Kubernetes Terway ENI 形式下,数据面链路的转转发链路,一是通过了解不同场景下的数据面转发链路,然后探知客户在不同的场景下拜访成果体现的原因,协助客户进一步优化业务架构;另一方面,通过深入了解转发链路,然后在遇到容器网络抖动时分,客户运维以及阿里云同学能够知道在哪些链路点进行布置观测手动,然后进一步定界问题方向和原因。
系列一:
全景分析阿里云容器网络数据链路(一)——Flannel
系列三:
全景分析阿里云容器网络数据链路(三)——TerwayENIIP
系列四:
全景分析阿里云容器网络数据链路(四)——TerwayIPVLAN+EBPF
系列五:
全景分析阿里云容器网络数据链路(五)—— Terway ENI-Trunking
系列六:
全景分析阿里云容器网络数据链路(六)—— ASM Istio******
Terway ENI 形式架构设计
Terway ENI 形式下,ENI 的网络都是和 VPC 同样的网段,ENI 网络便是从 Aliyun 的 VPC 网络中创建和绑定一个**弹性网卡 [ 1] 到 ECS 节点上, 然后 Pod 使用这个弹性网卡和其他网络互通,这儿需要关注的是弹性网卡的数量是有约束的,详细的依据实例类型有不同的配额 [ 2] **。
[1] 弹性网卡
help.aliyun.com/document_de…
[2] 实例类型有不同的配额
help.aliyun.com/document_de…
Pod 所使用的的 CIDR 网段和节点的 CIDR 是同一个网段
Pod 内部能够看到是有两张网卡的,一个是 eth0,另一个是 veth1,其间 eth0 的 IP 便是 Pod 的 IP,此网卡的 MAC 地址和操控台上的 ENI 的 MAC 地址能够匹配,阐明此网卡便是隶属 ENI 网卡,被直接挂载到了 Pod 的网络命名空间内。
Pod 内有指向 eth0 的默许路由,一起还有指向意图网段为192.168.0.0/16, 下一跳为 veth1 网卡的路由,其间192.168.0.0/16 网段为集群的 service 网段,阐明集群内 Pod 拜访 SVC 的 clusterIP 网段,数据链路会通过 veth1 网卡到宿主机 ECS 的 OS 内进行下一步判别,其他情况是走 eth0 直接进入到 VPC
如上图所示,咱们能够容器的网络命名空间中通过 ip addr 看到一个 veth1@if19 的标志位,其间 ‘19′ 这个将会协助咱们在 ECS 的 OS 内找到找到和容器网络命名空间中的 veth pair 相对一个。在 ECS OS 内咱们通过 ip addr | grep 19: 能够找到 cali38ef34581a9 这个虚拟网卡,这个便是 veth pair 在 ECS OS 侧相对的那一个。
到目前停止,容器拜访 SVC 的 ClusterIP 时,容器和 OS 数据链路现已树立链接了,那么 ECS OS 内关于数据流量是怎么判别去哪个容器呢?通过 OS Linux Routing 咱们能够看到,一切意图是 Pod CIDR 网段的流量都会被转发到 Pod 对应的 calico 虚拟往卡上,到这儿停止,ECS OS 和 Pod 的网络命名空间现已树立好完整的收支链路装备了。
Terway ENI 形式容器网络数据链路分析
针对容器网络特色,咱们能够将 Terway ENI 形式下的网络链路大体分为以 Pod IP 对外供给服务和以 SVC 对外供给服务两个大的 SOP 场景,进一步细分能够拆分到 8 个不同的小的 SOP 场景。
对这 8 个场景的数据链路梳理合并,这些场景能够概括为下面 8 类典型的场景:
TerwayENI 架构下,不同的数据链路拜访情况下,能够总结概括为为 8 类:
•拜访 Pod IP,同节点拜访 pod
•拜访 Pod IP,同节点 pod间 互访
•拜访 Pod IP,异节点 pod 间互访
•集群内拜访 SVC IP (Cluster IP),源端和 SVC 后端 Pod 为同一节点
•集群内拜访 SVC IP( Cluster IP),源端和 SVC 后端 Pod 为不同节点
•集群内拜访 SVC IP (External IP),源端和 SVC 后端 Pod 为同一节点
•集群内拜访 SVC IP(External IP),源端和 SVC 后端 Pod 为不同节点
•集群外拜访 SVC External IP
场景一:拜访 Pod IP,同节点拜访 pod
环境
ap-southeast-1.10.0.0.196节点上存在nginx1-5969d8fc89-9t99h和10.0.0.203
内核路由
nginx1-5969d8fc89-9t99h IP地址 10.0.0.203 ,该容器在宿主机体现的 PID 是1094736,该容器网络命名空间有指向容器 eth0 的默许路由 和 下一跳 为 veth1, 意图网段为 service 的两条路由
该容器 veth1 在 ECS OS 内对应v eth pair 是 cali5068e632525
在 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。
小结:能够拜访到意图端
nginx1-5969d8fc89-9t99h netns veth1 能够抓到数据包
nginx1-5969d8fc89-9t99h cali5068e632525能够抓到数据包
数据链路转发示意图
-
数据链路是 ECS -> Linux routing -> calicxxx -> Pod net ns veth1。数据链路完成 宿主机 ns 切换至 pod ns
-
通过宿主机上的路由切换至 pod 所属的 veth pair
-
该网卡为被分配的 pod 独占, 无法和其他 pod 进行同享
-
数据链路通过两次协议栈
场景二:拜访 Pod IP,同节点 pod 拜访 pod
环境
ap-southeast-1.10.0.0.196 节点上存在两个 pod:centos-59cdc5c9c4-89f8x IP地址 10.0.0.202 和 nginx1-5969d8fc89-9t99h 和 10.0.0.203
内核路由
centos-59cdc5c9c4-89f8xIP地址10.0.0.202 ,该容器在宿主机体现的 PID 是2314075,该容器网络命名空间有指向容器eth0的默许路由 和 下一跳 为 veth1, 意图网段为 service 的两条路由
通过上述相似的办法,能够找到nginx1-5969d8fc89-9t99h IP地址10.0.0.203,该容器在宿主机体现的 PID 是 1094736
小结:能够拜访到意图端
centos-59cdc5c9c4-89f8x netnseth1能够抓到数据包
nginx1-5969d8fc89-9t99h netns eth1能够抓到数据包
数据链路转发示意图
-
数据链路是 pod1 netns eth1 -> VPC -> pod2 netns eth2。数据链路不通过宿主机 host namespace,数据链路会先出 ECS,到 VPC 再回到原来的 ECS。
-
在 pod 内的 net namespace 中,直接射中 默许路有规矩,从 eth0 网卡出 pod 直接到 VPC。这儿的 eth0 其实便是隶属网卡 ENI,直接被挂载在了 pod 的 net ns, 走了 PCI 网卡
-
该网卡为被分配的 pod 独占, 无法和其他 pod 进行同享
-
数据链路通过两次协议栈
场景三:拜访 Pod IP,异节点 pod 拜访 pod
环境
ap-southeast-1.10.0.0.196 节点上存在 pod:centos-59cdc5c9c4-89f8x IP地址 10.0.0.202
ap-southeast-1.10.0.2.80 节点上存在 pod:nginx-6f545cb57c-jmbrq 和 10.0.2.86
内核路由
centos-59cdc5c9c4-89f8xIP地址10.0.0.202 ,该容器在宿主机体现的 PID 是2314075,该容器网络命名空间有指向容器 eth0 的默许路由和下一跳为 veth1, 意图网段为 service 的两条路由
通过上述相似的办法,能够找到nginx-6f545cb57c-jmbrq IP 地址10.0.2.86,该容器在宿主机体现的 PID 是1083623
小结:能够拜访到意图端
centos-59cdc5c9c4-89f8x netnseth0能够抓到数据包
nginx-6f545cb57c-jmbrq netns eth0能够抓到数据包
数据链路转发示意图
-
数据链路是 ECS1 pod1 netns eth0 -> VPC -> ECS2 pod2 netns eth0。数据链路不通过宿主机 host namespace,数据链路会先出 ECS1,到 AVS 再回到 ECS2。
-
在 pod 内的 net namespace 中,直接射中 默许路有规矩,从 eth0 网卡出 pod直接到 VPC。这儿的 eth0 其实便是隶属网卡 ENI,直接被挂载在了 pod 的 net ns, 走了 PCI 设备
-
该网卡为被分配的 pod 独占, 无法和其他 pod 进行同享
-
数据链路通过两次协议栈
场景四:集群内拜访 SVC IP (Cluster IP),源端和 SVC 后端 Pod 为同一节点
环境
ap-southeast-1.10.0.0.196 节点上存在两个 pod:centos-59cdc5c9c4-89f8x IP地址 10.0.0.202 和 nginx1-5969d8fc89-9t99h 和 10.0.0.203
Service是 nginx1 集群内 clusterIP 是192.168.41.244, external IP 是 8.219.175.179
内核路由
centos-59cdc5c9c4-89f8xIP 地址 10.0.0.202 ,该容器在宿主机体现的 PID 是2314075,该容器网络命名空间有指向容器 eth0 的默许路由和下一跳为 veth1, 意图网段为 service的两条路由
该容器 eth0 在 ECS OS 内对应 veth pair 是 cali38ef34581a9
通过上述相似的办法,能够找到nginx1-5969d8fc89-9t99h IP 地址10.0.0.203,该容器在宿主机体现的PID是 1094736,该容器 eth0 在 ECS OS 内对应 veth pair 是 cali5068e632525
在 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。
小结:能够拜访到意图端
centos-59cdc5c9c4-89f8x netnsveth1能够抓到数据包
centos-59cdc5c9c4-89f8x netnscali38ef34581a9能够抓到数据包
nginx1-5969d8fc89-9t99h netns veth1能够抓到数据包
nginx1-5969d8fc89-9t99h netnscali5068e632525能够抓到数据包
数据链路转发示意图
-
数据链路是 ECS1 pod1 netns veth1 -> calixxx1 -> calixxx2 -> ECS2 pod2 netns veth1。
-
在 pod 内的 net namespace中,射中 svc 的路由,从 veth1 网卡出 pod 到 ECS的 namespace,然后通过 linux routing 转到另一个pod 的 calixx 网卡。这儿的 veth1 和 calixxx 是 veth pair
-
源端 pod 所分配的 veth,calicoxxx 网卡能够捕获到 svc IP 和源端 pod IP。SVC IP 会在源端 ECS host 内射中 ipvs/iptables 规矩,做了 nat 转化。
-
意图段 pod 所分配的 veth,calicoxxx 网卡能够捕获 calicoxxx 网卡默许 ip 和意图 pod IP
-
该网卡为被分配的 pod 独占, 无法和其他 pod 进行同享
-
数据链路通过三次协议栈:Pod1, ECS OS 和 Pod2
场景五:集群内拜访 SVC IP (Cluster IP),源端和 SVC 后端 Pod 为不同节点
环境
ap-southeast-1.10.0.0.196 节点上存在 pod:centos-59cdc5c9c4-89f8x IP地址 10.0.0.202
ap-southeast-1.10.0.2.80 节点上存在 pod:nginx-6f545cb57c-jmbrq 和 10.0.2.86
Service是 nginx 集群内 clusterIP 是192.168.204.233, external IP 是 8.219.199.33
内核路由
centos-59cdc5c9c4-89f8xIP地址10.0.0.202 ,该容器在宿主机体现的 PID 是2314075,该容器网络命名空间有指向容器 eth0 的默许路由和下一跳为 veth1, 意图网段为 service的两条路由
该容器 eth0 在 ECS OS 内对应 veth pair 是 cali38ef34581a9
通过上述相似的办法,能够找到 nginx-6f545cb57c-jmbrq IP地址 10.0.2.86,该容器在宿主机体现的 PID 是 1083623, 该 pod 网卡 ENI 是直接被挂载到了 Pod 的网络命名空间内。
小结:能够拜访到意图端
数据链路转发示意图
-
数据链路是ECS1 pod1 netns veth1 -> cali38ef34581a9 -> ECS1 eth0 -> VPC -> ECS2 pod2 netns veth1
-
在客户端 pod 内的 net namespace 中,射中 svc 的路由,从 veth1 网卡出 pod 到 ECS 的 namespace,然后通过 linux routing 转到客户端 ECS eth0 网卡, 然后进入到 vpc 转发到意图 Pod 所属的 eth 网卡
-
源端 pod所分配的 veth,calicoxxx 网卡能够捕获到 svc IP 和源端 pod IP。
-
SVC IP 会在源端 ECS host 内射中 ipvs/iptables 规矩,做了 fnat 转化。在源端ECS 所属的 eth0 只能捕获到 ipvs/iptables 规矩所分配的意图 pod IP 和源 ECS IP
-
意图 pod 内 eth0 所捕获的 IP 是源端 ECS IP 和意图 POD IP。(源 POD IP 和 SVC IP 不会体现)
-
该网卡为被分配的 pod 独占, 无法和其他 pod 进行同享
-
数据链路通过三次协议栈:Pod1, ECS1 OS 和 Pod2
场景六:集群内拜访 SVC IP (External IP),源端和 SVC 后端 Pod 为同一节点
环境
ap-southeast-1.10.0.0.196 节点上存在两个 pod:centos-59cdc5c9c4-89f8x IP地址 10.0.0.202 和 nginx1-5969d8fc89-9t99h 和 10.0.0.203
Service 是 nginx1 集群内clusterIP是192.168.221.163,external IP 是10.0.2.89
内核路由
centos-59cdc5c9c4-89f8xIP地址10.0.0.202 ,该容器在宿主机体现的 PID 是2314075,该容器网络命名空间有指向容器 eth0 的默许路由和下一跳为 veth1, 意图网段为 service 的 ClusterIP 的两条路由
SLB 相关装备
在 SLB 操控台,能够看到虚拟服务器组的后端只要 nginx1-5969d8fc89-9t99h 的ENIeni-t4n6qvabpwi24w0dcy55
综上,能够判别假如拜访的是 SVC 的 External IP, 是走默许路由 eth0,直接出 ECS 进入到 avs ,拜访到 SLB 的实例,再由 SLB 实例转发到后端 eni 上
小结:能够拜访到意图端
数据链路转发示意图
- 数据链路是 ECS1 pod1 netns eth0 -> VPC -> SLB -> VPC -> ECS1 pod2 netns eth0。数据链路不通过宿主机 host namespace,数据链路会先出 ECS1,到 AVS 再回到 ECS1。
- 在 pod 内的 net namespace 中,直接射中默许路有规矩,从 eth0 网卡出 pod 直接到 VPC。这儿的 eth0 其实便是隶属网卡ENI,直接被挂载在了 pod 的 net ns, 走了 PCI 设备
- 该网卡为被分配的 pod 独占, 无法和其他 pod 进行同享
- 与 2.4 场景能够看到非常大的不同,虽然都是 前后端 Pod 都是布置在同一个 ECS 拜访 SVC 的 IP,可是能够看到假如拜访的是 SVC 的 ClusterIP,则数据链路会进入到 ECS OS 层面,会通过三次协议栈;假如拜访的是 External IP,则不会通过 ECS OS,直接出 ECS,通过 SLB 转发到意图 Pod 上,只通过两次协议栈(Pod1 和Pod2)。
场景七:集群内拜访 SVC IP(External IP),源端和 SVC 后端 Pod 为不同节点
环境
ap-southeast-1.10.0.0.196 节点上存在 pod:centos-59cdc5c9c4-89f8x IP地址 10.0.0.202
ap-southeast-1.10.0.2.80 节点上存在 pod:nginx-6f545cb57c-jmbrq 和 10.0.2.86
Service是 nginx 集群内 clusterIP 是 192.168.254.141, external IP 是10.0.2.90
内核路由
centos-59cdc5c9c4-89f8xIP地址10.0.0.202 ,该容器在宿主机体现的 PID 是 2314075,该容器网络命名空间有指向容器 eth0 的默许路由和下一跳为 veth1, 意图网段为 service 的 ClusterIP 的两条路由
SLB 相关装备
在 SLB 操控台,能够看到 lb-t4nih6p8w8b1dc7p587j9 虚拟服务器组的后端只要nginx-6f545cb57c-jmbrq的 ENIeni-t4n5kzo553dfak2sp68j
综上,能够判别假如拜访的是 SVC 的 External IP, 是走默许路由 eth0,直接出 ECS 进入到 avs ,拜访到 SLB 的实例,再由 SLB 实例转发到后端 eni 上
小结:能够拜访到意图端
数据链路转发示意图
-
数据链路是 ECS1 pod1 netns eth0 -> VPC -> SLB -> VPC -> ECS2 pod2 netns eth0。数据链路不通过宿主机 host namespace,数据链路会先出 ECS1,到 SLB 再回到 ECS2。
-
在 pod 内的 net namespace中,直接射中 默许路有规矩,从 eth0 网卡出 pod 直接到 VPC。这儿的 eth0 其实便是隶属网卡 ENI,直接被挂载在了pod 的 net ns, 走了 PCI 设备
-
该网卡为被分配的 pod 独占, 无法和其他 pod 进行同享
-
与 2.5 场景能够看到非常大的不同,虽然都是前后端 Pod 都是布置在不同 ECS 拜访 SVC 的 IP,可是能够看到假如拜访的是 SVC 的 ClusterIP,则数据链路会进入到 ECS OS 层面,通过 ECS 的 eth0 出 ECS,进入到 AVS,会通过三次协议栈;假如拜访的是 External IP,则不会通过 ECS OS,直接通过 Pod 所属的的隶属 ENI 出 ECS,通过 SLB 转发到意图 Pod 上,只通过两次协议栈(Pod1 和Pod2)。
场景八:集群外拜访 SVC External IP
环境
ap-southeast-1.10.0.2.80 节点上存在 pod:nginx-6f545cb57c-jmbrq 和 10.0.2.86
ap-southeast-1.10.0.1.233 节点上存在 pod:nginx-6f545cb57c-25k9z 和 10.0.1.239
Service 是 nginx 集群内 clusterIP 是 192.168.254.141, external IP 是10.0.2.90
SLB 相关装备
在 SLB 操控台,能够看到 lb-t4nih6p8w8b1dc7p587j9 虚拟服务器组的后端服务器组是两个后端nginx pod 的的ENI eni-t4n5kzo553dfak2sp68j 和eni-t4naaozjxiehvmg2lwfo
从集群外部角度看,SLB 的后端虚拟服务器组是 SVC 的后端 Pod 所属的两个 ENI 网卡,内网的 IP 地址便是 Pod 的地址,没有通过后端 Pod 所在的 ECS 的 OS 层面,直接进入到了 OS 的的协议栈
小结:能够拜访到意图端
数据链路转发示意图
- 数据链路:client -> SLB -> Pod ENI + Pod Port -> ECS1 Pod1 eth0
- 数据链路要通过一次内核协议栈,是 Pod1 协议栈
总结
本篇文章首要聚集 ACK 在 Terway ENI 形式下,不同 SOP 场景下的数据链路转发路径。伴随着客户对功能的极致寻求的需求,在 Terway ENI 形式下,总共能够分为 8 个 SOP 场景,并对这八个场景的转发链路,技能完成原理,云产品装备等一一梳理并总结,这对咱们遇到 Terway ENI 架构下的链路抖动、最优化装备,链路原理等供给了初步指引方向。在 Terway ENI 形式下,ENI 是以 PCI 方式直接挂载到 Pod 的命名空间内,这就以为 ENI 归于被分配的 Pod 独享,而 ECS 所能布置的 Pod 数量取决于 ECS 所能挂载ENI网卡数量的约束,而这个约束和 ECS 的实例规格类型有关,比方神龙ecs.ebmg7.32xlarge,128C 512GB也只支持最多 32 个 ENI,这往往会造成资源的浪费和布置密度的下降,为了处理这个资源效率问题,ACK 带来了 Terway ENIIP 的方式,来完成ENI网卡能够被多个Pod所同享,这大大增加了单个 ECS 上的 Pod 数量 quota,提升了布置密度,这也是目前线上集群选用最多的架构。下一系列咱们将进入到 Terway ENIIP 形式的全景解析——《ACK 全景分析阿里云容器网络数据链路(三)—— Terway ENIIP》。
点击此处查看阿里云容器服务