我已经阅读了一些用Kubernetes编写的书以及文档中有关无头服务的页面的一些段落。但是我仍然不确定它的真正作用以及为什么有人会使用它。是否有人对它有很好的了解,它能完成什么以及为什么有人会使用它?
答案 0 :(得分:10)
简单地说,无头服务与默认ClusterIP服务相同,但缺少负载平衡或代理。允许您直接连接到Pod。
答案 1 :(得分:7)
让我按照我们在敏捷中的做法将这个问题分解为每个子部分。
<块引用>究竟什么是无头服务。
它用于发现单个 Pod(尤其是 IP),它允许另一个服务直接与 Pod 而不是代理交互。使用 NodePort、LoadBalancer、ExternalName 和 ClusterIP,客户端通常通过服务 (Kubernetes Services simply visually explained) 而不是直接连接到 Pod。
<块引用>它有什么作用?
要求不是像其他服务类型那样制作单个IP。我们需要服务背后的所有 pod 的 IP。
<块引用>它有哪些合法用例?
创建有状态服务。
将 RabbitMQ 或 Kafka(或任何消息代理服务)部署到 Kubernetes 需要 RabbitMQ 集群节点的有状态集。
关系数据库的部署
还有更多
一些实际操作
部署配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: app
labels:
app: server
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: nginx
image: nginx:alpine
ports:
- containerPort: 80
常规服务
apiVersion: v1
kind: Service
metadata:
name: regular-svc
spec:
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 8080
无头服务
apiVersion: v1
kind: Service
metadata:
name: headless-svc
spec:
clusterIP: None # <= Don't forget!!
selector:
app: web
ports:
- protocol: TCP
port: 80
targetPort: 8080
创建所有资源并运行 tmp pod。
k run tmp01 --image=tutum/dnsutils -- sleep infinity
k exec tmp01 -it -- /bin/sh
#=> nslookup regular-svc
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: regular-svc.moon.svc.cluster.local
Address: 10.109.150.46
#=> nslookup headless-svc
Server: 10.96.0.10
Address: 10.96.0.10#53
Name: headless-svc.moon.svc.cluster.local
Address: 172.17.0.31
Name: headless-svc.moon.svc.cluster.local
Address: 172.17.0.30
Name: headless-svc.moon.svc.cluster.local
Address: 172.17.0.32
DNS 服务器为 IPs
headless-svc.moon.svc.cluster.local
返回三个不同的 FQDN
。
注意 1: 使用 headless 服务,客户端可以通过连接到服务的 DNS 名称来连接到它的 pod,就像使用常规服务一样。但是对于无头服务,因为 DNS 返回 Pod 的 IP,客户端直接连接到 Pod,而不是通过服务代理。
注意 2: Headless 服务仍然提供跨 Pod 的负载平衡,但通过 DNS 循环机制而不是通过服务代理。
答案 2 :(得分:6)
嗯,我认为您需要一些理论。整个互联网上有很多解释(包括官方文档),但我认为Marco Luksa做到了最好:
与服务的每个连接都转发给随机选择的一个 后备箱。但是如果客户端需要连接所有这些客户端怎么办 豆荚?如果后备箱本身需要连接到所有人,该怎么办 其他的支撑豆荚。显然不是通过服务进行连接 做到这一点的方式。什么是?
要使客户端连接到所有Pod,需要确定IP 每个豆荚的一种选择是让客户致电 Kubernetes API服务器并获得Pod列表及其IP地址 通过API调用,但是因为您应该始终努力保持 与Kubernetes无关的应用,使用API服务器并不理想
幸运的是,Kubernetes允许客户端通过DNS发现pod IP 查找。通常,当您对服务执行DNS查找时,DNS 服务器返回一个IP-服务的群集IP。但是如果你告诉 Kubernetes服务不需要群集IP(您可以这样做 通过在服务规范中将clusterIP字段设置为“无”, DNS服务器将返回容器IP而不是单个服务 IP。 DNS服务器将不返回单个DNS A记录,而将返回 返回该服务的多个A记录,每个记录指向IP的IP 当时支持该服务的个人广告连播。客户可以 因此,请做一个简单的DNS A记录查找并获取所有IP的IP。 服务中包含的广告连播。然后客户可以使用 连接到一个,多个或全部信息。
将服务规范中的clusterIP字段设置为“无”, 服务无头,因为Kubernetes不会通过以下方式为其分配群集IP 哪些客户端可以连接到支持它的Pod。
Marco Luksa的“ Kubernetes在行动”
答案 3 :(得分:2)
我认为最常见的用例主要归因于StatefulSet,目前需要无头服务。何时使用{... {3}} ...