Kubernetes Headless Service的概念和应用

在某些应用场景中,客户端应用不需要通过Kubernetes 内置Service 实现的负载均衡功能,或者需要自行完成对服务后端各实例的服务发现机制,或者需要自行实现负载均衡功能,此时可以通过创建一种特殊的名为“Headless” 的服务来实现。

Headless Service 的概念是这种服务没有入口访问地址(无ClusterIP 地址),kube-proxy 不会为其创建负载均衡转发规则,而服务名(DNS域名)的解析机制取决于该Headless Service 是否设置了Label Selector。

1. Headless Service 设置了Label Selector

如果Headless Service 设置了Label Selector ,Kubernetes 则将Label Selector 查询后端Pod 列表,自动创建Endpoint 列表,将服务名(DNS域名)的解析机制设置为:当客户端访问该服务名时,得到的是全部Endpoint 列表(而不是一个确定的IP地址)。

以下面的Headless Service 为例,其设置了Label Selector:

apiVersion: v1
kind: Service
metadata: 
  name: nginx
  labels: 
    app: nginx
spec: 
  ports: 
  - port: 8080
  clusterIP: None
  selector: 
    app: nginx

创建该Headless Service:

[root@k8s-master ~]# kubectl create -f nginx-headless-service.yaml 
service/nginx created

假设在集群中已经运行了2个副本nginx deployment ,查看他们的Pod IP 地址:

[root@k8s-master ~]# kubectl get pod -o wide
NAME                                READY   STATUS    RESTARTS        AGE   IP               NODE         NOMINATED NODE   READINESS GATES
nginx-deployment-64775df955-dzjps   1/1     Running   11 (3d1h ago)   36d   10.244.140.125   k8s-node-2   <none>           <none>
nginx-deployment-64775df955-jk28d   1/1     Running   11 (3d1h ago)   36d   10.244.109.121   k8s-node-1   <none>           <none>

查看该Headless Service 的详细信息,可以看到后端Endpoint 列表:

[root@k8s-master ~]# kubectl describe svc nginx
Name:              nginx
Namespace:         default
Labels:            app=nginx
Annotations:       <none>
Selector:          app=nginx
Type:              ClusterIP
IP Family Policy:  SingleStack
IP Families:       IPv4
IP:                None
IPs:               None
Port:              <unset>  8080/TCP
TargetPort:        8080/TCP
Endpoints:         10.244.109.121:8080,10.244.140.125:8080
Session Affinity:  None
Events:            <none>

用nslookup 工具对Headless Service 名称尝试域名解析,将会看到DNS 系统返回的全部Endpoint 的IP地址,例如:

[root@k8s-master ~]# nslookup nginx.default.svc.cluster.local
Server:		169.169.0.100
Address:	169.169.0.100#53

Name: nginx.default.svc.cluster.local
Address: 10.244.109.121
Name: nginx.default.svc.cluster.local
Address: 10.244.140.125

当客户端通过DNS 服务名“nginx“(或其FQDN 全限定域名“nginx..svc.cluster.local”)和服务端口号访问该Headless 服务(URL=nginx:80) 时,将得到Service 后端Endpoint 列表10.244.109.121:8080 ,10.244.140.125:8080 ,然后由客户端程序自行决定如何操作,例如通过轮询访问各个Endpoint。

2. Headless Service 没有设置Label Selector

如果Headless Service 没有设置Label Selector,则Kubernetes 将不会自动创建对应的Endpoint 列表,DNS 系统会根据下列条件尝试对该服务名设置DNS 记录:
(1)如果Service 的类型为ExTernalName ,则对服务名的访问将直接被DNS 系统转换为Service 设置的外部名称(externalName)。
(2)如果系统中存在与Service 同名的Endpoint 定义,则服务名将被解析为Endpoint 定义中的列表,适用于ExTernalName类型的Service。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝颜~岁月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值