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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
简介: 本系列联合作者 容器服务 @谢石 近几年,企业基础设施云原生化的趋势越来越强烈,从最开始的IaaS化到现在的微服务化,客户的颗粒度精细化和可观测性的需求更加强烈。容器网络为了满足客户更高性能和更高的密度,也一直在高速的发展和演进中,这必然对客户对云原生网络的可观测性带来了极高的门槛和挑战。为了提高云原生网络的可观测性,同时便于客户和前后线同学增加对业务链路的可读性

本系列联合作者  容器服务 @谢石

前言

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

鸟瞰容器网络,整个容器网络可以分为三个部分:Pod网段,Service网段和Node网段。 这三个网络要实现互联互通和访问控制,那么实现的技术原理是什么?整个链路又是什么,限制又是什么呢?Flannel, Terway有啥区别?不同模式下网络性能如何?这些,需要客户在下搭建容器之前,就要依据自己的业务场景进行选择,而搭建完毕后,相关的架构又是无法转变,所以客户需要对每种架构特点要有充分了解。比如下图是个简图,Pod网络既要实现同一个ECS的Pod间的网络互通和控制,又要实现不同ECS Pod间的访问, Pod访问SVC 的后端可能在同一个ECS 也可能是其他ECS,这些在不同模式下,数据链转发模式是不同的,从业务侧表现结果也是不一样的。

本文是[全景剖析容器网络数据链路]第五部分部分,主要介绍Kubernetes Terway ENI-Trunking模式下,数据面链路的转转发链路,一是通过了解不同场景下的数据面转发链路,从而探知客户在不同的场景下访问结果表现的原因,帮助客户进一步优化业务架构;另一方面,通过深入了解转发链路,从而在遇到容器网络抖动时候,客户运维以及阿里云同学可以知道在哪些链路点进行部署观测手动,从而进一步定界问题方向和原因。

系列一:全景剖析阿里云容器网络数据链路(一)—— Flannel

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

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

系列四:全景剖析阿里云容器网络数据链路(四)—— Terway IPVLAN+EBPF

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

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

1. Terway ENI-Trunking 模式架构设计

弹性网卡中继Trunk ENI是一种可以绑定到专有网络VPC类型ECS实例上的虚拟网卡。相比弹性网卡ENI,Trunk ENI的实例资源密度明显提升。启用Terway Trunk ENI功能后,指定的Pod将使用Trunk ENI资源。为Pod开启自定义配置是可选功能,默认情况下创建的Pod,未开启Terway Trunk ENI功能,使用的是共享ENI上的IP地址。只有当您主动声明为指定Pod开启自定义配置后,相应的Pod才能使用Pod自定义配置能力,Terway才可以同时使用共享ENI以及Trunk ENI为Pod分配IP。两种模式共享节点最大Pod数量配额,总部署密度和开启前一致。

金融、电信,政府等行业对数据信息安全有着非常严格的数据安全要求,通常,重要的核心数据会放在自建的机房内,并且对访问此数据的客户端有严格的白名单控制,通常会限制具体的IP访问源。业务架构上云时,往往是通过专线,VPN等打通自建机房和云上资源打通,由于传统容器中PodIP 是不固定的,NetworkPolicy 只能在集群内生效,这对客户的白名单设置有了非常大的挑战。ENI 在 Trunk 模式下,可以配置独立的安全组、vSwitch能力,带来更为细化的网络配置能力,提供极具竞争力的容器网络解决方案。

在trunking的命名空间内可以看到相关的pod信息和节点信息,其中pod应用的IP 的网络我们稍后会详细说明

Pod内有只有指向eth0的默认路由,说明Pod访问任何地址段都是从eth0为统一的出入口

那么Pod是如何ECS OS进行通信呢?在OS层面,我们一看到calicxxxx的网卡,可以看到是附属于eth1的,对于节点和Pod的通信连接,这个类似于《全景剖析阿里云容器网络数据链路(三)—— Terway ENIIP》 ,此处不再进行过多说明。通过OS Linux Routing 我们可以看到,所有目的是 Pod IP 的流量都会被转发到Pod对应的calico虚拟往卡上,到这里为止,ECS OS 和Pod的网络命名空间已经建立好完整的出入链路配置了。

