【K8s】Kubernetes 服务发现之 Headless Service

2024-09-11 18:50:51 浏览数 (2)

以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!

如果对您有帮助,烦请点赞、关注、转发!如果您有其他想要了解的,欢迎私信联系我~

基本介绍

在 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 即可。

0 人点赞