Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于容器的服务发现与负载均衡

基于容器的服务发现与负载均衡

作者头像
技术zhai
发布于 2022-03-14 07:26:54
发布于 2022-03-14 07:26:54
1.4K0
举报
文章被收录于专栏:JAVA技术zhaiJAVA技术zhai

曾在Google广告部门任职,负责广告的架构任务,14年回国同年9月创立数人云,主要基于Docker容器技术为企业级客户打造私有的PaaS平台,帮助企业客户解决互联网新业务挑战下的IT问题。

今天主要分享三个议题,首先是Google数据中心的简单介绍:Google的数据中心约有200万台服务器且都是X86PC服务器,Google的数据中心没有买任何大、小型机,完全使用廉价的PC服务器搭建,因规模庞大,对网络的要求非常高,包括交换机都是自己设计后定制的。服务发现、负载均衡的问题,对于Google的量级来说非常复杂,今天跟大家分享下Google内部如何实现服务发现和负载均衡。

静态的服务发现方式其实很好理解——基于IP地址和端口做服务发现,应用程序绑定了服务器的IP地址和端口之后,有请求发到这个IP地址和端口上,应用程序就可以接收到相应的请求。

经典的负载均衡器也是绑定某个特定的IP地址和端口,同时负载均衡器将需要做负载均衡的应用实例预先配置好,当负载均衡器收到请求后即可分发给后台的应用实例。

用IP地址+端口的方式做服务发现对人不友好,因为IP地址不好记忆,所以人们又发明了DNS作为非常经典的服务发现方式。

DNS实现的是域名解析,比较常用的DNS解析方式是A记录:向DNS查询某个域名的A记录会返回该域名对应的一个或多个IP地址,上图展示了向DNS查询某个域名的A记录返回IP地址的例子,给定一个域名,通过查询DNS服务器返回来这个域名所对应的一个IP地址。

另外一种DNS解析方式SRV记录,这是DNS里面实现更高级的服务发现的一种方式,向DNS查询某个域名的SRV记录要返回该域名对应的一对或多对地址和端口,如上图所示,向DNS查询一个域名地址,DNS返回了该域名对应的一系列地址和端口。

DNS除了具有服务发现功能,也可以实现负载均衡的功能,如上图所示,DNS可以根据用户的请求动态的返回某域名的A记录,比如DNS返回的A记录是目前最不繁忙的实例的IP地址,这样DNS就可以实现负载均衡功能。

静态环境下的负载均衡是最常见的负载均衡器使用场景。如上图所示,用户的请求发给负载均衡器,负载均衡器根据一定的策略,如轮转策略或者按照一定的权重把收到的请求分发给后面具体的应用实例,应用实例在处理完请求后把响应返回给负载均衡器,然后负载均衡器再把请求响应返回给最终用户。

常见的负载均衡器支持四层和七层协议,具体讲就是TCP协议和HTTP协议。四层负载均衡器,按照TCP协议来说是实现了一种路由转发:一个TCP请求数据包经过四层负载均衡器时,负载均衡器只修改这个TCP请求数据包的目的地址然后转给后面的应用实例;当负载均衡器收到应用实例返回的TCP响应数据包时,会修改这个TCP响应数据包的目的地址然后返回给用户。

七层负载均衡器和四层负载均衡器的工作原理不一样;当七层负载均衡器收到一个用户的HTTP请求数据包会把该请求包拆掉,然后封装成一个新的HTTP请求数据包传给后面的应用实例;当负载均衡器收到应用实例返回的HTTP响应数据包时,会把HTTP响应数据包拆掉然后重新封装一个新的HTTP响应数据包返回给用户。所以四层和七层负载均衡器的工作原理不同,四层类似于路由转发,七层则是完全重新封装的包。

常见的服务发现方式有三种,分别适用于同的TCP协议或HTTP协议。第一种是用IP地址+端口或者域名+端口的方式做服务发现,比如,“website.com:8080”代表一个应用,“website.com:8081”代表另一个应用,虽然这两个应用的域名相同。这种方式适用于四层和七层协议,即TCP及HTTP协议都可以用。

第二种是子域名的方式,仅适用于七层协议。子域名的方式是指不同的应用可能有共同的根源,但是有不同的子域名,比如,http://service1.zone1.website.comhttp://service2.zone1.website.com,这两个不同的域名(访问端口都是80)),有共同的根域名website.com,但是子域名不同,因此七层协议,比如HTTP协议,会通过不同的子域名解析到不同的应用。