让我们把目光聚焦ENI Trunking本身。ENI Truning 是如何实现Pod的交换机和安全组的配置呢?Terway增加一种名为PodNetworking的自定义资源来描述网络配置。您可以创建多个PodNetworking,来规划不同网络平面。创建PodNetworking资源后,Terway将同步网络配置信息,只有status成为Ready后,该网络资源才能对Pod生效。如下图所示,类型为Elastic,只要namespce的标签的符合tryunking:zoneb, 就给pod使用指定的安全组和交换机。

创建Pod时,Pod将通过标签去匹配PodNetworking。如果Pod没有匹配到任何PodNetworking,则Pod将使用默认的共享ENI上的IP。如果Pod有匹配到PodNetworking,则将使用PodNetworking中定义的配置分配ENI。关于Pod标签的相关内容,请参见标签

Terway会为这类Pod创建相应的名为PodENI的自定义资源,用于跟踪Pod所使用的资源,该资源由Terway管理,您不可修改该资源。如下trunking 命名空间下的centos-59cdc5c9c4-l5vf9 pod匹配了相应的podnetworking设置,被分配了相应的memeber ENI、对应的Trunking ENI,安全组,交换机和被绑定的ECS实例,这样就实现了Pod维度的交换机,安全组的配置和管理。

通过ECS的控制台,我们也可以清楚的看到memenber ENI和Trunking ENI 之间的关系,相应的安全组交换机等等信息。

通过上面的配置,我们了解如何去给每个Pod单独配置交换机,安全组等信息,让每个pod在通过Trunking ENI出ECS后,可以自动走到对应的配置Member ENI 上,让这些配置生效。那么所有的配置其实落到宿主机上都是通过相关的策略实现的,Trunking ENi网卡是如何知道把对应Pod的流量转发到正确的对应的Member ENI上的呢? 这其实通过的vlan来实现的。 在tc层面可以看到VLAN ID。所以在egress或者ingress的阶段会打上或者去除VLAN ID。

故Terway ENI-Trunking 模式总体可以归纳为:

  • 弹性网卡中继Trunk ENI是一种可以绑定到专有网络VPC类型ECS实例上的虚拟网卡。相比弹性网卡ENI,Trunk ENI的实例资源密度明显提升
  • Terway Trunk ENI支持为每个Pod配置固定IP、独立的虚拟交换机、安全组,能提供精细化流量管理、流量隔离、网络策略配置和IP管理能力。
  • 使用Terway插件,您需要选择较高规格和较新类型的ECS神龙机型,即5代或者6代的8核以上机型,且机型要支持Trunk ENI。更多信息,请参见实例规格族
  • 单节点所支持的最大Pod数取决于该节点的弹性网卡(ENI)数。共享ENI支持的最大Pod数=(ECS支持的ENI数-1)×单个ENI支持的私有IP数。
  • Pod安全组规则不会应用到同节点Pod间流量及同节点上节点与Pod间流量。如果您需要限制,可以通过NetworkPolicy进行配置。
  • Pod和对应MemeberENI流量对应是通过VLAN ID 来实现的。

2. Terway ENI-Trunking 模式容器网络数据链路剖析

可以看到由于可以实现Pod维度的安全组,交换机设置,那么宏观上不同链路访问必然更加趋于复杂,我们可以将Terway ENI-TRunking模式下的网络链路大体分为以Pod IP对外提供服务和以SVC对外提供服务两个大的SOP场景,进一步细分,可以归纳为10个不同的小的SOP场景。

