Kubernetes重要概念:无头服务详解

艺帆风顺 发布于 2025-04-07 19 次阅读


1 无头服务概述

Service是K8S的一种抽象资源,它允许你将访问请求路由到多个Pod上。通常,Service会为Pod创建一个稳定的虚ClusterIP,并且通过这个IP来进行负载均衡。然而,有时你可能希望绕过负载均衡机制,直接访问Pod本身。在这种情况下,无头服务(Headless Service)就非常有用。

无头服务没有ClusterIP,意味着不会分配虚拟IP。在Kubernetes中,你可以通过设置ClusterIP: None来创建一个无头服务。无头服务的工作方式是直接暴露Pod的DNS记录,允许其他服务通过DNS查询来访问每个Pod,而不是通过集中的负载均衡器。

2 与普通Service的比较

特性普通ServiceHeadless 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 等

如有帮助,请点个赞和“在看”!如有不足,敬请指出!感谢你的关注与支持。

路虽远,行则将至!

事虽难,做则必成!共勉!


往期精彩文章