Kubernetes 网络的四种场景分析 (kubernetes)

技术教程 2025-05-13 22:56:06 浏览
网络的四种场景分析

Kubernetes 网络的四种场景分析

2020-06-24 07:49:13本文介绍了Kubernetes网络的各种场景,包括容器之间、Pod之间、Pod到Service、外部到内部的这4种场景下,不同的通信模式。

本文介绍了Kubernetes网络的各种场景,包括容器之间、Pod之间、Pod到Service、外部到内部的这4种场景下,不同的通信模式。在设计Kubernetes容器平台的时候,建议按照这些通信模式,根据具体的场景,逐一比对选择合适的解决方案。其中,特别需要注意的是外部到内部的访问。

顾文俊,某互联网公司,金融行业架构师。2008年南京邮电大学电路与系统专业研究生毕业,12+年职业生涯主要从事IT基础设施、云计算、容器、大数据、AI、金融科技相关领域的解决方案工作。

在实际的业务场景中,业务组件之间的关系十分复杂,特别是微服务概念的提出,应用部署的粒度更加细小和灵活。为了支持业务应用组件的通信联系,Kubernetes网络的设计主要致力于解决以下场景:

(1)紧密耦合的容器到容器之间的直接通信;

(2)抽象的Pod到Pod之间的通信;

(3)Pod到Service之间的通信;

(4)集群外部与内部组件之间的通信。

1. 容器到容器的通信

在同一个Pod内的容器(Pod内的容器是不会跨宿主机的)共享同一个网络命名空间,共享同一个linux协议栈。所以对于网络的各类操作,就和它们在同一台机器上一样,它们甚至可以用localhost地址访问彼此的端口。这么做的结果是简单、安全和高效,也能减少将已经存在的程序从物理机或者虚拟机移植到容器的难度。

如下图中的阴影部分就是Node上运行着的一个Pod实例。容器1和容器2共享了一个网络的命名空间,共享一个命名空间的结果就是它们好像在一台机器上运行似的,它们打开的端口不会有冲突,可以直接用Linux的本地IPC进行通信。它们之间互相访问只需要使用localhost就可以。

容器到容器间通信

2. Pod之间的通信

每一个Pod都有一个真实的全局IP地址,同一个Node内的不同Pod之间可以直接采用对房Pod的IP地址通信,而不需要使用其他发现机制,例如DNS、Consul或者etcd。Pod既有可能在同一个Node上运行,也有可能在不用的Node上运行,所以通信也分为两类:同一个Node内的Pod之间的通信和不同Node上的Pod之间的通信。

1)同一个Node内的Pod之间的通信

如图,可以看出,Pod1和Pod2都是通过Veth连接在同一个Docker0网桥上的,它们的IP地址IP1、IP2都是从Docker0的网段上自动获取的,它们和网桥本身的IP3是同一个网段的。另外,在Pod1、Pod2的Linux协议栈上,默认路由都是Docker0的地址,也就是说所有非本地的网络数据,都会被默认发送到Docker0网桥上,由Docker0网桥直接中转,它们之间是可以直接通信的。

同一个Node内的Pod关系

2)不同Node上的Pod之间的通信

Pod的地址是与Docker0在同一个网段内的,我们知道Docker0网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的通信只能通过宿主机的物理网卡进行,因此要想实现位于不同Node上的Pod容器之间的通信,就必须想办法通过主机的这个IP地址来进行寻址和通信。另外一方面,这些动态分配且藏在Docker0之后的所谓“私有”IP地址也是可以找到的。Kubernetes会记录所有正在运行Pod的IP分配信息,并将这些信息保存在etcd中(作为Service的Endpoint)。这些私有IP信息对于Pod到Pod的通信也是十分重要的,因为我们的网络模型要求Pod到Pod使用私有IP进行通信。之前提到,Kubernetes的网络对Pod的地址是平面的和直达的,所以这些Pod的IP规划也很重要,不能有冲突。综上所述,想要支持不同Node上的Pod之间的通信,就要达到两个条件:

