《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——4. Terway IPVLAN+EBPF 模式架构设计(中)

简介: 《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——4. Terway IPVLAN+EBPF 模式架构设计(中)

更多精彩内容,欢迎观看:

《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——4. Terway IPVLAN+EBPF 模式架构设计(上):https://developer.aliyun.com/article/1221415?groupCode=supportservice


5) 场景四:不同节点间Pod之间互访

环境

image.png cn-hongkong.10.0.3.15节点上存在 nginx-7d6877d777-j7dqz,IP分为10.0.3.38。

cn-hongkong.10.0.3.93节点上存在 centos-6c48766848-dz8hz,IP分为10.0.3.127。

image.png

 通过此节点的terwayPod,我们可以利用 terway-cli show factory的命令看到 nginx-7d6877d777-j7dqz IP 10.0.3.5 属于cn-hongkong.10.0.3.15 上的MAC地址为00:16:3e:04:08:3a的ENI网卡。

image.png

 通过此节点的terwayPod,我们可以利用 terway-cli show factory的命令看到 centos-6c48766848-dz8hz IP  10.0.3.127 属于cn-hongkong.10.0.3.93 上的MAC地址为00:16:3e:02:20:f5的ENI网卡。

内核路由

centos-6c48766848-dz8hz IP地址10.0.3.127,该容器在宿主机表现的PID是1720370,该容器网络命名空间有指向容器eth0的默认路由。有且只有一条,说明pod访问所有地址都需要通过该默认路由。

image.png

image.png nginx-7d6877d777-j7dqz IP地址10.0.3.38。该容器在宿主机表现的PID是329470,该容器网络命名空间有指向容器eth0的默认路由。

image.pngimage.png

ECS OS 内是通过ipvlan隧道的方式和ECS的附属ENI eth1建立的隧道,通过mac地址一样可以看到两个pod 分配的ENI地址centos-6c48766848-dz8hz。image.png

nginx-7d6877d777-j7dqz

image.png

 

小结

可以访问到目的端

 

此处不再对抓包进行展示,从客户端角度,数据流可以在centos-6c48766848-dz8hz的网络命名空间 eth0,以及 此pod所部署的ECS 对应的ENI eth1上可以被捕获到;从服务端角度,数据流可以在nginx-7d6877d777-j7dqz的网络命名空间 eth0,以及 此pod所部署的ECS对应的ENI eth1上可以被捕获到。

 

数据链路转发示意图:

 image.png

 

● 不会经过任何宿主机ECS的网络空间的中间节点;

● 整个链路是需要从客户端pod所属的ENI网卡出ECS再从目的POD所属的ENI网卡进入ECS;

● 整个请求链路是ECS1 Pod1 ->ECS1 ethx -> VPC ->ECS2 ethy ->ECS2 Pod2;

 

6) 场景五:集群内Pod访问的SVC ClusterIP(含Terway版本≥1.2.0,访问ExternalIP),SVC后端Pod和客户端Pod配属同一个ENI

环境

image.png

 

cn-hongkong.10.0.3.15节点上存在 nginx-7d6877d777-j7dqz和centos-6c48766848-znkl8 两个pod,IP分别为10.0.3.38和10.0.3.5。

image.png

 

通过此节点的terwayPod,我们可以利用 terway-cli show factory的命令看到 这两个IP (10.0.3.5和10.0.3.38)都属于同一个MAC地址00:16:3e:04:08:3a,说明这两个IP属于同一个ENI,进而可以推断出nginx-7d6877d777-j7dqz和centos-6c48766848-znkl8 属于同一个ENI 网卡。

 

通过describe svc 可以看到 nginxPod 被加入到了 svc nginx的后端。SVC的CLusterIP是192.168.27.242。如果是集群内访问External IP,对于 Terway 版本≥ 1.20 来说,集群内访问SVC的ClusterIP或External IP,整个链路架构是一致的,此小节不在针对External IP单独说明,统一用ClusterIP作为示例(Terway版本< 1.20 情况下,访问External IP,会在后续小节说明)。

image.png

内核路由

