Kubernetes 网络的四种场景分析.docx

上传人:王** 文档编号:1353509 上传时间:2024-06-21 格式:DOCX 页数:11 大小:156.95KB
下载 相关 举报
Kubernetes 网络的四种场景分析.docx_第1页
第1页 / 共11页
Kubernetes 网络的四种场景分析.docx_第2页
第2页 / 共11页
Kubernetes 网络的四种场景分析.docx_第3页
第3页 / 共11页
Kubernetes 网络的四种场景分析.docx_第4页
第4页 / 共11页
Kubernetes 网络的四种场景分析.docx_第5页
第5页 / 共11页
Kubernetes 网络的四种场景分析.docx_第6页
第6页 / 共11页
Kubernetes 网络的四种场景分析.docx_第7页
第7页 / 共11页
Kubernetes 网络的四种场景分析.docx_第8页
第8页 / 共11页
Kubernetes 网络的四种场景分析.docx_第9页
第9页 / 共11页
Kubernetes 网络的四种场景分析.docx_第10页
第10页 / 共11页
亲,该文档总共11页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《Kubernetes 网络的四种场景分析.docx》由会员分享,可在线阅读,更多相关《Kubernetes 网络的四种场景分析.docx(11页珍藏版)》请在优知文库上搜索。

1、本文介绍了KUbenIeteS网络的各种场景,包括容器之间、POd之I可、POd到Service外部到内部的这4种场景下,不同的通信模式。在设计KUbenleteS容器平台的时候,建议按照这些通信模式,根据具体的场景,逐一比对选择合适的解决方案。其中,特别需要注意的是外部到内部的访问。在实际的业务场景中,业务组件之间的关系十分复杂,特别是微服务概念的提出,应用部署的粒度更加细小和灵活。为了支持业务应用组件的通信联系,Kubernetes网络的设计主要致力于解决以下场景:(1)(2)(3)(4)紧密耦合的容器到容器之间的直接通信;抽象的Pod到Pod之间的通信;Pod到SerViCe之间的通信;

2、集群外部与内部组件之间的通信。1 .容器到容器的通信在同一个POd内的容器(POd内的容器是不会跨宿主机的)共享同一个网络命名空间,共享同一个1.inUX协议栈。所以对于网络的各类操作,就和它们在同一台机器上一样,它们甚至可以用localhost地址访问彼此的端口。这么做的结果是简单、安全和高效,也能减少将已经存在的程序从物理机或者虚拟机移植到容器的难度。如下图中的阴影部分就是Node上运行着的一个Pod实例。容器1和容器2共享了一个网络的命名空间,共享一个命名空间的结果就是它们好像在一台机器上运行似的,它们打开的端口不会有冲突,可以直接用1.inux的本地IPC进行通信。它们之间互相访问只需

3、要使用1。CalhoSt就可以。Nodel同一个POd容器1容器2共享网络空间ODOCkero网桥容器到容器间通信2 .Pod之间的通信每一个Pod都有一个真实的全局IP地址,同一个Node内的不同Pod之间可以直接采用对房Pod的IP地址通信,而不需要使用其他发现机制,例如DNSConsul或者etcdoPod既有可能在同一个Node上运行,也有可能在不用的Node上运行,所以通信也分为两类:同一个Node内的POd之间的通信和不同NOde上的POd之间的通信。1)同一个NOde内的POd之间的通信如图,可以看出,Podl和Pod2都是通过Veth连接在同一个DockerO网桥上的,它们的I

4、P地址Pl、IP2都是从DOCkero的网段上自动获取的,它们和网桥本身的IP3是同一个网段的。另外,在POd1、Pod2的1.inUX协议栈上,默认路由都是DoCkem的地址,也就是说所有非本地的网络数据,都会被默认发送到DoCkem网桥上,由DOCkem网桥直接中转,它们之间是可以直接通信的。同一个Node内的Pod关系2)不同Node上的Pod之间的通信Pod的地址是与DOCkerO在同一个网段内的,我们知道DockerO网段与宿主机网卡是两个完全不同的IP网段,并且不同Node之间的通信只能通过宿主机的物理网卡进行,因此要想实现位于不同NOde上的POd容器之间的通信,就必须想办法通过