(1)在整个Kubernetes集群中对Pod分配进行规划,不能有冲突;

(2)找到一种办法,将Pod的IP和所在Node的IP关联起来,通过这个关联让Pod可以互相访问。

根据条件1的要求,我们需要在部署Kubernetes的时候,对Docker0的IP地址进行规划,保证每一个Node上的Docker0地址没有冲突。我们可以在规划后手工分配到每个Node上,或者做一个分配规则,由安装的程序自己去分配占用。例如Kubernetes的网络增强开源软件Flannel就能够管理资源池的分配。

根据条件2的要求,Pod中的数据在发出时,需要有一个机制能够知道对方Pod的IP地址挂在哪个具体的Node上。也就是说要先找到Node对应宿主机的IP地址,将数据发送到这个宿主机的网卡上,然后在宿主机上将相应的数据转到具体的Docker0上。一旦数据到达宿主机Node,则哪个Node内部的Docker0便知道如何将数据发送到Pod。

具体情况,如下图所示。

跨Node的Pod通信

在图6中,IP1对应的是Pod1,IP2对应的是Pod2。Pod1在访问Pod2时,首先要将数据从源Node的eth0发送出去,找到并到达Node2的eth0。也就是说先要从IP3到IP4,之后才是IP4到IP2的送达。

3. Pod 到Service之间的通信

为了支持集群的水平扩展、高可用,Kubernetes抽象出Service的概念。Service是对一组Pod的抽象,它会根据访问策略(LB)来访问这组Pod。

Kubernetes在创建服务时会为服务分配一个虚拟的IP地址,客户端通过访问这个虚拟的IP地址来访问服务,而服务则负责将请求转发到后端的Pod上。这个类似于反向代理,但是,和普通的反向代理有一些不同:首先它的IP地址是虚拟的,想从外面访问需要一些技巧;其次是它的部署和启停是Kubernetes统一自动管理的。

Service在很多情况下只是一个概念,而真正将Service的作用落实的是背后的kube-proxy服务进程。在Kubernetes集群的每个Node上都会运行一个kube-proxy服务进程,这个进程可以看作Service的透明代理兼负载均衡器,其核心功能是将到某个Service的访问请求转发到后端的多个Pod实例上。对每一个TCP类型的Kubernetes Service,kube-proxy都会在本地Node上建立一个SocketServer来负责接收请求,然后均匀发送到后端某个Pod的端口上,这个过程默认采用RoundRobin负载均衡算法。Kube-proxy和后端Pod的通信方式与标准的Pod到Pod的通信方式完全相同。另外,Kubernetes也提供通过修改Service的service.spec.-sessionAffinity参数的值来实现会话保持特性的定向转发,如果设置的值为“ClientIP”,则将来自同一个ClientIP的请求都转发到同一个后端Pod上。此外,Service的ClusterIP与NodePort等概念是kube-proxy通过Iptables和NAT转换实现的,kube-proxy在运行过程中动态创建与Service相关的Iptables规则,这些规则实现了ClusterIP及NodePort的请求流量重定向到kube-proxy进程上对应服务的代理端口的功能。由于Iptables机制针对的是本地的kube-proxy端口,所以如果Pod需要访问Service,则它所在的那个Node上必须运行kube-proxy,并且在每个Kubernetes的Node上都会运行kube-proxy组件。在Kubernetes集群内部,对Service Cluster IP和Port的访问可以在任意Node上进行,这个因为每个Node上的kube-proxy针对该Service都设置了相同的转发规则。

综上所述,由于kube-proxy的作用,在Service的调用过程中客户端无需关心后端有几个Pod,中间过程的通信、负载均衡及故障恢复都是透明的,如下图所示。

Service的负载均衡转发

访问Service的请求,不论是用Cluster IP+Target Port的方式,还是用节点机IP+Node Port的方式,都会被节点机的Iptables规则重定向到kube-proxy监听Service服务代理端口。Kube-proxy接收到Service的访问请求后,会如何选择后端Pod?