centos-6c48766848-znkl8 IP地址10.0.3.5,该容器在宿主机表现的PID是2747933,该容器网络命名空间有指向容器eth0的默认路由。有且只有一条,说明pod访问所有地址都需要通过该默认路由。

image.png

image.png

 

nginx-7d6877d777-j7dqz IP地址10.0.3.38。该容器在宿主机表现的PID是329470,该容器网络命名空间有指向容器eth0的默认路由。

image.png

image.png

 在ACK中,是利用cilium去调用ebpf的能力,可以通过下面的命令可以看到 nginx-7d6877d777-j7dqz和centos-6c48766848-znkl8 identity ID 分别是634和1592。

image.png

 通过centos-6c48766848-znkl8Pod,可以找到此pod所在的ECS的TerwayPod为terway-eniip-6cfv9,在TerwayPod 中运行下面的cilium bpf lb list | grep -A5 192.168.27.242命令可以看到 ebpf中对于CLusterIP 192.168.27.242:80记录的后端是10.0.3.38:80。这上述的一切都是通过EBPF记录到了源端Pod centos-6c48766848-znkl8Pod的tc中。

 image.png

image.png

 

通过以上,可以理论推断出,如果集群内的pod访问 SVC的CLusterIP or External IP地址(Terway ≥ 1.20),数据流会在pod的网络命名空间内就被转化为相应的SVC的后端Pod IP后,再被从Pod网络命名空间的eth0 发出pod,进入到pod所在的ECS,然后通过IPVLAN隧道,转发到同ECS或通过相应的ENI出ECS。也就是说,我们如果抓包,不管在pod内抓包还是在ECS抓包,都无法捕获到SVC的IP,只能捕获到Pod IP。

 

EBPF技术让集群内访问避开了ECS OS内部的内核协议栈和减少了部分pod内核协议栈,大大提高了网络性能和Pod密度,带来了不弱于单独ENI的网络性能,但是此方式会对我们观测带来巨大的改变和影响。

 

试想一下,如果您的集群内存在互相调用情况,这个调用的IP 是SVC的IP,加入此SVC后端所引用的Pod有几十上百个。源端pod调用时候出现问题,一般情况下报错是‘connect to  failed’ 等类似信息,传统的抓包手段是在源端Pod内,目的Pod,ECS上等进行抓包,筛选 SVC IP 来串起来不同包之间的同一个数据流,可是ebpf情况下由于上述技术实现,造成无法捕获SVC IP,是不是对偶发抖动情况下的观测带来了巨大挑战呢?

 

小结

可以访问到目的端

 

从客户端Pod centos-6c48766848-znkl8 访问SVC,我们可以看到访问成功。

image.png

客户端的centos-6c48766848-znkl8 网络命名空间内eth0 抓包,抓包地址是目的SVC的IP和SVC的后端POD IP。可以看到只能抓到SVC 后端Pod IP,无法捕获到SVC IP。

image.png

 目的端SVC的后端POD nginx-7d6877d777-zp5jg 网络命名空间 eth0 抓包,抓包地址是目的SVC的IP和Pod IP。可以看到只能抓到客户端Pod IP。

image.png

 

cilium 提供了一个monitor的功能,我们使用cilium monitor --related-to ,可以看到,源端POD IP 访问SVCIP 192.168.27.242,之后被解析到SVC的后端POD IP 10.0.3.38。说明SVC IP直接在tc层做了转发,这也解释了为什么抓包无法抓到SVC IP,因为抓包是在netdev上抓的,此时已经过了协议栈和tc。

image.png

 

后续小节如果涉及SVC IP的访问,如有类似,不再做详细的抓包展示。

数据链路转发示意图:

image.png

 

● 不会经过任何宿主机ECS的网络空间的中间节点;

● 整个链路不会和请求不会经过pod所分配的ENI,直接在OS的ns中命中Ip rule 被转发到对端pod;

● 整个请求链路是ECS1 Pod1 ->ECS1 Pod2 (发生在ECS内部),和IPVS相比,避免了calico网卡设备的两次转发,性能是更好的;