对这11个场景的数据链路梳理合并,这些场景可以归纳为下面10类典型的场景:

  • 通节点访问Pod(相同or不同安全组)
  • 同节点同安全组Trunk Pod互访(含访问SVC IP,源端和svc后端部署在同一节点)
  • 同节点不同安全组Trunk Pod互访(含访问SVC IP,源端和svc后端部署在同一节点)
  • 不同节点同安全组Trunk Pod互访
  • 不同节点不同安全组Trunk Pod互访
  • 集群内源端访问SVC IP(源端和SVC后端不同节点,相同安全组,含Local模式访问external IP)
  • 集群内源端访问SVC IP(源端和SVC后端不同节点,不同安全组,含Local模式访问external IP)
  • Cluster模式下,集群内源端访问SVC ExternalIP(源端和SVC后端不同节点,不同安全组)
  • Cluster模式下,集群内源端访问SVC ExternalIP(源端和SVC后端不同节点,相同安全组)
  • 集群外访问SVC IP

2.1 场景一:通节点访问Pod(相同or不同安全组)

环境

cn-hongkong.10.0.4.22 节点上存在 nginx-6f545cb57c-kt7r8和 10.0.4.30

内核路由

nginx-6f545cb57c-kt7r8 IP地址 10.0.4.30 ,该容器在宿主机表现的PID是1734171,该容器网络命名空间有指向容器eth0的默认路由

该容器eth0在ECS OS 内是通过ipvlan隧道的方式和ECS的附属ENI eth1建立的隧道,同时附属ENI eth1还有个虚拟的calxxx 网卡

在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。

trunking 命名空间下的nginx-6f545cb57c-kt7r8 pod匹配了相应的podnetworking设置,被分配了相应的memeber ENI、对应的Trunking ENI,安全组,交换机和被绑定的ECS实例,这样就实现了Pod维度的交换机,安全组的配置和管理。

在tc层面可以看到VLAN ID 1027,所以数据流量在egress或者ingress的阶段会打上或者去除VLAN ID。

ENI的网卡所属的安全组可以看到只允许了指定的IP可以访问nginx pod的80 端口。

置于数据面流量在OS层面的流量转发逻辑,这个类似于《全景剖析阿里云容器网络数据链路(三)—— Terway ENIIP》 ,不在这里做过多的叙述。

小结

可以访问到目的端

数据链路转发示意图:

  • 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信
  • 整个链路不会和请求不会经过pod所分配的ENI,直接在OS的ns中命中Ip rule 被转发1、
  • 整个请求链路是 ECS1  OS -> calixxxx -> ECS1 Pod1
  • 因为是通过 os内核routing转发,不经过 member eni,所以安全组不生效,此链路与pod所属的member eni的安全组无关

2.2 场景二:同节点同安全组Trunk Pod互访(含访问SVC IP,源端和svc后端部署在同一节点)

环境

cn-hongkong.10.0.4.22 节点上存在 nginx-6f545cb57c-kt7r8,10.0.4.30和busybox-87ff8bd74-g8zs7,10.0.4.24。

内核路由

nginx-6f545cb57c-kt7r8 IP地址 10.0.4.30 ,该容器在宿主机表现的PID是1734171,该容器网络命名空间有指向容器eth0的默认路由

该容器eth0在ECS OS 内是通过ipvlan隧道的方式和ECS的附属ENI eth1建立的隧道,同时附属ENI eth1还有个虚拟的calixxxx  网卡

在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。

trunking 命名空间下的busybox-87ff8bd74-g8zs7 和 nginx-6f545cb57c-kt7r8 pod匹配了相应的podnetworking设置,被分配了相应的memeber ENI、对应的Trunking ENI,安全组,交换机和被绑定的ECS实例,这样就实现了Pod维度的交换机,安全组的配置和管理。

在tc层面可以看到VLAN ID 1027,所以数据流量在egress或者ingress的阶段会打上或者去除VLAN ID。

ENI的网卡所属的安全组可以看到只允许了指定的IP可以访问nginx pod的80 端口。

置于数据面流量在OS层面的流量转发逻辑,这个类似于《全景剖析阿里云容器网络数据链路(三)—— Terway ENIIP》 ,不在这里做过多的叙述。

小结

可以访问到目的端