首先,目前kube-proxy的负载均衡只支持Round Robin算法。该算法按照成员列表逐个选取成员,如果一轮循环完,便从头开始下一轮,如此循环往复。Kube-proxy的负载均衡器在Round Robin算法的基础上还支持Session保持。如果Service在定义中指定了Session保持,则kube-proxy接收请求时会从本地内存中查找是否存在来自该请求IP的affinityState对象,如果存在该对象,且Session没有超时,则kube-proxy将请求转向该affinityState所指向的后端Pod。如果本地存在没有来自该请求IP的affinityState对象,记录请求的IP和指向的Endpoint。后面的请求就会粘连到这个创建好的affinityState对象上,这就实现了客户端IP会话保持的功能。

接下来我们深入分析kube-proxy的实现细节。kube-proxy进程为每个Service都建立了一个“服务代理对象”,服务代理对象是kube-proxy程序内部的一种数据结构,它包括一个用于监听此服务请求的Socket-Server,SocketServer的端口是随机选择的一个本地空闲端口。此外,kube-proxy内部也建立了一个“负载均衡器组件”,用来实现SocketServer上收到的连接到后端多个Pod连接之间的负载均衡和会话保持能力。

kube-proxy通过查询和监听API Server中Service与Endpoint的变化来实现其主要功能,包括为新创建的Service打开一个本地代理对象(代理对象是kube-proxy程序内部的一种数据结构,一个Service端口是一个代理对象,包括一个用于监听的服务请求的SocketServer),接收请求,针对发生变化的Service列表,kube-proxy会逐个处理。下面是具体的处理流程:

(1)如果该Service没有设置集群IP(ClusterIP),则不做任何处理,否则,获取该Service的所有端口定义列表(spec.ports域)

(2)逐个读取服务端口定义列表中的端口信息,根据端口名称、Service名称和Namespace判断本地是否已经存在对应的服务代理对象,如果不存在就新建,如果存在且Service端口被修改过,则先删除Iptables中和该Service相关的的规则,关闭服务代理对象,然后走新建流程,即为该Service端口分配服务代理对象并为该Service创建相关的Iptables规则。

(3)更新负载均衡器组件中对应Service的转发地址表,对于新建的Service,确定转发时的会话保持策略。

(4)对于已经删除的Service则进行清理。

Kube-proxy与APIServer的交互过程

4. 外部到内部的访问

Pod作为基本的资源对象,除了会被集群内部的Pod访问,也会被外部使用。服务是对一组功能相同Pod的抽象,以它为单位对外提供服务是最合适的粒度。

kubernetes

由于Service对象在Cluster IP Range池中分配到的IP只能在内部访问,所以其他Pod都可以无障碍地访问到它。但如果这个Service作为前端服务,准备为集群外的客户端提供服务,就需要外部能够看到它。

Kubernetes支持两种对外服务的Service的Type定义:NodePort和LoadBalancer。

(1)NodePort

在定义Service时指定spec.type=NodePort,并指定spec.ports.nodePort的值,系统就会在Kubernetes集群中的每个Node上打开一个主机上的真实端口号。这样,能够访问Node的客户端就能通过这个端口号访问到内部的Service了。

(2)LoadBalancer

如果云服务商支持外接负载均衡器,则可以通过spec.type=LoadBalancer定义Service,同时需要指定负载均衡器的IP地址。使用这种类型需要指定Service的NodePort和ClusterIP。

对于这个Service的访问请求将会通过LoadBalancer转发到后端Pod上去,负载分发的实现方式依赖于云服务商提供的LoadBalancer的实现机制。

(3)外部访问内部Service原理

我们从集群外部访问集群内部,最终都是落在具体的Pod上。通过NodePort的方式就是将kube-proxy开放出去,利用Iptables为服务的NodePort设置规则,将对Service的访问转到kube-proxy上,这样kube-proxy就可以使用和内部Pod访问服务一样的方式来访问后端的一组Pod了。这种模式就是利用kube-proxy作为负载均衡器,处理外部到服务进一步到Pod的访问。而更常用的是外部均衡器模式。通常的实现是使用一个外部的负载均衡器,这些均衡器面向集群内的所有节点。当网络流量发送到LoadBalancer地址时,它会识别出这是某个服务的一部分,然后路由到合适的后端Pod。

