0
点赞
收藏
分享

微信扫一扫

Headless Services无头服务

zhaoxj0217 2022-11-17 阅读 104

一、Headless Services介绍

Headless Services是一种特殊的service,其spec:clusterIP表示为None,这样在实际运行时就不会被分配ClusterIP。也被称为无头服务。

1、headless Service和普通Service的区别

headless不分配clusterIP

headless service可以通过解析service的DNS,返回所有Pod的地址和DNS(statefulSet部署的Pod才有DNS)

普通的service,只能通过解析service的DNS返回service的ClusterIP

2、statefulSet和Deployment控制器的区别

statefulSet下的Pod有DNS地址,通过解析Pod的DNS可以返回Pod的IP

deployment下的Pod没有DNS

3、普通Service解析service的DNS结果

Service的ClusterIP工作原理:一个service可能对应一组endpoints(所有pod的地址+端口),client访问ClusterIP,通过iptables或者ipvs转发到Real Server(Pod)。

二、Headless Services使用场景

第一种:自主选择权,有时候client想自己决定使用哪个Real Server,可以通过查询DNS来获取Real Server的信息

第二种:headless service关联的每个endpoint(也就是Pod),都会有对应的DNS域名;这样Pod之间就可以互相访问

headless services一般结合StatefulSet来部署有状态的应用,比如kafka集群,mysql集群,zk集群等

三、为什么要用headless service+statefulSet部署有状态应用?

1.headless service会为关联的Pod分配一个域

<service name>.$<namespace name>.svc.cluster.local

2.StatefulSet会为关联的Pod保持一个不变的Pod Name

statefulset中Pod的hostname格式为

(pod序号)

3.StatefulSet会为关联的Pod分配一个dnsName

$<Pod Name>.$<service name>.$<namespace name>.svc.cluster.local

无头服务有一个很重要的场景是发现所有的pod(包括未就绪的pod)

因为只有准备就绪的pod能够作为服务的后端。但有时希望即使pod没有准备就绪,服务发现机制也能够发现所有匹配服务标签选择器的pod。

kind: Service 
metadata:
annotations:
service.alpha.kubernetes.io/tolerate-unready-endpoints: "true"

所以,一般中间件(如zk集群)的pod之间需要互相识别之后,进行选举状态才会变为就绪,使用无头服务完美的解决这个问题。

举报

相关推荐

0 条评论