Skip to main content
 首页 » 编程设计

kubernetes之如何使用多个 Google Kubernetes Engine (GKE) 集群制作多区域 Kafka/Zookeeper 集群

2025年05月04日221haluo1

我有 3 个 GKE 集群,位于 Google Cloud Platform 的 3 个不同区域。 我想创建一个 Kafka 集群,每个区域(每个 GKE 集群)都有一个 Zookeeper 和一个 Kafka 节点(代理)。

这种设置是为了在区域故障中幸存下来(我知道整个 GCP 区域出现故障是罕见的,而且极不可能)。

我正在尝试使用此设置 Helm Chart由孵化器提供。

我在 this guide 之后的 3 个 GCP VM 上手动尝试了此设置我能够毫无问题地做到这一点。

然而,在 Kubernetes 上设置 Kafka 集群似乎很复杂。

正如我们所知,我们必须在每个 zookeeper 配置文件中提供所有 zookeeper 服务器的 IP,如下所示:

... 
# list of servers 
server.1=0.0.0.0:2888:3888 
server.2=<Ip of second server>:2888:3888 
server.3=<ip of third server>:2888:3888 
... 

正如我在 Helm 图表中看到的那样 config-script.yaml文件有一个脚本,可以为每个部署创建 Zookeeper 配置文件。

回显 zookeeper 服务器的脚本部分如下所示:

... 
for (( i=1; i<=$ZK_REPLICAS; i++ )) 
do 
   echo "server.$i=$NAME-$((i-1)).$DOMAIN:$ZK_SERVER_PORT:$ZK_ELECTION_PORT" >> $ZK_CONFIG_FILE 
done 
... 

截至目前,此 Helm 图表创建的配置在具有一个副本的配置中具有以下 Zookeeper 服务器(副本 此处表示 Kubernetes Pods 副本)。

... 
# "release-name" is the name of the Helm release 
server.1=release-name-zookeeper-0.release-name-zookeeper-headless.default.svc.cluster.local:2888:3888 
... 

至此,我一头雾水,不知如何是好,让所有的Zookeeper服务器都包含在配置文件中?

我该如何修改脚本?

请您参考如下方法:

我看到您正在尝试在 3 个不同的 GKE 集群之上创建 3 节点 zookeeper 集群。

这不是一件容易的事,我相信有多种方法可以实现它 但我会向您展示一种实现方法,我相信它应该可以解决您的问题。

您需要做的第一件事是为每个 zookeeper 实例创建一个 LoadBalancer 服务。 创建 LoadBalancer 后,记下分配的 ip 地址 (请记住,默认情况下这些 IP 地址是临时的,因此您可能希望稍后将它们更改为静态地址)。

接下来要做的是创建一个 private DNS zone 在 GCP 上并为每个 zookeeper LoadBalancer 端点创建 A 记录,例如:

release-name-zookeeper-1.zookeeper.internal. 
release-name-zookeeper-2.zookeeper.internal. 
release-name-zookeeper-3.zookeeper.internal. 

在 GCP 中它看起来像这样:

完成后修改this line即可:

... 
DOMAIN=`hostname -d' 
... 

像这样:

... 
DOMAIN={{ .Values.domain }} 
... 

并记住将 Values 文件中的 domain 变量设置为 zookeeper.internal

所以最后它应该是这样的:

DOMAIN=zookeeper.internal 

它应该生成以下配置:

... 
server.1=release-name-zookeeper-1.zookeeper.internal:2888:3888 
server.2=release-name-zookeeper-2.zookeeper.internal:2888:3888 
server.3=release-name-zookeeper-3.zookeeper.internal:2888:3888 
... 

如果有帮助请告诉我