数据链路转发示意图:

  • 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信
  • 整个链路不会和请求不会经过pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被转发
  • 整个请求链路是ECS1 Pod1 eth0 -> cali1xxxxxx-> cali2xxxxxx -> ECS1 Pod2 eth0
  • pod属于 同or不同 ENI,链路请求是一致的,不经过ENI
  • 因为是通过 os内核 routing 转发,不经过 member eni,所以安全组不生效,此链路与pod所属的member eni的安全组无关
  • 访问Pod IP 和访问 SVC IP(external ipor clusterip)的区别是:

访问SVC IP, SVC 会在源端pod eth0和calixxx网卡捕捉到,在目的端pod的eth0和calixxx时捕捉不到

2.3 场景三:同节点不同安全组Trunk Pod互访(含访问SVC IP,源端和svc后端部署在同一节点)

环境

cn-hongkong.10.0.4.244 节点上存在 nginx-96bb9b7bb-wwrdm,10.0.5.35 和centos-648f9999bc-nxb6l,10.0.5.18。

内核路由

相关的Pod的容器网络命名空间,路由等不在进行过多描述,详情可以见前面两小节。

通过podeni可以看到centos-648f9999bc-nxb6l 所分配的ENI,安全组sg,交换机vsw等.

通过安全组sg-j6ccrxxxx可以看到centos 的pod可以访问外部所有的地址

同理,可以查看出服务端Pod的nginx-96bb9b7bb-wwrdm 的安全组 sg-j6ccrze8utxxxxx 是只允许192.168.0.0/16 可以访问

小结

可以访问到目的端

数据链路转发示意图:

  • 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信
  • 整个链路不会和请求不会经过pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被转发
  • 整个请求链路是ECS1 Pod1 eth0 -> cali1xxxxxx-> cali2xxxxxx -> ECS1 Pod2 eth0
  • pod属于 同or不同 ENI,链路请求是一致的,不经过ENI
  • 因为是通过 os内核 routing 转发,不经过 member eni,所以安全组不生效,此链路与pod所属的member eni的安全组无关
  • 访问Pod IP 和访问 SVC IP(external ipor clusterip)的区别是:

访问SVC IP, SVC 会在源端pod eth0和calixxx网卡捕捉到,在目的端pod的eth0和calixxx时捕捉不到

2.4 场景四:不同节点同安全组Trunk Pod互访

环境

cn-hongkong.10.0.4.20 节点上存在客户端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27

cn-hongkong.10.0.4.22 节点上存在服务端 nginx-6f545cb57c-kt7r8 和IP 10.0.4.30

内核路由

相关的Pod的容器网络命名空间,路由等不在进行过多描述,详情可以见前面两小节。

通过podeni可以看到centos-59cdc5c9c4-l5vf9 所分配的ENI,安全组sg,交换机vsw等.

通过安全组sg-j6cf3sxrlbuwxxxxx可以看到centos和nginx的 的pod属于同一个安全组 sg-j6cf3sxrlbuxxxxx。

小结

是否可以访问取决于安全组配置

数据链路转发示意图:

  • 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信
  • 整个链路不会和请求不会经过pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被转发
  • 出ECS后,根据要访问的pod和该pod ENI所属vswitch,命中VPC路由规则或者直接VSW上的二层转发;
  • 整个请求链路是 ECS1 Pod1 eth0 -> cali1xxx > Trunk eni ( ECS1) -> Pod1 member eni -> vpc route rule(如有) -> Pod2 member eni -> > Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0
  • 因为是通过os内核 routing 转发,经过 member eni,因为member eni属于同一个安全组,所以安全组内默认是互通的

2.5 场景五:不同节点不同安全组Trunk Pod互访

环境

cn-hongkong.10.0.4.20 节点上存在客户端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27

cn-hongkong.10.0.4.244 节点上存在服务端 nginx-96bb9b7bb-wwrdm 和IP 10.0.5.35

内核路由

相关的Pod的容器网络命名空间,路由等不在进行过多描述,详情可以见前面两小节。

