以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!
如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~
基本介绍
在 Kubernetes 中,Headless Service(无头服务)是一种特殊的服务发现机制,允许用户直接访问集群中的 Pod 实例,而不是通过单一的 ClusterIP 负载均衡到 Endpoint(Pod)。
Headless Service 接收的请求不需要经过 kube-proxy 转发,也不会有负载均衡和路由规则。
Headless Service 适用场景如下:
- 有状态应用:Headless Service 可以提供稳定的访问能力,最常用的就是结合 StatefulSet 部署有状态应用,使其拥有固定的 Pod 名称和 PVC 名称
- 分布式系统:需要直接与集群中的每个 Pod 实例进行通信,如分布式数据库或分布式缓存
- 测试和调试:需要直接访问集群中特定的 Pod 实例进行调试
工作原理
- 无单一 IP:Headless Service 不会为 Service 对象分配单一的 ClusterIP 地址,而是为 Service 对象的每个 Pod 分配一个 DNS 记录(格式为 {pod_name}.{service_name}.{namespace}.svc.cluster.local)
- DNS 解析:当使用 Headless Service 的名称进行 DNS 查询时,Kubernetes 的 DNS 服务会返回所有 Pod 的 IP 地址列表,而不是单一的 ClusterIP
- 服务选择:Headless Service 使用选择器(Selector)来确定哪些 Pod 属于该 Service,与标准 Service 对象的工作方式相同
- 无端口映射:Headless Service 不会自动进行端口映射,需要在 Service 对象的资源清单中明确指定端口
资源清单(示例)
代码语言:javascript复制# demo-servcie.yaml
apiVersion: v1
kind: Service
metadata:
name: demo-service
spec:
selector:
app: web
type: ClusterIP
clusterIP: None # 关键点,字段值必须设置为 None
ports:
- name: http
protocol: TCP
port: 80
targetPort: 8080
从资源清单可见,若将一个 ClusterIP 类型的 Service 对象定义为 Headless Service,只需要指定其 clusterIP 字段的值为 None 即可。