闲聊

作为第一篇技术博客,我准备从k8s的service(svc)开始,因为这个东西困扰我很久了,所以我准备将其弄懂。因为还没有完成工作就来写博客摸鱼的我真的是太棒了。由于是技术小白,所以内容经供参考且不保真,建议还是去阅读权威的博客比较好。

为什么需要SVC?

今天偶然看了一篇知乎上的文章感觉说的非常的好,一切的技术都是从实践中来的,总是学原理的东西而不去知道这个东西为什么或者在哪里使用无疑是不太合适的。就像我寒假硬啃c++ primer plus的时候觉得要死了,但是当实际工作中需要用到譬如虚函数啊函数指针的过程中才发现“哦原来是这样的”,所以我们为什么要svc呢?

  • 因为k8s集群中的pod经常挂掉,故而对于同一个服务你不能通过访问固定ip的方式去访问它。所以我们需要一个前台去代理这些服务,而这个代理就是svc。通过访问svc就能够去访问到pod里面的服务
  • 负载均衡,如果对于同一个服务我们有很多个pod与其连接,那当我们访问svc的时候,如果总是访问后端的某个pod而其他pod都在偷懒的话就非常的不好了。所以svc也会根据负载均衡算法发访问流量均衡的转发到后端的pod上

既然说到svc和pod互相连接了,那就会遇到一个概念endpoint,笔者认为endpoint就是svc和pod相互连接的一个抽象概念。endpoint保存在etcd中,访问endpoint就能够知道svc和哪些pod互相连接。

svc的类型

svc主要有三种,CluserIP,NodePort和LoadBalancer。下面来分别介绍三个内容

ClusterIP

  • 一句话概述:虚拟的服务 IP 地址,该地址用于 Kubernetes 集群内部的 Pod 访问, 在 Node 上 kube-proxy 通过设置的 iptables 规则进行转发;

总的来说,可以将ClusterIP抽象成svc在集群内具有一个虚拟IP,该IP是集群中可见(集群外部是看不到的),集群中的pod访问这个VIP,就可以访问到svc所代理的pod中的服务

NodePort

  • 一句话概述:使用宿主机的端口,使能够访问各 Node 的外部客户端通过 Node 的 IP 地址和端口号就能访问服务

NodePort是可以被集群外发现的,其本质是将每个节点而指定端口(target port)和svc关联起来,这样我在集群外访问NodeIP:port就可以直接重定向到服务了

LoadBalancer

  • 一句话概述:使用外接负载均衡器完成到服务的负载分发,需要在spec.status.loadBalancer 字段指定外部负载均衡器的 IP 地址,通常用于公有云。

也就是说,这个时候,我们用一个外部负载均衡器关联到这个svc,比如我们用阿里云,阿里云会提供给你一个负载均衡器slb,svc就会和这个slb关联起来,访问slb ip:port就可以访问svc得到的服务,当然,负载均衡也是由外部slb完成的。

[摸一会鱼,待会在写]

[摸到了第二天,结束了失败的面试,继续写]

负载均衡

在介绍完了SVC的三种形式之后,我们来看一看负载均衡是怎么个事情。上文浅要介绍了负载均衡的概念,那么负载均衡是怎么实现的呢,以及负载均衡具体有几种方式呢?

kube-proxy实现负载均衡

推荐看这篇文章k8s网络原理,和这篇k8s clusterip 方式service负载均衡实现三种方式及原理可以作为参考

iptables

kube-proxy的一种实现方式是iptables,当svc被创建并且存储正在etcd的时候,kube-proxy会监听到etcd中的svc中并且根据svc的内容在node上创建iptables规则,当流量到达node上的时候经由iptables定义的规则进行转发。但iptables是线性表的形式,如果规则很多的话,遍历规则的时间就会过长,同时无法完成比较高级的负载均衡算法。

ipvs

ipvs基于ipset,ipvs模式下通过维护ipvs规则和ipset两种高效的数据结构,使得iptables规则不再随着service数量增加而增加,这也是ipvs模式在大规模场景下比iptables模式性能更优越的原因。

负载均衡算法

负载均衡算法指代我们用什么顺序或者规则决定当前应该选用哪个endpoint,目前的算法大概有这几种

常见的几种负载均衡算法

  • 轮询法:将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。

  • 随机法:通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。

  • 源地址哈希法:源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。

  • 加权轮询法:不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。

  • 加权随机法:与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。

  • 最小连接数法:最小连接数算法比较灵活和智能,由于后端服务器的配置不尽相同,对于请求的处理有快有慢,它是根据后端服务器当前的连接情况,动态地选取其中当前积压连接数最少的一台服务器来处理当前的请求,尽可能地提高后端服务的利用效率,将负责合理地分流到每一台服务器。

后记

第一篇博客就结束啦,看起来挺水的(咖啡还在忙于找工作写项目和谈恋爱,忙到飞起啊啊啊),后续还会有其他的内容的,敬请期待