第三种是子路径的方式,也仅适用于七层协议。比如,http://zone1.website.com/service1http://zone1.website.com/service2,这两个路径的域名完全一样,但是子路径不一样,可以用于区分不同的应用服务。

这三种服务发现方式其实总结下来只有IP地址或者域名+端口是同时适用于四层、七层,其他如子域名、子路径的方式只适用于七层服务发现。

上述都是非常经典的负载均衡、服务发现的基本概念和做法,但当数据中心规模达到一定程度时,应用和服务器之间或更确切地说应用和具体IP地址+端口之间就不再是静态的绑定关系。

如Google的数据中心里面大约有200万台服务器,如果Google的应用和服务器之间是一一对应的静态绑定关系:即某个应用程序必须要绑在某一个服务器上,或是绑定某个服务器的IP地址+端口上,那么对Google来说,每时每刻大概会有几百万到上千万个应用程序运行在200多万台服务器,这样静态管理应用和服务器会非常复杂。所以对于Google如此大规模的数据中心来讲必须用动态的管理,即要求应用不能静态绑定在服务器的IP地址+端口上,应用可以在不同的服务器之间动态迁移来实现故障自愈:程序运行在某一个服务器上,这个服务器宕机或程序有问题,该程序会被自动迁移到别的服务器上恢复运行。动态的应用调度管理方式可以使得应用的管理及服务器的管理进行解耦,即应用和服务器之间不再是静态的绑定关系。

动态环境下如何做负载均衡和服务发现?首先把问题明确下,动态环境最根本的一点是要把服务发现实现,即客户端要找到服务的后台,它从哪里找?这就是服务发现。在动态环境下如何做到?其实并不复杂,每个服务的后台实例绑定的IP地址和端口注册到一个服务注册中心,注册的方式可以是被动注册也可以是主动注册,被动注册是指负责应用调度的调度器来完成应用实例的IP地址+端口注册;主动注册是指每一个服务的实例要主动的上报自己目前所绑定的IP地址+端口。

有了动态服务注册的机制后,动态环境下的负载均衡也就好实现了。在动态环境下,当负载均衡器收到一个请求后,会去服务注册中心进行查询相应的应用的实例地址,然后把请求路由到该应用的后台实例上。