通过podeni可以看到centos-59cdc5c9c4-l5vf9 所分配的ENI,安全组sg,交换机vsw等。

通过安全组sg-j6cf3sxrlbuwxxxxx可以看到centos 的pod可以访问外部所有的地址

同理,可以查看出服务端Pod的nginx-96bb9b7bb-wwrdm 的安全组 sg-j6ccrze8utxxxxx 是只允许192.168.0.0/16 可以访问

小结

是否可以访问取决于安全组配置

数据链路转发示意图:

  • 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信
  • 整个链路不会和请求不会经过pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被转发
  • 整个请求链路是ECS1 Pod1 eth0 -> cali1xxx > Trunk eni ( ECS1) -> Pod1 member eni -> vpc route rule(如有) -> Pod2 member eni -> > Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0
  • 因为是通过os内核routing转发,流量会经过member eni, 是否可以访问成功,安全组配置对此有着决定性的作用。

2.6 场景六:集群内源端访问SVC IP(源端和SVC后端不同节点,相同安全组,含Local模式访问external IP)

环境

cn-hongkong.10.0.4.20 节点上存在客户端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27

cn-hongkong.10.0.4.22 节点上存在服务端 nginx-6f545cb57c-kt7r8 和IP 10.0.4.30

nginx 的svc的ClusterIP是 192.168.81.92 External IP是 8.210.162.178

内核路由

ENI-Trunking相比较ENIIP来说,只是在VPC侧增加了对应的Truning和Member ENI,在OS内并无区别,此处可以参考《全景剖析阿里云容器网络数据链路(三)—— Terway ENIIP》 2.4 小节

小结

是否可以访问取决于安全组配置

数据链路转发示意图:

  • 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信
  • 整个链路不会和请求不会经过pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被转发
  • 出ECS后,根据要访问的pod和该pod ENI所属vswitch,命中VPC路由规则或者直接VSW上的二层转发;
  • 整个请求链路是

去方向ECS1 Pod1 eth0 -> cali1xxx > ECS eth0 -> Pod1 member eni -> vpc route rule(如有) -> Pod2 member eni -> Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0

回方向ECS2 Pod1 eth0 -> Trunk eni ( ECS2) cali2 xxx -> Pod2 member eni -> vpc route rule(如有) -> Pod1 member eni -> Trunk eni ( ECS1) -> cali1xxx -> ECS1 Pod1 eth0

  • 经过ipvs规则fnat转化, 数据包是以源pod IP 从ECS eth0 出,请求目的pod IP。(访问SVC clusterIP,以及Local模式下访问External IP)
  • 这个经过的ENI有 ECS1 的eth0, Pod1 member eni,Pod2 member eni。所以这个网卡的安全组的配置都会影响数据链路的连通性

2.7 场景七:集群内源端访问SVC IP(源端和SVC后端不同节点,不同安全组,含Local模式访问external IP)

环境

cn-hongkong.10.0.4.20 节点上存在客户端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27

cn-hongkong.10.0.4.244 节点上存在服务端 nginx-96bb9b7bb-wwrdm 和IP 10.0.5.35

nginx 的svc的ClusterIP是 192.168.31.83 External IP是 47.243.87.204

内核路由

ENI-Trunking相比较ENIIP来说,只是在VPC侧增加了对应的Truning和Member ENI,在OS内并无区别,此处可以参考《全景剖析阿里云容器网络数据链路(三)—— Terway ENIIP》 2.4 小节

小结

是否可以访问取决于安全组配置

数据链路转发示意图:

  • 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信
  • 整个链路不会和请求不会经过pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被转发
  • 出ECS后,根据要访问的pod和该pod ENI所属vswitch,命中VPC路由规则或者直接VSW上的二层转发;
  • 整个请求链路是

去方向ECS1 Pod1 eth0 -> cali1xxx > ECS eth0 -> Pod1 member eni -> vpc route rule(如有) -> Pod2 member eni -> Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0

