服务本身是为一组pod提供一个固定的入口,因此我们要能到达这些pod对象都要经由service ClusterIP来实现,因此配置在Service上的ClusterIP就称之为Service的头(Head),而无头服务即指没有ClusterIP的服务。

在互联网中DNS本身就具有负载均衡功能,这种无头服务是依靠DNS自身的负载均衡功能来实现的。

Service的功能是提供一个访问入口并将请求调度给后端的Pod,现在前端有CoreDNS,那我们就能将Service ClusterIP进行省略,让用户访问时使用主机名或服务名来访问,而服务名解析的结果就不到ClusterIP,而是直接到达Pod IP,像这种服务称之为无头服务。

Headless Service作用

应用分为两类,stateful和stateless。

  • stateful:每一个个体都具有一定的独特性,由其存储的状态决定。
  • stateless:每一个个体没有特定的意义,随时可以替代。

headless service在做名称解析时,每一个个体都有其Pod名称或Pod的唯一标识作为其名称来进行识别,于是这种DNS的解析记录就变为

1
2
3
<a>-<b>-<c>-<d>.<service>.<ns>.svc.<zone>   A  PodIP
# 若该Service背后由多个pod,那么每一个Pod都具有一个自己独有的解析记录
# <a>-<b>-<c>-<d>标识pod的IP

PTR记录则变为

1
PodIP   PTR   <d>.<c>.<b>.<a>.in-addr.arpa IN PTR H<hostname>.<service>.<ns>.svc.<zone>

无头服务一般使用在Statefulset中。

无头服务示例

1.创建配置清单

1
2
3
4
5
6
7
8
9
10
11
12
13
root@k8s-master01:~/yaml/chapter07# vim demoapp-headless-svc.yaml
apiVersion: v1
kind: Service
metadata:
name: demoapp-headless-svc
spec:
clusterIP: None # 无头服务和其他service的区别在于将ClusterIP置为None
selector:
app: demoapp
ports:
- name: http
targetPort: 80
port: 80

2.应用配置清单

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
root@k8s-master01:~/yaml/chapter07# kubectl apply -f demoapp-headless-svc.yaml 
service/demoapp-headless-svc created

# 查看svc
root@k8s-master01:~/yaml/chapter07# kubectl get svc demoapp-headless-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demoapp-headless-svc ClusterIP None <none> 80/TCP 39s

# 查看其后端ep是否被匹配到
root@k8s-master01:~/yaml/chapter07# kubectl describe svc demoapp-headless-svc
Name: demoapp-headless-svc
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=demoapp
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: None
IPs: None
Port: http 80/TCP
TargetPort: 80/TCP
Endpoints: 10.244.1.39:80,10.244.2.38:80,10.244.3.58:80 + 1 more...
Session Affinity: None
Events: <none>

3.验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 在pod内解析做名称解析
root@k8s-master01:~# kubectl exec demoapp-5f7d8f9847-jrfm6 -- nslookup 10-244-3-58.demoapp-headless-svc
Server: 10.96.0.10
Address: 10.96.0.10#53

Name: 10-244-3-58.demoapp-headless-svc.default.svc.cluster.local
Address: 10.244.3.58

# 反解PTR记录
root@k8s-master01:~# kubectl exec demoapp-5f7d8f9847-jrfm6 -- nslookup 10.244.3.58
58.3.244.10.in-addr.arpa name = 10-244-3-58.demoapp-externalip-svc.default.svc.cluster.local.
58.3.244.10.in-addr.arpa name = 10-244-3-58.demoapp.default.svc.cluster.local.
58.3.244.10.in-addr.arpa name = 10-244-3-58.demoapp-svc.default.svc.cluster.local.
58.3.244.10.in-addr.arpa name = 10-244-3-58.demoapp-loadbalancer-svc.default.svc.cluster.local.
58.3.244.10.in-addr.arpa name = 10-244-3-58.demoapp-service-nodeport.default.svc.cluster.local.
58.3.244.10.in-addr.arpa name = 10-244-3-58.demoapp-headless-svc.default.svc.cluster.local.
# 反解PTR记录会查询到那么多记录是因为反解的pod不光被无头服务的serivce所关联,
# 还被其他serivce匹配并关联。

headless service关键点