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 /]# 
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