5、主机的这个IP地址来进行寻址和通信。另外一方面,这些动态分配且藏在Dockert)之后的所谓“私有IP地址也是可以找到的。Kubernetes会记录所有正在运行Pod的IP分配信息,并将这些信息保存在etcd中(作为Service的Endpoint)o这些私有IP信息对于Pod到Pod的通信也是十分重要的,因为我们的网络模型要求Pod到Pod使用私有IP进行通信。之前提到,Kubemetes的网络对Pod的地址是平面的和直达的,所以这些POd的IP规划也很重要,不能有冲突。综上所述,想要支持不同Node上的Pod之间的通信,就要达到两个条件:(1)在整个Kubernetes集群中对Pod分配进

6、行规划,不能有冲突;(2)找到一种办法,将Pod的IP和所在Node的IP关联起来,通过这个关联让POd可以互相访问。根据条件1的要求,我们需要在部署Kubernetes的时候,对DockerO的IP地址进行规划,保证每一个NOde上的DOCkero地址没有冲突。我们可以在规划后手工分配到每个Node上,或者做一个分配规则,由安装的程序自己去分配占用。例如Kubernetes的网络增强开源软件Flannel就能够管理资源池的分配。根据条件2的要求,Pod中的数据在发出时,需要有一个机制能够知道对方Pod的IP地址挂在哪个具体的Node上。也就是说要先找到Node对应宿主机的IP地址,将数据发送

7、到这个宿主机的网卡上,然后在宿主机上将相应的数据转到具体的DockerO上。一旦数据到达宿主机Node,则哪个Node内部的DockerO便知道如何将数据发送到Podo具体情况,如下图所示。PodlI器2DOCkero网桥跨Node的Pod通信在图6中,IPl对应的是Podl,IP2对应的是Pod2oPodl在访问Pod2时,首先要将数据从源Node的eth发送出去,找到并到达Node2的eth。也就是说先要从IP3到IP4,之后才是1P4到IP2的送达。3 .Pod到SerViCe之间的通信为了支持集群的水平扩展、高可用,Kubernetes抽象出Service的概念。SerViCe是对一组

8、POd的抽象,它会根据访问策略(1.B)来访问这组Pod。Kubernetes在创建服务时会为服务分配一个虚拟的IP地址,客户端通过访问这个虚拟的IP地址来访问服务,而服务则负责将请求转发到后端的Pod上。这个类似于反向代理,但是,和普通的反向代理有一些不同:首先它的IP地址是虚拟的,想从外面访问需要一些技巧;其次是它的部署和启停是Kubernetes统一自动管理的。Service在很多情况下只是一个概念,而真正将Service的作用落实的是背后的kube-proxy服务进程。在Kubernetes集群的每个Node上都会运行一个kube-proxy服务进程,这个进程可以看作Service的透

9、明代理兼负载均衡器,其核心功能是将到某个Service的访问请求转发到后端的多个Pod实例上。对每一个TCP类型的KubernetesService,kube-proxy都会在本地Node上建立一个SoCketSerVer来负责接收请求,然后均匀发送到后端某个POd的端口上,这个过程默认采用RoundRobin负载均衡算法。Kube-proxy和后端Pod的通信方式与标准的Pod到Pod的通信方式完全相同。另外,Kubernetes也提供通过修改Service的service.spec.-sessionAffinity参数的值来实现会话保持特性的定向转发,如果设置的值为“ClientIP”,则

10、将来自同一个ClientIP的请求都转发到同一个后端PodJto此外,SerViCe的ClUSterIP与NOdePOrt等概念是kube-proxy通过IPtabIeS和NAT转换实现的,kube-proxy在运行过程中动态创建与Service相关的Iptables规则,这些规则实现了CIUSterlP及NOdePOrt的请求流量重定向到kube-proxy进程上对应服务的代理端口的功能。由于Iptables机制针对的是本地的kube-proxy端口,所以如果Pod需要访问Service,则它所在的那个Node上必须运行kube-proxy,并且在每个Kubernetes的Node上都会运行

