服务本身是为一组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
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 apiVersion: v1 kind: Service metadata: name: demoapp-headless-svc spec: 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 service/demoapp-headless-svc created root@k8s-master01:~/yaml/chapter07 NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE demoapp-headless-svc ClusterIP None <none> 80/TCP 39s root@k8s-master01:~/yaml/chapter07 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 root@k8s-master01:~ Server: 10.96.0.10 Address: 10.96.0.10 Name: 10-244-3-58.demoapp-headless-svc.default.svc.cluster.local Address: 10.244.3.58 root@k8s-master01:~ 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.
headless service关键点
svc_name的解析结果从常规Service的ClusterIP,转为各个Pod的IP地址;
反解,则从常规的clusterip解析为service name,转为从podip到hostname, ---...svc.
指的是a-b-c-d格式,而非Pod自己的主机名;