k8s_day04 _03
k8s_day04 _03特殊类型的服务:headless服务service 的作用 就是 为一组pod提供固定的访问入口,并且能调度请求到后端pod 上。这个head主要指的是访问入口 cluster-ipheadless服务 指的就是 cluster-ip 为null 的服务。如果cluster-ip没有了 ,svc_name 如何解析呢?dns 本身 就具有一定意义的负载均衡功能。 可以让
k8s_day04 _03
特殊类型的服务:headless 服务
service 的作用 就是 为一组pod 提供固定的访问入口,并且能调度请求到后端pod 上。 这个head主要指的是访问入口 cluster-ip
headless 服务 指的就是 cluster-ip 为null 的服务。
如果cluster-ip 没有了 ,svc_name 如何解析呢?
dns 本身 就具有一定意义的负载均衡功能。 可以让 kube-dns 把service-name 直接解析到pod-ip , 通过dns 轮询 给后端pod 。但是dns 解析是有缓存的 ,所以解析并不是时实的,可能导致每次被调度的都是同一个pod, 所以它负载均衡功能就没有那么理想 , 为啥还需要这种服务呢?
statefulset 要逐一识别后端 服务的对象, stateful 类型的对象(称为 宠物,而不是鸡鸭可替代) ,不具有被同类别对象替换的可能性。 headless 的作用就是让 stateful的每个个体都有唯一被识别的名称
【在实现主机名称解析的时候,每一个个体都有pod 名称 或者pod 的唯一标识作为其名称 来进行识别】
无状态的应用的名字 都是 无序无意义的如 hwxrb s9jvq 。 有状态的应用都是 有特定标识 序号的 如 1 2 3 4
demoapp-5f7d8f9847-hwxrb 1/1 Running 3 4d1h
demoapp-5f7d8f9847-s9jvq 1/1 Running 4 3d21h
demoapp-5f7d8f9847-vwdpc 1/1 Running 4 3d21h
demoapp2-677db795b4-65h2f 1/1 Running 3 3d12h
headless 服务 和有cluster-ip的service 一样 ,同样有3种类型的解析记录 A 、srv 、ptr
eg:
定义的资源格式
和之前的并没有什么不同,只不过clusterIP 显示定义为 None
[root@node01 chapter7]# cat demoapp-headless-svc.yaml
# Maintainer: MageEdu <mage@magedu.com>
# URL: http://www.magedu.com
---
kind: Service
apiVersion: v1
metadata:
name: demoapp-headless-svc
spec:
clusterIP: None
selector:
app: demoapp
ports:
- port: 80
targetPort: 80
name: http
[root@node01 chapter7]#
验证CLUSTER-IP 值
[root@node01 chapter7]# kubectl get svc/demoapp-headless-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
demoapp-headless-svc ClusterIP None <none> 80/TCP 41s
查看匹配的ep
[root@node01 chapter7]# kubectl describe ep/demoapp-headless-svc
Name: demoapp-headless-svc
Namespace: default
Labels: service.kubernetes.io/headless=
Annotations: endpoints.kubernetes.io/last-change-trigger-time: 2021-12-09T15:06:09Z
Subsets:
Addresses: 10.244.4.36,10.244.4.38,10.244.5.26
NotReadyAddresses: <none>
Ports:
Name Port Protocol
---- ---- --------
http 80 TCP
Events: <none>
[root@node01 chapter7]#
一、 解析 sevice_name
正解
[root@demoapp-5f7d8f9847-s9jvq /]# nslookup -query=A demoapp-headless-svc
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: demoapp-headless-svc.default.svc.cluster.local
Address: 10.244.4.38
Name: demoapp-headless-svc.default.svc.cluster.local
Address: 10.244.5.26
Name: demoapp-headless-svc.default.svc.cluster.local
Address: 10.244.4.36
[root@demoapp-5f7d8f9847-hwxrb /]# nslookup -query=A 10-244-5-26.demoapp-nodeport-svc.default.svc.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: 10-244-5-26.demoapp-nodeport-svc.default.svc.cluster.local
Address: 10.244.5.26
解析类型
<a>-<b>-<c>-<d>.<service>.<ns>.svc.<zone> A PodIP
svc_name的解析结果从常规Service的ClusterIP,转为各个Pod的IP地址;
二、反解析
[root@demoapp-5f7d8f9847-hwxrb /]# nslookup -query=PTR 10.244.5.26
Server: 10.96.0.10
Address: 10.96.0.10#53
26.5.244.10.in-addr.arpa name = 10-244-5-26.demoapp-loadbalancer-svc.default.svc.cluster.local.
26.5.244.10.in-addr.arpa name = 10-244-5-26.demoapp-headless-svc.default.svc.cluster.local.
26.5.244.10.in-addr.arpa name = 10-244-5-26.demoapp-nodeport-svc.default.svc.cluster.local.
26.5.244.10.in-addr.arpa name = 10-244-5-26.demoapp-svc.default.svc.cluster.local.
为什么 有这么多条 记录 是 因为demoapp-5f7d8f9847-hwxrb 被3个其他svc 关联, 创建demoapp-headless-svc时,会发生反解,不但将当前pod 的ip 反解析 为 demoapp-headless-svc 服务名称 ,还会反解析到其他关联的service名称。 如果没有创建它,是不会生存其他的svc的
记录类型
PodIP PTR
<d>.<c>.<b>.<a>.in-addr.arpa IN PTR <hostname>.<service>.<ns>.svc.<zone>
特殊类型的服务:ExternalName 服务
叫 外部服务名称
主要作用就是 将集群外部服务引入到集群内部中来, 能实现常规服务一样的名称解析、服务发现 等功能。但是它资源记的维护和常规不一样 , 既不用标签选择器关联任何对象,也无须任何端口或者端点,但是必须得在服务的定义当中,但是必须使用externalname 定义CNAME 记录 用于返回真正提供提供服务的别名
传统的方式 向 coredns 请求请求名称解析 ,得到的要么是 clsuter-ip 要么是pod-ip.
ExternalName 则是 请求解析svc_name 得到的是CNAME 。 这CNAME 必须能在外部dns 被解析,通常是互联网上的dns 可以解析的服务
eg:
[root@node01 chapter7]# cat externalname-redis-svc.yaml
kind: Service
apiVersion: v1
metadata:
name: externalname-redis-svc
namespace: default
spec:
type: ExternalName
externalName: redis.ik8s.io
ports:
- protocol: TCP
port: 6379
targetPort: 6379
nodePort: 0
selector: {}
selector: {} 加不加都行 表示没有任何标签条件
发现它的external-ip 是 redis.ik8s.io
[root@node01 chapter7]# kubectl get svc/externalname-redis-svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
externalname-redis-svc ExternalName <none> redis.ik8s.io 6379/TCP 67s
在同ns的任一个po 中解析
[root@demoapp-5f7d8f9847-hwxrb /]# nslookup -query=CNAME externalname-redis-svc
Server: 10.96.0.10
Address: 10.96.0.10#53
externalname-redis-svc.default.svc.cluster.local canonical name = redis.ik8s.io.
[root@demoapp-5f7d8f9847-hwxrb /]# nslookup -query=CNAME externalname-redis-svc.default.svc.cluster.local
Server: 10.96.0.10
Address: 10.96.0.10#53
externalname-redis-svc.default.svc.cluster.local canonical name = redis.ik8s.io.
[root@demoapp-5f7d8f9847-hwxrb /]#
能正确解析表示 外部dns 正常
[root@demoapp-5f7d8f9847-hwxrb /]# nslookup -query=A externalname-redis-svc
Server: 10.96.0.10
Address: 10.96.0.10#53
externalname-redis-svc.default.svc.cluster.local canonical name = redis.ik8s.io.
Name: redis.ik8s.io
Address: 1.2.3.4
[root@demoapp-5f7d8f9847-hwxrb /]#
更多推荐
所有评论(0)