11、kube-proxy组件。在Kubernetes集群内部,对ServiceClusterIP和Port的访问可以在任意Node上进行,这个因为每个Node上的kube-proxy针对该Service都设置了相同的转发规则。综上所述,由于kube-proxy的作用,在SerViCe的调用过程中客户端无需关心后端有几个Pod,中间过程的通信、负载均衡及故障恢复都是透明的,如下图所示。Service的负载均衡转发访问Service的请求,不论是用ClusterlPTargetPort的方式,还是用节点机IPNodePort的方式,都会被节点机的Iptables规则重定向到kube-proxy监听Se

12、rvice服务代理端口。Kube-proxy接收至IiService的访问请求后,会血何选择后端Pod?首先,目前kube-proxy的负载均衡只支持RoundRobin算法。该算法按照成员列表逐个选取成员,如果一轮循环完,便从头开始下一轮,如此循环往复。Kube-proxy的负载均衡器在RoundRobin算法的基础上还支持Session保持。如果Service在定义中指定了Session保持,则kube-proxy接收请求时会从本地内存中查找是否存在来自该请求IP的affinityState对最,如果存在该对象,且Session没有超时,则kube-proxy将请求转向该affinityS

13、tate所指向的后端Pod。如果本地存在没有来自该请求IP的affinityState对象,记录请求的IP和指向的Endpointo后面的请求就会粘连到这个创建好的affinityState对象上,这就实现了客户端IP会话保持的功能。接下来我们深入分析kube-proxy的实现细节。kube-proxy进程为每个Service都建立了一个“服务代理对象,服务代理对象是kube-proxy程序内部的一种数据结构,它包括一个用于监听此服务请求的SOCket-SerVer,SOCketSerVer的端口是随机选择的一个本地空闲端口。此外,kube-proxy内部也建立了一个“负载均衡器组件”,用来实

14、现SocketServer上收到的连接到后端多个Pod连接之间的负载均衡和会话保持能力。kube-proxy通过查询和监听APIServer中Service与Endpoint的变化来实现其主要功能,包括为新创建的Service打开一个本地代理对象(代理对象是kube-proxy程序内部的一种数据结构,一个SerViCe端口是一个代理对象,包括一个血于监听的服务请求的SocketServer),接收请求,针对发生变化的Service列表,kube-proxy会逐个处理。下面是具体的处理流程:(D如果该SerViCe没有设置集群IP(ChlSterIP),则不做任何处理,否则,获取该Service

15、的所有端口定义列表(SPee.ports域)(2)逐个读取服务端口定义列表中的端口信息,根据端口名称、SerViCe名称和Namespace判断本地是否已经存在对应的服务代理对象,如果不存在就新建,如果存在且Service端口被修改过,则先删除Iptables中和该Service相关的的规则,关闭服务代理对象,然后走新建流程,即为该SerViCe端口分配服务代理对象并为该Service创建相关的Iptables规则。(3)更新负载均衡器组件中对应Service的转发地址表,对于新建的Service,确定转发时的会话保持策略。(4)对于已经删除的SerViCe则进行清理。MasterKube-p

16、roxy与APIServer的交互过程4 .外部到内部的访问Pod作为基本的资源对象,除了会被集群内部的Pod访问,也会被外部使用。服务是对一组功能相同Pod的抽象,以它为单位对外提供服务是最合适的粒度。由于Service对象在ClusterIPRange池中分配到的IP只能在内部访问,所以其他Pod都可以无障碍地访问到它。但如果这个SerViCe作为前端服务,准备为集群外的客户端提供服务,就需要外部能够看到它。Kubernetes支持两种对外服务的Service的Type定义:NodePort和1.oadBalancero(1)NodePort在定义Service时指定spec.type=NodePort,并指定spec.ports.nodePort的值,系统就会在Kubernetes集群中的

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 通信/电子 > 室内分布

copyright@ 2008-2023 yzwku网站版权所有

经营许可证编号:宁ICP备2022001189号-2

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!