根据Headless服务定义:
Kubernetes允许客户端通过DNS查找来发现pod ip。通常,当您对服务执行DNS查找时,DNS服务器返回单个IP,即该服务的集群IP。但是如果您的服务不需要集群IP,您可以将ClusterIP设置为None,那么DNS服务器将返回单个pod IP而不是服务IP。然后客户端可以连接到它们中的任何一个
看起来类似于用一个后端pod创建一个clusterIP。如果是这样,我们为什么要将clusterIP与一个后端pod一起使用呢?
您通常无法控制Pod的名称,并且您不能保证总是恰好是一个匹配的Pod。
有几个标准的原因不直接创建pod,而是依赖于更高级的结构。部署可以实现零停机升级;statfulset管理关联的PersistentVolumeClaims;作业失败时可以重试。Pod一旦创建就不能编辑,所以你需要在任何更新时删除并重新创建Pod。如果您使用的是部署,您将拥有像deployment-name-12345678-abcde
这样的Pod名称,但您根本不控制结束部分。Service会给你一个一致的名字。
在升级过程中,replicas:
的数量不一定完全符合要求。默认情况下,部署将创建一个额外的Pod,等待它通过就绪检查,然后拆除旧的Pod;在这种情况下,关联的服务将正确路由流量。另一种选择是先拆掉旧的豆荚。在这两种情况下,你可以有零个或两个匹配的pod,而不是只有一个。
如果你决定增加副本计数,将服务作为标准模式也会有所帮助;例如,您可以选择运行多个副本,以便在某个节点发生故障时获得额外的弹性。无论你只有一个Pod还是多个Pod,通过Service进行通信的方式都是完全相同的。
有区别。Headless服务的DNS查找返回的IP地址与运行的pod一样多,而ClusterIP服务的DNS查找总是只返回一个IP地址。所以,是的,如果你只有一个Pod,那么Headless服务可能就足够了。但是,如果您有多个pod,则对于Headless服务,客户机必须实现某种负载平衡,而对于ClusterIP, kubernetes将执行负载平衡。有多个pod的Headless服务的一个用例是当你想向每个pod发送请求时,例如本地缓存耗尽。