回方向ECS2 Pod1 eth0 -> Trunk eni ( ECS2) cali2 xxx -> Pod2 member eni -> vpc route rule(如有) -> Pod1 member eni -> Trunk eni ( ECS1) -> cali1xxx -> ECS1 Pod1 eth0

  • 经过ipvs规则fnat转化, 数据包是以源pod IP 从ECS eth0 出,请求目的pod IP。(访问SVC clusterIP,以及Local模式下访问External IP)
  • 这个经过的ENI有 ECS1 的eth0, Pod1 member eni,Pod2 member eni。所以这个网卡的安全组的配置都会影响数据链路的连通性。 需要保证 安全组互相放通Pod和ECS的响应IP

2.8 场景八:Cluster模式下,集群内源端访问SVC ExternalIP(源端和SVC后端不同节点,不同安全组)

环境

cn-hongkong.10.0.4.20 节点上存在客户端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27

cn-hongkong.10.0.4.244 节点上存在服务端 nginx-96bb9b7bb-wwrdm 和IP 10.0.5.35

nginx 的svc的ClusterIP是 192.168.31.83 External IP是 47.243.87.204, ExternalTrafficPolicy 是 Cluster模式

内核路由

ENI-Trunking相比较ENIIP来说,只是在VPC侧增加了对应的Truning和Member ENI,在OS内并无区别,此处可以参考《全景剖析阿里云容器网络数据链路(三)—— Terway ENIIP》 2.5 小节

小结

是否可以访问取决于安全组配置

数据链路转发示意图:

  • 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信
  • 整个链路不会和请求不会经过pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被转发
  • 出ECS后,根据要访问的pod和该pod ENI所属vswitch,命中VPC路由规则或者直接VSW上的二层转发;
  • 整个请求链路是ECS1 Pod1 eth0 -> cali1xxx > ECS eth0 ->  vpc route rule(如有) -> Pod2 member eni -> Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0
  • 经过ipvs规则fnat转化, 数据包是以源pod IP 从ECS eth0 出,请求目的pod IP。(访问SVC clusterIP,以及Local模式下访问External IP)
  • 这个经过的ENI有 ECS1 的eth0,Pod2 member eni。所以这个网卡的安全组的配置都会影响数据链路的连通性。 需要保证 安全组互相放通Pod和ECS的响应IP

2.9 场景九:Cluster模式下,集群内源端访问SVC ExternalIP(源端和SVC后端不同节点,相同安全组)

环境

cn-hongkong.10.0.4.20 节点上存在客户端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27

cn-hongkong.10.0.4.22 节点上存在服务端 nginx-6f545cb57c-kt7r8 和IP 10.0.4.30

nginx 的svc的ClusterIP是 192.168.81.92 External IP是 8.210.162.178 ExternalTrafficPolicy为Cluster

内核路由

ENI-Trunking相比较ENIIP来说,只是在VPC侧增加了对应的Truning和Member ENI,在OS内并无区别,此处可以参考《全景剖析阿里云容器网络数据链路(三)—— Terway ENIIP》 2.5 小节

小结

是否可以访问取决于安全组配置

数据链路转发示意图:

  • 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信
  • 整个链路不会和请求不会经过pod所分配的ENI,直接在OS 的ns中命中 Ip rule 被转发
  • 出ECS后,根据要访问的pod和该pod ENI所属vswitch,命中VPC路由规则或者直接VSW上的二层转发;
  • 整个请求链路是ECS1 Pod1 eth0 -> cali1xxx > ECS eth0 ->  vpc route rule(如有) -> Pod2 member eni -> Trunk eni ( ECS2) cali2 xxx  -> ECS2 Pod1 eth0
  • 经过ipvs规则fnat转化, 数据包是以源pod IP 从ECS eth0 出,请求目的pod IP。(访问SVC clusterIP,以及Local模式下访问External IP)
  • 这个经过的ENI有 ECS1 的eth0,Pod2 member eni。所以这个网卡的安全组的配置都会影响数据链路的连通性。 需要保证 安全组互相放通Pod和ECS的响应IP

2.10 场景十:集群外访问SVC IP

环境