所以从外面访问内部的Pod资源,就有了很多种不同的组合。

第一种情况的场景十分少见,只是在特殊的时候才需要。我们在实际的生产项目中需要逐一访问启动的Pod,给它们发送一个刷新指令。只有这种情况下才使用这种方式。这需要开发额外的程序,读取Service下的Endpoint列表,逐一和这些Pod进行通信。通常要避免这种通信方式,例如可以采取每个Pod从集中的数据源拉命令的方式,而不是采取推命令给它的方式来避免。因为具体到每个Pod的启停本来就是动态的,如果依赖了具体的Pod们就相当于绕开了Kubernetes的Service机制,虽然能够实现,但是不理想。

第二种情况就是NodePort的方式,外部的应用直接访问Service的NodePort,并通过Kube-proxy这个负载均衡器访问内部的Pod。

第三种情况是LoadBalancer模式,因为外部的LoadBalancer是具备Kubernetes知识的负载均衡器,它会去监听Service的创建,从而知晓后端的Pod启停变化,所以它有能力和后端的Pod进行通信。但是这里有个问题需要注意,那就是这个负载均衡器需要有办法直接和Pod进行通信。也就是说要求这个外部的负载均衡器使用和Pod到Pod一样的通信机制。

第四种情况也很少使用,因为需要经历两级的负载均衡设备,而且网络的调用被两次随机负载均衡后,更难跟踪了。在实际生产环境中出了问题排错时,很难跟踪网络数据的流动过程。

(4)外部硬件负载均衡器模式

在很多实际的生产环境中,由于是在私有云环境中部署Kubernetes集群,所以传统的负载均衡器都对Service无感知。实际上我们只需要解决两个问题,就可以将它变成Service可感知的负载均衡器,这也是实际系统中理想的外部访问Kubernetes集群内部的模式。

Kubernetes

如下图,说明了这个过程。

自定义外部负载均衡器访问Service

这里提供了一个Service Agent来实现Service变化的感知。该Agent能够直接从etcd中或者通过接口调用API Server来监控Service及Endpoint的变化,并将变化写入外部的硬件负载均衡器中。

同时,每台Node上都运行着有路由发现协议的软件,该软件负责将这个Node上所有的地址通过路由发现协议组播给网络内的其他主机,当然也包含硬件负载均衡器。这样硬件负载均衡器就能知道每个Pod实例的IP地址是在哪台Node上了。通过上述两个步骤,就建立起一个基于硬件的外部可感知Service的负载均衡器。

具体的案例,可以参见第五章的实践部分。

5. 总结

本章重点介绍了Kubernetes网络的各种场景,包括容器之间、Pod之间、Pod到Service、外部到内部的这4种场景下,不同的通信模式。在设计Kubernetes容器平台的时候,建议按照这些通信模式,根据具体的场景,逐一比对选择合适的解决方案。其中,需要注意的是外部到内部的访问,既可以通过NodePort,也可以通过LoadBalancer的方式亦或是Ingress模式,需要按照具体的场景来分析。

NodePort服务是暴露服务的最原始方式,会在所有节点上打开特定的端口,并且发送到此端口的任何流量都将转发到该服务。这种方法有很多缺点:每个端口只能有一个服务;默认只能使用端口30000~32767;如果节点IP地址发生更改,则会带来问题。由于这些原因,不建议在生产中使用这种方法。如果服务可用性不是特别关注,或者特别关注成本,则这个方案比较合适。

LoadBalancer是服务暴露的标准方式,将会启动一个网络负载均衡器,提供一个将所有流量转发到服务的IP地址。如果直接暴露一个服务,这是默认的方法。指定的端口上所有的流量将被转发到该服务,没有过滤、路由等。这就意味着可以发送几乎任何类型流量,如HTTP、TCP、UDP、Websocket、gRPC或其他。这个方式最大的缺点是,使用LoadBalancer公开的每项服务都将获得自己的IP地址,并且必须为每个服务使用一个LoadBalancer,这将会付出比较大的代价。

