前言

环境:centos7.9 docker-ce-20.10.9 kubernetes-version v1.22.6

什么是service

在k8s中,service是用于一组pod的负载均衡和服务发现的,比如后端有6个跑着应用程序的pod,使用service就能实现对这6个pod的负载均衡分发客户端请求了,如果pod扩容了,那么service就会自动发现pod并把它加入自己的后端请求endpoint列表中。

什么是无头service

无头service就是在定义service时指定 service.spec.clusterIP:None,即没有clusterip,这就是headless service,简称无头service。
无头service也有标签选择器,有标签选择器就说明有对应的endpoint。

为什么需要无头service呢?

平时的应用一般有这样2种情况,多个应用实例之间没有区别,比如最常见的nginx反向代理到后端服务器的多个应用上,这些后端应用是没有说明区别的。但是这样情况呢,比如Redis集群,每个Redis节点都是不同的,它们之间相互通行并组成一个集群,这时我们使用普通的service向nginx那样反向代理到多个后端应用就显得不合适了。

使用无头service。如要搭建6个节点的redis集群(3主3从架构),我们定义service并不是说要让service将请求连接负载均衡分发到这6个pod,因为这6个pod的实例都是不同的,他们都跑着不同的应用。这时无头service就派上用场的,无头service没有clusterip,直接绑定具体的Pod的IP,无头service经常用于statefulset的有状态部署。

service的负载均衡

普通service的负载均衡其实是由kube-proxy实现的,kube-proxy发现普通service有clusterip,就会处理它并对它负载均衡到后端的pod上;
无头service的是没有clusterip的,这时kube-proxy发现service没有clusterIP,就不会处理它,也就没有所谓的负载均衡。

无头服务使用场景

1、无头服务用于服务发现机制的项目或者中间件,如kafka集群、Redis集群,采用的都是实例之间的IP通信。
2、无头service不会向普通service一样进行负载均衡,也不需要,既然不需要负载均衡,则就不需要Cluster IP,如果没有Cluster IP,则kube-proxy 不会处理它们, 并且kubernetes也不会给他创建负载均衡。

补充:无头service一般用于pod实例之间相互通信,不在像普通service那样负载均衡。