cn-hongkong.10.0.4.20 节点上存在客户端 centos-59cdc5c9c4-l5vf9 和IP 10.0.4.27

cn-hongkong.10.0.4.22 节点上存在服务端 nginx-6f545cb57c-kt7r8 和IP 10.0.4.30

nginx 的svc的ClusterIP是 192.168.81.92 External IP是 8.210.162.178 ExternalTrafficPolicy为Cluster

SLB相关配置

在SLB控制台,可以看到 lb-j6cmv8aaojf7nqdai2a6a 虚拟服务器组的后端服务器组是两个后端nginx pod 的的ENI eni-j6cgrqqrtvcwhhcyuc28, eni-j6c54tyfku5855euh3db 和 eni-j6cf7e4qnfx22mmvblj0,这几个ENI 都是member ENI

小结

是否可以访问取决于安全组配置

数据链路转发示意图:

  • 会经过calicao网卡,每个非hostnetwork的pod会和calicao网卡形成veth pair,用于和其他pod或node进行通信
  • 数据链路:client ->  SLB  -> Pod Member ENI + Pod Port  -> Trunking ENI -> ECS1 Pod1 eth0
  • ExternalTrafficPolicy 为Local或Cluster模式下, SLB只会将 pod分配的member ENI挂在到SLB的虚拟服务器组
  • SLB转发请求只会转发到目标member ENI上,然后通过vlan发送到Trunk ENI,再由Trunk ENI 转发到 POD

总结

