1 无头服务概述
Service是K8S的一种抽象资源,它允许你将访问请求路由到多个Pod上。通常,Service会为Pod创建一个稳定的虚ClusterIP,并且通过这个IP来进行负载均衡。然而,有时你可能希望绕过负载均衡机制,直接访问Pod本身。在这种情况下,无头服务(Headless Service)就非常有用。
无头服务没有ClusterIP,意味着不会分配虚拟IP。在Kubernetes中,你可以通过设置ClusterIP: None来创建一个无头服务。无头服务的工作方式是直接暴露Pod的DNS记录,允许其他服务通过DNS查询来访问每个Pod,而不是通过集中的负载均衡器。
2 与普通Service的比较
特性 | 普通Service | Headless Service |
---|---|---|
ClusterIP | 有 | 没有 |
DNS记录 | 返回ClusterIP的DNS记录 | 返回每个Pod的DNS记录 |
负载均衡 | 通过负载均衡器实现 | 进行负载均衡,直接访问Pod |
应用场景 | 无状态应用,内部流量负载均衡 | 有状态应用 |

3 工作原理
DNS解析:对于无头服务,每个Pod会通过DNS创建一条A记录,记录包含Pod的IP地址。这使得其他Pod可以通过DNS直接访问到每个Pod。
没有负载均衡:无头服务不会进行负载均衡,因为每个Pod的IP地址会直接被返回,而不是通过ClusterIP来转发请求。请求直接访问Pod。
4 应用示例
使用nginx为例,不过生产环境一般不这样部署nginx,只是为了演示Headless Service的原理。
1 创建无头服务
vim nginx-headless-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx-headless
spec:
clusterIP: None # 定义无头服务
selector:
app: nginx-headless
ports:
- port: 80
targetPort: 80
应用配置
kubectl apply -f nginx-headless-svc.yaml
2、创建deployment
vim nginx-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx-headless
name: nginx-headless
spec:
replicas: 3
selector:
matchLabels:
app: nginx-headless
template:
metadata:
labels:
app: nginx-headless
spec:
containers:
- image: docker.m.daocloud.io/nginx:1.25
name: nginx
ports:
- name: http
containerPort: 80
应用配置
kubectl apply -f nginx-deploy.yaml
3、查看验证
kubectl get svc -o wdie
kubectl get pod -o wdie
kubectl get ep -o wide
从图上可以验证无头服务没有ClusterIP等原理
5 应用场景
Headless Service 常用于与 StatefulSet 配合使用。StatefulSet 是 Kubernetes 中用于管理有状态应用的工作负载,它通过为每个 Pod 分配一个稳定的标识符来维持有状态的应用。Headless Service 可以提供直接访问每个 StatefulSet 中 Pod 的方式。
典型应用:
数据库集群:MySQL、PostgreSQL、Cassandra、Elasticsearch 分布式缓存集群:Redis、Elasticsearch 集群、Zookeeper、Kafka 等
如有帮助,请点个赞和“在看”!如有不足,敬请指出!感谢你的关注与支持。
路虽远,行则将至!
事虽难,做则必成!共勉!
Linux上有趣的8个命令,你玩过几个? 万字长文:K8S命令详解汇总【自用珍藏版】 手把手教你搭建企业级Harbor镜像仓库 【Docker系列知识】常用命令大全汇总 Linux的150个常用命令汇总,运维大神不一定全部掌握! Linux文件处理三剑客详解(运维高手必备) Nginx配置文件详解及常用功能配置(实用率90%)