● ECS1 Pod1的eth0网卡无法捕捉到 SVC IP,SVC IP 在Pod网络命名空间内已经通过ebpf转换成了SVC后端Pod的IP;

 

1) 场景六:集群内Pod访问的SVC ClusterIP(含Terway版本≥1.2.0,访问ExternalIP),SVC后端Pod和客户端Pod配属不同ENI(同ECS)

环境

image.png

 cn-hongkong.10.0.3.15节点上存在 nginx-7d6877d777-j7dqz和busybox-d55494495-8t677 两个pod,IP分别为10.0.3.38和10.0.3.22。

image.png 

通过此节点的terwayPod,我们可以利用 terway-cli show factory的命令看到 这两个IP (10.0.3.22和10.0.3.38)都属于同一个MAC地址00:16:3e:01:b7:bd和00:16:3e:04:08:3a,说明这两个IP属于不同ENI,进而可以推断出nginx-7d6877d777-j7dqz和busybox-d55494495-8t677 属于不同ENI 网卡。通过describe svc 可以看到 nginxPod 被加入到了 svc nginx的后端。

 

SVC的CLusterIP是192.168.27.242。如果是集群内访问External IP,对于 Terway 版本≥ 1.20 来说,集群内访问SVC的ClusterIP或External IP,整个链路架构是一致的,此小节不在针对External IP单独说明,统一用ClusterIP作为示例(Terway版本< 1.20 情况下,访问External IP,会在后续小节说明)。

image.png 

内核路由

busybox-d55494495-8t677 IP地址10.0.3.22,该容器在宿主机表现的PID是2956974,该容器网络命名空间有指向容器eth0的默认路由。有且只有一条,说明pod访问所有地址都需要通过该默认路由。

image.png

image.png

image.png

image.png

image.png

nginx-7d6877d777-j7dqz IP地址10.0.3.38。该容器在宿主机表现的PID是329470,该容器网络命名空间有指向容器eth0的默认路由。

image.png

 在ACK中,是利用cilium去调用ebpf的能力,可以通过下面的命令可以看到 nginx-7d6877d777-j7dqz和busybox-d55494495-8t677 identity ID 分别是634和3681。

image.png

 通过busybox-d55494495-8t677Pod,可以找到此pod所在的ECS的TerwayPod为terway-eniip-6cfv9,在TerwayPod 中运行下面的cilium bpf lb list | grep -A5 192.168.27.242 命令可以看到 ebpf中对于CLusterIP 192.168.27.242:80 记录的后端是10.0.3.38:80。这上述的一切都是通过EBPF 记录到了源端Pod centos-6c48766848-znkl8Pod的tc中。

image.png

image.png 

这里不再过多对于svc ClusterIP的ebpf转发进行描述,详细信息可以参考 2.5 小节。中的描述,从上述描述情况,可以得知被访问的SVC的IP 在 客户端 busybox的网络命名空间中已经被ebpf转为svc的后端pod的IP,在任何dev上都无法捕获到客户端访问的SVC的IP。故此场景和2.3 小节的网络架构非常类似,只是在客户端内会由cilium ebpf转发的动作。

 

小结

数据链路转发示意图:

image.png

 

● 不会经过任何宿主机ECS的网络空间的中间节点;

● 整个链路是需要从客户端pod所属的ENI网卡出ECS再从目的POD所属的ENI网卡进入ECS;

● 整个请求链路是ECS1 Pod1 ->ECS1 eth1 -> VPC ->ECS1 eth2 ->ECS1 Pod2;

● 在客户端/服务端Pod内或者ECS的ENI网卡都无法捕捉到 SVC IP,SVC IP 在 客户端Pod网络命名空间内已经通过ebpf转换成了SVC后端Pod的IP;

 

https://help.aliyun.com/document_detail/197320.htm

https://help.aliyun.com/document_detail/113090.html#p-lim-520-w07

更多精彩内容,欢迎观看:

《云原生网络数据面可观测性最佳实践》——二、全景剖析阿里云容器网络数据链路——4. Terway IPVLAN+EBPF 模式架构设计(下):https://developer.aliyun.com/article/1221412?groupCode=supportservice