本篇文章主要聚焦ACK 在Terway ENI-Trunking模式下,不同SOP场景下的数据链路转发路径。伴随着客户对业务网络的更精细化的管理需求,引入了Pod维度交换机和安全组配置设置,在Terway ENI-Trunking模式下,一共可以分为10个SOP场景,并对这些场景技术实现原理,云产品配置等一一梳理并总结,这对我们遇到Terway ENI-Trunking架构下的链路抖动、最优化配置,链路原理等提供了初步指引方向。在Terway ENI-Trunking模式下,利用veth pair来联通宿主机和pod的网络空间,pod的地址是来源于弹性网卡的辅助IP地址,并且节点上需要配置策略路由来保证辅助IP的流量经过它所属的弹性网卡,通过此种方式可以实现ENI多Pod共享,大大提升了Pod的部署密度,同时利用tc egress/ingress 在数据流输入ECS时候,打上或者去除VLAN tag,以便实现数据流量能真正的走到属于他的Member ENI网卡,从而实现精细化的管理。 目前微服务越来越盛行,采用sidecar的方式,让每个pod都可以成为一个网络节点,从而实现pod中不同的流量实现不同的网络行为和可观测性,下一系列我们将进入到Terway ENIIP模式的全景解析最后一章——《全景剖析阿里云容器网络数据链路(六)—— ASM Istio》。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
4天前
|
机器学习/深度学习 传感器 自然语言处理
深度学习的魔法:如何用神经网络解锁数据的秘密
在这个数字信息爆炸的时代,深度学习技术如同一把钥匙,揭开了数据隐藏的层层秘密。本文将深入浅出地探讨深度学习的核心概念、关键技术和实际应用,带领读者领略这一领域的奥秘与魅力。通过生动的比喻和直观的解释,我们将一起走进神经网络的世界,看看这些由数据驱动的“大脑”是如何学习和成长的。无论你是科技爱好者还是行业新手,这篇文章都将为你打开一扇通往未来的大门。
|
11天前
|
数据采集 自然语言处理 监控
【优秀python毕设案例】基于python django的新媒体网络舆情数据爬取与分析
本文介绍了一个基于Python Django框架开发的新媒体网络舆情数据爬取与分析系统,该系统利用Scrapy框架抓取微博热搜数据,通过SnowNLP进行情感分析,jieba库进行中文分词处理,并以图表和词云图等形式进行数据可视化展示,以实现对微博热点话题的舆情监控和分析。
【优秀python毕设案例】基于python django的新媒体网络舆情数据爬取与分析
|
15天前
|
数据采集 XML 前端开发
五:《智慧的网络爬虫》— bs4数据解析
【8月更文挑战第4天】bs4(Beautiful Soup 4)是python的一个库,最主要的功能是从网页抓取数据,它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式。BeautifulSoup会帮你节省数小时甚至数天的工作时间。在本篇文章的最后设置了一个爬取全国所有天气的项目作为本篇文章的总结,愿大家有所收获~
36 6
五:《智慧的网络爬虫》— bs4数据解析
|
1天前
|
网络协议 Linux 网络安全
遇到Docker容器网络隔断?揭秘六种超级实用解决方案,轻松让Docker容器畅游互联网!
【8月更文挑战第18天】Docker容器内网络不通是开发者常遇问题,可能因网络配置错、Docker服务异常或防火墙阻碍等原因引起。本文提供六种解决策略:确认Docker服务运行状态、重启Docker服务、检查与自定义Docker网络设置、验证宿主机网络连接、临时禁用宿主机IPv6及检查防火墙规则。通过这些步骤,多数网络问题可得以解决,确保容器正常联网。
7 1
|
2天前
|
机器学习/深度学习 编解码 人工智能
【生成式对抗网络】GANs在数据生成、艺术创作,以及在增强现实和虚拟现实中的应用
生成对抗网络(Generative Adversarial Networks, GANs)在数据生成领域具有显著的应用价值。GANs通过生成器(Generator)和判别器(Discriminator)两个相互竞争的神经网络,不断迭代优化,从而生成高质量的数据样本。这一技术在数据增强方面尤为重要,特别是在数据稀缺或难以获取的领域,如医疗影像分析、自动驾驶等。GANs能够生成与真实数据相似的新数据样本,从而扩充数据集规模,提高模型的泛化能力。此外,GANs还可以用于生成仿真数据,如金融领域中的股票价格走势,用于训练预测模型,提高预测准确性
9 2
|
5天前
|
弹性计算 Prometheus 监控
如何基于容器网络流量指标进行弹性伸缩
【8月更文挑战第13天】基于容器网络流量指标进行弹性伸缩可动态调整资源,提升系统性能与利用率。首先选监控工具如Prometheus,收集并分析网络流量数据。接着定义监控指标及阈值,如入站与出站流量。最后配置如Kubernetes的HPA实现自动化伸缩,并通过测试不断优化策略,确保系统稳定高效运行。
|
9天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:保护数据,共筑防线
【7月更文挑战第41天】在数字化时代,数据成为了新石油。然而,随着网络攻击的日益猖獗,保护这些数据变得至关重要。本文将探讨网络安全漏洞的概念、加密技术的重要性以及提升个人和企业安全意识的必要性。我们将深入了解如何通过技术和教育手段来构建一个更加安全的网络环境。
|
9天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:保护数据的关键策略
在数字化时代,网络安全和信息安全的重要性不言而喻。本文将深入探讨网络安全漏洞、加密技术以及提升安全意识等方面,旨在为读者提供一系列实用的知识分享。我们将从网络安全的基本概念出发,分析常见的网络威胁和漏洞,进而介绍加密技术的原理和应用,最后强调培养良好的安全习惯和意识的重要性。通过这些内容的阐述,希望能够帮助读者更好地理解和应对网络安全挑战。
|
10天前
|
存储 安全 网络安全
云计算与网络安全:保护云端数据的新策略
随着企业和个人用户越来越多地依赖云服务,如何确保存储在远程服务器上的数据安全成为了一个迫切需要解决的问题。本文将介绍云计算的基本概念、云服务的类型以及它们面临的安全挑战。我们将探讨网络安全的重要性,并分析当前信息安全领域面临的主要威胁。最后,文章将提出一系列创新性的防护措施,以增强云计算环境中的数据安全性。
|
12天前
|
Linux 调度 Docker
容器网络概述
【8月更文挑战第7天】容器就是 Container,而 Container 的另一个意思是集装箱。其实容器的思想就是要变成软件交付的集装箱。集装箱的特点,一是打包,二是标准。