什么是无头服务,它做什么/完成什么,以及它的一些合法用例是什么?

我读了一些关于库伯内特和 文档中的无头服务页面的书中的一些段落。但我还是不确定它到底有什么用,为什么有人会用它。有没有人对它有一个很好的理解,它完成了什么,为什么有人会使用它?

62913 次浏览

我觉得你需要一些理论。整个互联网上有许多解释(包括官方文件) ,但我认为马可•卢克萨(Marco Luksa)做得最好:

每个到服务的连接都被转发到一个随机选择的连接 但是如果客户端需要连接到所有这些 如果后台吊舱本身需要将每个吊舱连接到所有 另一个后备吊舱。通过服务连接显然不是 - 做这件事的方法-什么方法?

对于一个连接到所有吊舱的客户端,它需要计算出 IP 一种选择是让客户端调用 Kubernetes API 服务器,并得到豆荚和他们的 IP 地址列表 通过 API 调用,但是因为您应该始终努力保持 应用程序库伯内特-不可知论者,使用 API 服务器并不理想

幸运的是,Kubernetes 允许客户通过 DNS 发现豆荚 IP 通常,当您为服务执行 DNS 查找时,DNS 服务器返回一个单独的 IP ーー服务的集群 IP Kubernetes 您的服务不需要集群 IP (您可以这样做 通过在服务规范中将 ClusterIP 字段设置为 Nothing) , DNS 服务器将返回豆荚 IP,而不是单一的服务 DNS 服务器将不会返回单个 DNS A 记录 返回服务的多个 A 记录,每个记录指向 一个单独的吊舱支持此时的服务。客户可以 因此,做一个简单的 DNS 记录查找,并获得所有的 IP 地址 这是服务的一部分,客户端可以使用它 信息连接到一个,许多,或全部。

将服务规范中的 ClusterIP 字段设置为 Nothing 将使 服务头,因为库伯内特不会分配它一个集群 IP 通过 客户可以连接到后面的吊舱。

“库伯内特在行动”马可 · 卢克萨

简单地说,无头服务默认的 ClusterIP 服务是一样的,但是 缺乏负载平衡或代理允许您直接连接到一个 Pod。

让我把这个问题分解成每个子部分,就像我们在敏捷中所做的那样。

无头服务到底是什么。

它用于发现单独的 Pods (特别是 IP) ,允许其他服务直接与 Pods 交互,而不是代理。使用 NodePort负载平衡器外部名称和 ClusterIP 客户机通常通过服务(库伯内特服务公司简单直观的解释)连接到吊舱,而不是直接连接。

它能达到什么目的?

要求不要像其他服务类型那样制造单个 IP。我们需要所有分离舱的 IP 地址都在服务器后面。

它的一些合法用例是什么?

  • 创建状态服务。

  • 将 RabbitMQ 或 卡夫卡(或任何消息代理服务)部署到 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 服务器为 headless-svc.moon.svc.cluster.local FQDN返回三个不同的 IPs

注一: 通过使用无头服务,客户端可以通过连接到服务的 DNS 名称来连接到它的 pods,就像使用常规服务一样。但是对于 headless 服务,因为 DNS 返回 pods 的 IP,客户端直接连接到 pods,而不是通过服务代理。

注二: 无头服务仍然通过 pods 提供负载平衡,但是是通过 DNS 循环机制而不是通过服务代理。