什么是无头服务,它能完成/完成什么工作,合法的用例有哪些?

时间:2018-10-08 18:04:39

标签: kubernetes

我已经阅读了一些用Kubernetes编写的书以及文档中有关无头服务的页面的一些段落。但是我仍然不确定它的真正作用以及为什么有人会使用它。是否有人对它有很好的了解,它能完成什么以及为什么有人会使用它?

4 个答案:

答案 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}} ...