# 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。

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

## 创建HeadlessService

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

```yaml
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：

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