相关实践学习
通义万相文本绘图与人像美化
本解决方案展示了如何利用自研的通义万相AIGC技术在Web服务中实现先进的图像生成。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
存储 数据挖掘 BI
2-5 倍性能提升,30% 成本降低,阿里云 SelectDB 存算分离架构助力波司登集团实现降本增效
波司登集团升级大数据架构,采用阿里云数据库 SelectDB 版,实现资源隔离与弹性扩缩容,查询性能提升 2-5 倍,总体成本降低 30% 以上,效率提升 30%,助力销售旺季高效运营。
775 9
|
存储 弹性计算 运维
AI时代下阿里云基础设施的稳定性架构揭秘
计算、存储、网络作为云计算基础 IaaS 服务,一直是阿里云的核心产品,承载着百万客户的 IT 基础设施。曾经我们认为应用高可用、服务分布式可以满足客户对 IaaS 所有的稳定性诉求。
1401 2
AI时代下阿里云基础设施的稳定性架构揭秘
|
12月前
|
运维 监控 数据可视化
Python 网络请求架构——统一 SOCKS5 接入与配置管理
通过统一接入端点与标准化认证,集中管理配置、连接策略及监控,实现跨技术栈的一致性网络出口,提升系统稳定性、可维护性与可观测性。
|
人工智能 缓存 安全
阿里云发布《AI 原生应用架构白皮书》
阿里云联合阿里巴巴爱橙科技,共同发布《AI 原生应用架构白皮书》,围绕 AI 原生应用的 DevOps 全生命周期,从架构设计、技术选型、工程实践到运维优化,对概念和重难点进行系统的拆解,并尝试提供一些解题思路。白皮书覆盖 AI 原生应用的 11 大关键要素,获得 15 位业界专家联名推荐,来自 40 多位一线工程师实践心的,全书合计超 20w 字,分为 11 章。
4963 86
|
人工智能 Cloud Native 安全
解读阿里云刚发布的《AI 原生应用架构白皮书》
阿里云在云栖大会重磅发布了《AI 原生应用架构白皮书》,该白皮书覆盖 AI 原生应用的 11 大关键要素,获得业界 15 位专家联名推荐,来自 40 多位一线工程师实践心得,全书合计超 20w 字,分为 11 章,全面、系统地解构 AI 原生应用架构,包含了 AI 原生应用的 11 大关键要素,模型、框架、提示词、RAG、记忆、工具、网关、运行时、可观测、评估和安全。本文整理自阿里云智能技术专家李艳林在云栖大会现场的解读。
3347 110
|
存储 弹性计算 运维
AI 时代下阿里云基础设施的稳定性架构揭秘
十五年磨一剑,稳定性为何是今天的“命门”?
1494 151
|
12月前
|
人工智能 缓存 安全
阿里云发布《AI 原生应用架构白皮书》!
阿里云联合爱橙科技发布《AI原生应用架构白皮书》,系统解析AI应用在架构设计、开发运维中的关键挑战与解决方案,涵盖大模型、Agent、RAG、安全等11大核心要素,助力企业构建稳定、高效、可控的AI应用体系。
阿里云发布《AI 原生应用架构白皮书》!
|
存储 人工智能 关系型数据库
阿里云AnalyticDB for PostgreSQL 入选VLDB 2025:统一架构破局HTAP,Beam+Laser引擎赋能Data+AI融合新范式
在数据驱动与人工智能深度融合的时代,企业对数据仓库的需求早已超越“查得快”这一基础能力。面对传统数仓挑战,阿里云瑶池数据库AnalyticDB for PostgreSQL(简称ADB-PG)创新性地构建了统一架构下的Shared-Nothing与Shared-Storage双模融合体系,并自主研发Beam混合存储引擎与Laser向量化执行引擎,全面解决HTAP场景下性能、弹性、成本与实时性的矛盾。 近日,相关研究成果发表于在英国伦敦召开的数据库领域顶级会议 VLDB 2025,标志着中国自研云数仓技术再次登上国际舞台。
1368 1