Service Headless类型

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

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

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

Headless Service作用

应用分为两类,statefulstateless

  • 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中。

无头服务示例

  1. 创建配置清单
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
  1. 应用配置清单
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>
  1. 验证
# 在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

(0)
服务端技术精选的头像服务端技术精选

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!