为什么 Kubernetes 中的 Kafka 使用无头服务,为什么不使用开箱即用的负载均衡集群 IP?

Mel*_*sen 6 load load-balancing apache-kafka kubernetes

我遇到的大多数示例都是KafkaKubernetes其部署为 aheadless service但我还无法得到答案,为什么它应该是无头的而不是Cluster IP?在我看来,集群提供了负载平衡,我们确保开箱即用的不仅是其中一个broker始终加载其资源,正如我在无头中看到的那样,Kafka无论是 sarma 还是 java 客户端,客户端都会尝试始终选择第一个 IP从DNS lookup并连接到它,如果有大约 100 多个客户端尝试执行相同操作并打开与第一个 IP 的连接,这不会成为瓶颈吗?或Kafka已经处理了这个内置的问题,我仍在尝试了解它是如何发生的。

Sha*_*k V 6

当服务的各个实例(服务于无状态应用程序的 Pod 副本)之间没有区别时,您可以将它们公开在 ClusterIP 服务下,因为连接到任何副本来服务当前请求都是可以的。有状态服务(如 Kafka、数据库等)并非如此。每个实例对其自己的数据负责。每个实例可能拥有不同的分区/主题等。服务的实例并不是精确的“副本”。在 Kubernetes 上运行此类有状态服务的解决方案通常使用无头服务和/或有状态集,以便服务的每个实例都有唯一的标识。此类有状态应用程序通常具有自己的集群技术,该技术依赖于集群中的每个实例都具有唯一的标识。

\n

既然您知道为什么有状态应用程序需要稳定的身份,以及具有无头服务的有状态集如何提供稳定的身份,您可以检查您的 Kafka 发行版如何使用它们在 kubernetes 上运行 Kafka。

\n

这篇博文解释了 strimzi 是如何做到的:

\n
\n

对于 Strimzi 用于运行 Kafka 代理 \xe2\x80\x93\n 的 StatefulSets \xe2\x80\x93,您可以使用 Kubernetes 无头服务为每个 Pod 提供\ns稳定的 DNS 名称。Strimzi 使用这些 DNS 名称作为 Kafka 代理的广告\n地址。斯特里姆齐也是如此:

\n
    \n
  • 初始连接是使用常规 Kubernetes 服务\n获取元数据来完成的。

    \n
  • \n
  • 随后的连接将使用另一个无头 Kubernetes 服务为 Pod 提供的 DNS\n名称来打开。

    \n
  • \n
\n
\n