Ingress实际上不是一种服务。相反,它位于多个服务之前,充当集群中的“智能路由器”或入口点。默认的Ingress控制器将会启动一个HTTP(s)负载均衡器。这将可以执行基于路径和基于子域名的路由到后端服务。Ingress可能是暴露服务最强大的方式了,但也可能是最复杂的。如果希望在相同的IP地址下暴露多个服务,并且这些服务都使用相同的L7协议,则Ingress是最有用的。


网线5类6类有什么区别?

网线5类6类内部结构不同、铜芯不同、网络标识不同、价格不同、传输宽带不同。

1、内部结构不同

六类网线和五类网线的内部结构不同,六类网线内部结构增加了十字骨架,将双绞线的四对线缆分别置于十字骨架的四个凹槽内,电缆中央的十字骨架随长度的变化而旋转角度;

2、铜芯不同

六类网线和五类网线的铜芯大小不同,五类网线铜芯为0.45mm以下,超五类网线为0.45mm-0.51mm,六类网线标准的为0.56mm-0.58mm。

3、网络标识不同

五类网线:外皮会标注“CAT5”字样,传输带宽为100MHz,用于语音传输和最高传输速率为100Mbps的数据传输,主要用于百兆网络和十兆网络,已被超五类线替代。

六类网线:外皮标注“CAT6”字样,一般指的都是非屏蔽网线,主要应用在千兆网络中,在传输性能上远远高于超五类网线标准。

4、价格不同

五类网线和六类网线在售卖时,两者的价格也有明显的区别,六类网线更贵一点。

5、传输宽带不同

五类网线传输带宽为100Mbps的数据传输,主要用于百兆网络和十兆网络;六类网线为1000Mbps以上,主要应用在千兆网络中,在传输性能上远远高于超五类网线标准。

五类线:该类电缆增加了绕线密度,外套一种高质量的绝缘材料,传输率为100MHz,用于语音传输和最高传输速率为10Mbps的数据传输,主要用于100BASE-T和10BASE-T网络,这是最常用的以太网电缆。

六类线:该类电缆的传输频率为1MHz~250MHz,六类布线系统在200MHz时综合衰减串扰比(PS-ACR)应该有较大的余量,它提供2倍于超五类的带宽。 六类布线的传输性能远远高于超五类标准,最适用于传输速率高于1Gbps的应用。

磨损有哪几种类型

设备磨损分为两大类,四种形式。 (一)有形磨损 1 .设备在使用过程中,在外力的作用下实体产生的磨损、变形和损坏,这种磨损的程度与使用强度和使用时间长度有关。 2 .设备在闲置过程中受自然力的作用而产生的实体磨损,如金属件生锈、腐蚀、橡胶件老化等,这种磨损与闲置的时间长度和所处环境有关。 上述两种有形磨损都造成设备的性能、精度等的降低,使得设备的运行费用和维修费用增加,效率低下,反映了设备使用价值的降低。 (二)无形磨损 设备无形磨损不是由生产过程中使用或自然力的作用造成的,而是由于社会经济环境变化造成的设备价值贬值,是技术进步的结果,无形磨损又有两种形式。 1 .设备的技术结构和性能并没有变化,但由于技术进步,设备制造工艺不断改进,社会劳动生产率水平的提高,同类设备的再生产价值降低,因而设备的市场价格也降低了,致使原设备相对贬值。 这种无形磨损的后果只是现有设备原始价值部分贬值,设备本身的技术特性和功能即使用价值并未发生变化,故不会影响现有设备的使用。 因此,不产生提前更换现有设备的问题。 2 .第二种无形磨损是由于科学技术的进步,不断创新出结构更先进、性能更完善、效率更高、耗费原材料和能源更少的新型设备,使原有设备相对陈旧落后,其经济效益相对降低而发生贬值。 这就产生了是否用新设备代替现有陈旧落后设备的问题。