Google内部的服务发现和负载均衡外面看不到,数人云借鉴Google的理念实现了Swan(Github地址:https://github.com/Dataman-Cloud/swan),Swan基于Mesos来做容器化应用的动态调度,同时Swan实现了DNS和Proxy支持服务发现和负载均衡,跟Google的方式几乎一模一样,所以后面用Swan作例子给大家分享下Google怎么做服务发现和负载均衡。

先讲一下如何给应用命名,这在动态的应用调度和运行的环境下非常总要,因为经典的应用发现方式都是按照IP和端口,没有对应用有统一的命名,但是Google对于每个应用、每个实例都会有相应的命名。首先明确几个概念:

一个实例,是应用的某个Task,运行在一个容器里,应用会包含多个Task,都是运行同样的二进制程序;

一个应用,是一组运行同样二进制程序的实例集合,每个实例是这个应用的某个Task;

一个服务可以是一组应用程序;

一个服务会由一个用户在某个集群上发起运行。

Swan给每个实例用五个标签来命名,task-app-service-user-cluster,task是从0开始的连续整数,用于标识不同实例;相应地Swan给每个应用四个标签来命名,app-service-user-cluster;进而,Swan给每个服务用是三个标签来命名,service-user-cluster。

Swan实现了DNS用于服务发现,就是Swan DNS把Swan调度的每一个实例所绑定的IP地址+端口的信息都记录下来,或是A记录或是SRV记录。

对于每个应用,Swan的DNS也生成一个相应的域名用于四层服务发现,即 app.service.user.cluster.swan.com。另外,七层的应用Swan Prox会解析应用的另外一个域名http://app.service.user.cluster.gateway.swan.com用于七层应用的服务发现和负载均衡。

上图是Swan架构的一个示意图,简单解释了Swan、DNS、Proxy之间的关系:如何通过Swan对应用动态调度后实现服务发现和负载均衡。举个例子,首先Swan发布一个应用app-app-service-user-cluster,包含三个实例分别是:0-app-service-user-cluster,1-app-service-user-cluster,2-app-service-user-cluster;当Swan把三个实例都运行起来后,Swan会把三个实例目前运行时所绑定的IP+端口信息提交给Swan DNS。比如我们可以访问Swan DNS去解析app.service.user.cluster.swan.com这个域名,会解析出来三个容器的实例;当用户的请求访问app.service.user.cluster.gateway.swan.com,该请求会送达到Swan Proxy上,因为Swan Proxy地址是gateway.swan.com,Swan Proxy采用子域名的方式解析app.service.user.cluster。Swan Proxy解析这个地址时会查Swan DNS,查这个应用所对应的实例,每一个实例分别在哪个IP+端口上。Swan Proxy查询了Swan DNS之后,发现后面它有三个实例,这三个实例分别在不同的IP和端口上。当Swan Proxy收到对这个应用请求时会分别往后面三个实例上进行分发。

上图详细地解析了Swan DNS如何做服务发现,展示的是Swan DNS里面的A记录,图里对应的A纪录是nginx-demo.default.xcm.beijing.swan.com应用,应用名称叫nginx-demo,属于default这个服务,用户名是xcm,default这个服务目前运行在beijing这个数据中心里,swan.com作为一个后缀去表示,完整的表示出这是Swan的内网域名。A纪录展现出来这个应用有6个实例,每个实例都在192.168.1.196的IP地址上。

上图是Swan DNS的SRV记录,SRV记录和A记录不一样的地方是A记录只返回域名的IP地址,SRV记录要返回域名的IP地址+端口。上图所示的SRV查询结果包含了6个不同的应用实例,分别在不同的端口上,6个不同的实例又在同一个IP地址上:192.168.1.196,但它们绑定的端口不一样,从31000、31001、301002、301003、301004、301005、31006。

Swan实现了Proxy用于负载均衡。先讲一下Swan Proxy如何支持七层负载均衡。Swan Proxy支持子域名方式实现七层负载均衡。前面提到过,用户的HTTP请求发往app.service.user.cluster.gateway.swan.com这个域名地址时,先是.gateway.swan.com解析到Swan Proxy的IP地址上,然后因为Swan Proxy针对HTTP协议做解析的时候它会解析HTTP协议里面的域名,这个域名的子域名就是app.service.user.cluster,也就是这个域名里面的前缀。按照这个前缀,Swan Proxy可以区分出该HTTP请求是要访问哪个具体的应用。Swan Proxy在做HTTP这个服务发现负载均衡的时候会支持会话保持,也会支持HTTPS。但是Swan Proxy不支持HTTP子路径方式,因为子路径的方式本质上讲不是一种负载均衡的方式,子路径其实和应用所提供的不同服务相关的,所以具体的子路径服务的注册方式需要用额外的,比如微服务自身的服务发现支持,比如SpringCloud里面的Eurake或者阿里的Dubbo这些服务注册中心来做子路径方式的服务注册。

再讲一下Swan Proxy对于四层的负载均衡。因为四层协议,比如TCP协议,的特殊性,Swan Proxy支持的TCP协议只能是端口方式,根据一个Swan Proxy的IP或者Swan Proxy的域名,加上不同的端口来区分不同的应用。Swan Proxy在对TCP进行负载均衡的时候也会支持会话保持。

最后汇总下Swan的服务发现、负载均衡方式。结合容器目前的几种网络模式:Bridge方式、Host方式还有固定IP的方式,上图给出Swan在不同容器的网络模式下如何做服务发现、负载均衡。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
浅谈负载均衡
负载均衡,英文:Load Balance,其含义是请求分发到多个粒度单元上进行执行操作,例如各种服务器、应用服务、中台服务、数据服务等,从而达到共同完成某项任务的目的。为了拓宽网络设备和服务器的带宽、增加吞吐量、加强网络请求处理能力、提高网络的灵活性和高可用性,负载均衡是一种廉价、有效、透明的方法,它为服务的高并发做了一次缓冲,让单个服务的压力瞬间减少,实现了服务的高可用,避免服务因为压力而面临宕机的危险。
程序猿Damon
2020/05/25
6940
FastDFS蛋疼的集群和负载均衡(十二)之浅谈负载均衡
Interesting things 学习负载均衡技术。 What did you do today 什么是负载均衡? 一台普通服务器的处理能力是有限的,假如能达到每秒几万个到几十万个请求,
用户2032165
2018/06/05
1.3K0
Kubernetes服务发现之Service详解
Kubernetes Pod 是有生命周期的,它们可以被创建,也可以被销毁,然后一旦被销毁生命就永远结束。通过ReplicationController 能够动态地创建和销毁Pod(列如,需要进行扩缩容,或者执行滚动升级);每个Pod都会获取它自己的IP地址,即使这些IP地址不总是稳定可依赖的。这会导致一个问题;在Kubernetes集群中,如果一组Pod(称为backend)为其他Pod(称为frontend)提供服务,那么哪些frontend该如何发现,并连接到这组Pod中的那些backend呢?
kubernetes中文社区
2019/06/24
1.3K0
Kubernetes服务发现之Service详解
负载均衡(SLB)基础入门学习笔记
5) 安全性区别说明,例如网络中最常见的SYN Flood攻击,使用虚假IP地址对同一目标发送SYN攻击,通常这种攻击会大量发送SYN报文,耗尽服务器上的相关资源,以达到Denial of Service(DoS)的目的;
全栈工程师修炼指南
2022/09/28
6.8K0
负载均衡(SLB)基础入门学习笔记
玩转企业集群运维管理系列(一):负载均衡基础入门
在这之前,我们相继卷完了:关系型数据库 MySQL 、 NoSQL 数据库 Redis 、 MongoDB 、搜索引擎 ElasticSearch 、大数据 Hadoop框架、PostgreSQL 数据库、消息中间件 Kafka、分布式协调中间件 Zookeeper、消息中间件 RabbitMQ、企业级监控平台、企业常用应用与服务等这些系列的知识体系。
民工哥
2023/12/02
7040
玩转企业集群运维管理系列(一):负载均衡基础入门
负载均衡
负载均衡,英文名Load Balance,作用是将操作分摊到多个执行单元上执行。随着如今网络流量的不断增大,服务的负载均衡是必须的,这里就来讲一讲负载均衡的结构。 说到负载均衡,同学最容易想到的可能就是nginx了,但是nginx只是其中的一层,而负载均衡从我们发送一个请求时可能就开始了,下面是一个负载均衡流程:
battcn
2018/08/03
6.1K0
负载均衡
集群、分布式、负载均衡区别
  计算机集群通过一组松散集成的计算机软件和/或硬件连接起来高度紧密地协作完成计算工作。在某种意义上,他们可以被看作是一台计算机。集群系统中的单个计算机通常称为节点,通常通过局域网连接,但也有其它的可能连接方式。集群计算机通常用来改进单个计算机的计算速度和/或可靠性。一般情况下集群计算机比单个计算机,比如工作站或超级计算机性能价格比要高得多。   比如单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束后,将结果汇总,返回给用户,系统处理能力得到大幅度提高。一般分为几种:
