HeadlessService

HeadlessService是指spec.clusterIP=None的Service资源。

该资源创建的Service对象不具备ClusterIP,因此,通常用来让集群内的Pod发现该Service后端的所有已经Ready的Pod(除非将Service的spec.publishNotReadyAddresses为true)。

在Kubernetes集群中,kube-dns服务后端的coredns的Pod会为每个Service对象创建一个属于它们的FQDN(全限定域名):Service名.namespace名.svc.cluster.local,因此集群内的Pod可以通过向HeadlessService的FQDN请求访问DNS A记录,进而获得HeadlessService后端的所有Pod。

Tips: 在Kubernetes集群中,通常将提供相同功能的一组Pod由同一个Service暴露出统一的访问IP,同时创建一个HeadlessService用于这组Pod内部之间发现彼此。因此,HeadlessService不是用来暴露统一访问IP的。

创建HeadlessService

通过将Service的spec.clusterIP置为None,可以创建出HeadlessService。下面展示一个例子:

apiVersion: v1
kind: Service
metadata:
  name: kubia-headless
spec:
  clusterIP: None    # 此处设为None,表示创建的是一个HeadlessService
  publishNotReadyAddresses: true    # 默认为false,若为true,则会将非Ready的Pod也加入Endpoint列表中
  ports:
  - port: 80
    targetPort: 8080
  selector:
    app: kubia

通过HeadlessService发现Pod

Pod可以通过DNS A记录发现HeadlessService后端的Pod列表。

想获取DNS A记录,可以通过nslookup命令。

因为在之前提到,集群内的每个Service都有自己的FQDN,因此可以在集群内的任何一个Pod使用下面的命令获取名为kubia-headless的HeadlessService后端的Pod:

nslookup kubia-headless
# 或
nslookup kubia-headless.default
# 或
nslookup kubia-headless.default.svc
# 或
nslookup kubia-headless.default.svc.cluster.local

Last updated

Was this helpful?