闺蜜网名四个人的,短点的,霸气的

闺蜜网名四个人的,短点的,霸气的:1、- 记忆融为怀念是因为时间- 感情化作乌有是因为强求- 回忆化为思念是因为流年- 青春化作曾经是因为破碎2、小女人丶爱沵爱疯了自己小女人丶有沵我早已知足小女人丶为沵我倾其所有小女人丶因沵我学会铭记3、时光,不过是一道浮光╮锦年,不过是素锦流年╮流年,不过是似水流年╮淡然,不过是少些激动╮4、那没有了灵魂的空壳的我●那没有了快乐的装扮的我●那没有了微笑的点缀的我●那没有了悲伤的情绪的我●5、花开 丶看一丝阳光花落 丶散一地微笑花陌 丶经一场半夏花浅 丶错一次彼岸6、没有你、才发现只剩下回忆没有你、才知道只剩下自己没有你、才懂得你有多重要没有你、才了解你有多爱我7、彼此都那么的执着。 彼此都那么的倔强。 彼此都那么的偏激。 彼此都那么的偏执。 8、有一种思念叫做月满西楼。 有一种默契叫做心有灵犀。 有一种感觉叫做轻风细雨。 有一种幸福叫做红藕齐怜。 9、夏花浪漫璀璨如你们一样春花温暖艳丽如你们一样冬花骄傲坚强如你们一样秋花凄美活力如你们一样10、幻想撕裂红颜一席微凉夕夏温存不知足的满足人山人海之不堪的浮华凉薄繁华轻叹世间多变11、流水已逝的苍年流光、微风已散的素年未逝、碎花已乱的风年默念、轻雾已惘的流年弥散、12、爱爱爱__爱的忘乎所以念念念__念的肝肠寸断哭哭哭__哭的歇斯底里伤伤伤__伤的撕心裂肺13、心像大雨将至那么潮湿-爱像冬至将至那么寒冷-泪像飘雪将至那么放肆-笑像泪水将至那么无奈-14、薰衣草的光芒已不再耀眼郁金香的美丽已成为过往向日葵的高傲已不复存在白樱花的纯洁已消声匿迹15、资料能复制气质你能学吗资料能复制尊贵你能学吗资料能复制高傲你能学吗资料能复制冷漠你能学吗16、2b而不失优雅的小女人2b而不失美丽的小女人2b而不失气质的小女人2b而不失妩媚的小女人17、伦敦旳最后一丝寒冷°巴黎旳最后一点浪漫°纽约旳最后一些奢华°上海旳最后一个冷漠°18、相濡以沫只是一个代言 -不离不弃只是一个承诺 -冷暖自知只是一个假象 -至死不渝只是一个幻影 -19、我并不坚强〃你比谁都懂╮我并不快乐〃你比谁都懂╮我并不自私〃你比谁都懂╮我并不伤心〃你比谁都懂╮20、谁曾为谁许下地老天荒谁曾为谁颠覆整个世界谁曾为谁决定终身厮守谁曾为谁忘记世俗杂念21、。 面对太阳高傲的活着。 向往黑暗低落的生存。 横纵希望淡然的继续。 飞散可能欣慰的忘我22、灰色叙述你的消沉紫色凝聚你的忘怀红色弥漫你的嚣张绿色遗忘你的温柔23、一个自私自利旳女人。 一个横行霸道旳女人。 一个淫逆放荡旳女人。 一个痴情如醉旳女人。 24、那个地方的阳光依旧灿烂 ぁ那里盛开着一朵耀眼的花 ぁ那个太过于天真的大孩子 ぁ那颗骄傲而不知疲惫的心 ぁ25、你们就是我最大的骄傲〃你们就是我最大的目标〃你们就是我的无可取代〃你们就是我不可或缺的〃

本文版权声明本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请联系本站客服,一经查实,本站将立刻删除。

发表评论

热门推荐