进哥哥看负载均衡以及在K8S上的负载均衡思考
最近遇到了负载均衡相关的东西,总结一下,有错轻喷!首先对DNS解析IP地址以及nginx proxy做一个简单介绍,然后从自己的观点来讲将服务部署在K8S集群上时,可以如何解决负载均衡?
DNS、域名
熟悉的可以跳过这部分
域名有什么用
试想,假如我们要访问因特网上某台主机的资源文件,我们需要知道它的IP地址(如10.123.11.23),然后根据IP地址去访问这台主机。IP地址对于正常人来说是很难记的,所以假如能将这个很难记的IP地址映射称一个域名(比如www.baidu.com),这将是非常人性化的。DNS就是干这么一件事情的!
我们访问www.baidu.com,DNS域名系统会将该域名映射成IP地址,然后修改数据报文对应的目的IP地址(不详细解释怎么修改,请参考网络层具体的传输方式),所以我们不用记住繁杂的IP地址就能上网冲浪。
域名和IP的对应关系
- 一个IP地址可以对应多个域名,一个域名可以对应多个IP地址
- 一个IP地址对应多个域名
- 这种情况发生在一个主机托管多个网站,这些网站的IP地址可能就是相同的。那么,当你向该主机请求网站访问的时候,主机如何知道你想访问哪个网站?首先,通过域名解析,将多个域名解析到同一个IP地址,然后在该主机上通过不同的配置让主机将来自不同域名的请求发送给对应的网站程序,比如维护了一张hash表(瞎猜的)。
- 一个域名对应多个IP地址
- 这种情况出现在访问量巨大的网站,为了解决负载均衡实现的。这也是今天我们要讲的重点:负载均衡!例如,在访问www.baidu.com这种巨型流量网站的时候,你以为只有一台服务器吗?不可能的,DNS会将该域名映射成多个IP地址,具体分配到哪个IP地址由一些自定义的算法完成?后面会讲到。
Nginx正向代理、反向代理、负载均衡
为什么要讲到Nginx?因为大多数的负载均衡都用到了类似proxy代理的方式来处理,所以这里我们大概讲一下正向代理、反向代理、以及Nginx负载均衡
正向代理
需要搞清楚三个角色:被代理角色、目标校色
不多扯概念了,直接上例子!客人到nike专卖店买了一双鞋,这里被代理的角色就是nike厂家,而这个nike专卖店就是代理,目标角色就是客户。
举一个实际的正向代理,那就是梯子了!!!比如我们无法访问google,需要找到一个可以访问国外网站的代理服务器,而我们本机是可以ping通这台代理服务器的。我们将请求发送给代理服务器,代理服务器去访问国外网站,再将结果返回给我们本机。
这就是正向代理,正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。
反向代理
对于淘宝双11,淘宝的流量是巨型的,那么淘宝是如何做到服务器正常运行呢?那就是分布式服务部署,服务部署在多台服务器。具体的流程是怎样的?
1.庞大的流量将请求数据发送给反向代理服务器,
2.反向代理服务器接收到请求后,按照一定的分发规则,将请求分发给不同的服务器处理。
反向代理特点;请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确,nginx扮演的就是一个反向代理角色
如图,上述例子是正向代理与反向代理同时存在的例子!可以自己琢磨一下
负载均衡
上面反向代理的数据分发,某种意义上来说可以理解为负载均衡。如何实现?我是这么看的,反向代理服务器内部维护一个消息队列,服务器只需要从消息队列中获取数据。达成了反向代理接受请求以及服务器处理请求的异步执行!
那么消息队列中的数据应该分发给哪个服务器呢?有常见的以下几种算法:
1.weight轮询
2.ip_hash
3.智能调整调度算法:根据服务器处理请求的时间快慢动态分配
K8S集群上的服务如何做负载均衡
类似nginx proxy的代理方式
将服务部署在K8S集群上时,我们可以指定服务的副本个数,也就是我们的pod实例个数。访问服务的所有流量都可以分发给这些Pod执行。我们可以自建一个proxy代理,该代理的公网IP与某域名www.name.com对应,内网Ip与Pod实例的Ip属于一个子网。当用户访问www.name.com的时候,DNS会将域名解析为proxy的公网IP,将公网IP加入到IP报文的目的IP地址发到proxy代理,proxy再将数据请求分发到内网上的Pod实例运行。
使用kube-dns
这种方式下,K8S集群自己提供了一个kube-proxy代理,我们不需要自建proxy代理。使用Kube提供的ip地址,利用kube-dns解析出pods的ip list,然后分发数据请求。其实过程有点类似自建proxy代理。
今天就写到这里,kube-dns方式还需要再仔细看看,本人也还没咋弄懂!它们说,名字取得要够骚才行,所以得罪了!!!!!