Service
服务本身是为一组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
的解析记录就变为
<a>-<b>-<c>-<d>.<service>.<ns>.svc.<zone> A PodIP
# 若该Service背后由多个pod,那么每一个Pod都具有一个自己独有的解析记录
# <a>-<b>-<c>-<d>标识pod的IP
PTR
记录则变为
PodIP PTR <d>.<c>.<b>.<a>.in-addr.arpa IN PTR H<hostname>.<service>.<ns>.svc.<zone>
无头服务一般使用在Statefulset
中。
无头服务示例
-
创建配置清单
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
-
应用配置清单
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>
-
验证
# 在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
关键点
-
svc_name
的解析结果从常规Service的ClusterIP
,转为各个Pod的IP地址; -
反解,则从常规的 clusterip
解析为service name
,转为从 pod_IP 到 hostname,<a>-<b>-<c>-<d>.<service>.<ns>.svc.<zone>
-
<hostname>
指的是a-b-c-d
格式,而非Pod自己的主机名;
原文始发于微信公众号(TechOps之窗):Service Headless类型
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/286789.html