BUG弄潮儿
2020/06/15
1.7K0
集群、分布式、负载均衡区别
linux负载均衡总结性说明(四层负载/七层负载)
在常规运维工作中,经常会运用到负载均衡服务。负载均衡分为四层负载和七层负载,那么这两者之间有什么不同? 废话不多说,详解如下: 一,什么是负载均衡 1)负载均衡(Load Balance)建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。负载均衡有两方面的含义:首先,大量的并发访问或数据流量分担到多台节点设备上分别处理,减少用户等待响应的时间;其次,单个重负载的运算分担到多台节点设备上做并行处理,每个节点设备处理结束
洗尽了浮华
2018/01/23
3.7K0
linux负载均衡总结性说明(四层负载/七层负载)
6-Kubernetes入门基础之服务发现Service介绍
描述: K8s中的Service实际上是微服务框架中的微服务,Service定义了一个服务的访问入口,可以通过该入口访问其背后一组的有Pod副本组成的集群实例;
全栈工程师修炼指南
2022/09/29
2.8K0
6-Kubernetes入门基础之服务发现Service介绍
开源负载均衡史话:12000+字详解现代网络负载均衡与代理,最清晰!
https://blog.envoyproxy.io/introduction-to-modern-network-load-balancing-and- proxying-a57f6ff80236
灵雀云
2020/09/23
1.3K0
开源负载均衡史话:12000+字详解现代网络负载均衡与代理,最清晰!
做负载均衡,你得先了解这些
实现负载均衡可以从硬件和软件两方面着手,在硬件上我们可以使用F5等负载均衡器,在软件上我们可以使用LVS、Nginx、HaProxy等负载均衡软件。使用硬件性能强悍,使用软件灵活智能。不过,不管是从硬件层面还是从软件层面去解决负载均衡,其原理不外乎以下几点:
用户2781897
2020/09/01
1.1K0
Envoy: modern Cloud Load Balancing 现代云负载均衡
我印象中负载均衡其实是个硬件设备。其实一开始确实是的,然而现在已经不同了。尤其是云厂商提供的负载均衡方案几乎全部是靠软件。现在的负载均衡不仅是网络流量复杂均衡,几乎所有的平衡多个计算资源负载的方案都可以叫做负载均衡。在云计算背景下,负载均衡其实有一个软件实体--proxy。准确说,他们其实是不一样的,但是不能否认他们的功能其实重叠,proxy将网络转发作为主要功能。并且在所有的service mesh、cloud的资料中,这两个词指的就是同一个东西。
s09g
2022/07/06
4710
Envoy: modern Cloud Load Balancing 现代云负载均衡
网络四层、七层负载均衡的区别
区别 所谓七层负载均衡,也称为“内容交换”,也就是主要通过报文中的真正有意义的应用层内容,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。 以常见的TCP为例,负载均衡设备如果要根据真正的应用层内容再选择服务器,只能先代理最终的服务器和客户端建立连接(三次握手)后,才可能接受到客户端发送的真正应用层内容的报文,然后再根据该报文中的特定字段,再加上负载均衡设备设置的服务器选择方式,决定最终选择的内部服务器。负载均衡设备在这种情况下,更类似于一个代理服务器。负载均衡和前端的客户端以及后端的服务器会分别建立TCP连接。所以从这个技术原理上来看,七层负载均衡明显的对负载均衡设备的要求更高,处理七层的能力也必然会低于四层模式的部署方式。
sunsky
2021/01/27
9500
网络四层、七层负载均衡的区别
Kubernetes 的服务发现与负载均衡(Service)
Service通常会和Deployment结合在一起使用,首先通过Deployment部署应用程序,然后再使用 Service 为应用程序提供服务发现、负载均衡和外部路由的功能。
马凌鑫
2018/09/26
3.6K0
Nginx---负载均衡和缓存
早期的网站流量和业务功能都比较简单,单台服务器足以满足基本的需求,但是随着互联网的发展,业务流量越来越大并且业务逻辑也跟着越来越复杂,单台服务器的性能及单点故障问题就凸显出来了,因此需要多台服务器进行性能的水平扩展及避免单点故障出现。那么如何将不同用户的请求流量分发到不同的服务器上呢?
大忽悠爱学习
2021/12/07
1.8K0
Nginx---负载均衡和缓存
SpringBoot应用使用k8s的服务发现
2. 最近工信部新闻大家看了吧,所有的APP以及小程序需要在024年3月31日前完成备案。所以涉及到的朋友需要提前准备呀。详情地址如下:
希里安
2023/10/30
6120
SpringBoot应用使用k8s的服务发现
【万字长文】吃透负载均衡
更多干货内容,请关注公众号:高性能架构探索。回复【pdf】更有计算机经典资料免费获取
高性能架构探索
2021/10/27
7470
Kubernetes(K8s)基础知识(docker容器技术)
  一个目标:容器操作;两地三中心;四层服务发现;五种Pod共享资源;六个CNI常用插件;七层负载均衡;八种隔离维度;九个网络模型原则;十类IP地址;百级产品线;千级物理机;万级容器;相如无亿,K8s有亿:亿级日服务人次。
sunsky
2020/08/20
6680
Kubernetes(K8s)基础知识(docker容器技术)
四层和七层负载均衡的区别
(一) 简单理解四层和七层负载均衡: ① 所谓四层就是基于IP+端口的负载均衡;七层就是基于URL等应用层信息的负载均衡;同理,还有基于MAC地址的二层负载均衡和基于IP地址的三层负载均衡。 换句换说,二层负载均衡会通过一个虚拟MAC地址接收请求,然后再分配到真实的MAC地址;三层负载均衡会通过一个虚拟IP地址接收请求,然后再分配到真实的IP地址;四层通过虚拟IP+端口接收请求,然后再分配到真实的服务器;七层通过虚拟的URL或主机名接收请求,然后再分配到真实的服务器。 ② 所谓的四到七层负载均衡,就是在
小小科
2018/05/02
1.1K0
四层和七层负载均衡的区别
四层、七层负载均衡1
七层负载均衡:负载均衡器与客户端及后端的服务器会分别建立一个TCP连接。即两次TCP连接。
随心助手
2019/10/15
1K0
四层、七层负载均衡1
相关推荐
浅谈负载均衡
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档