3

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

这种设置旨在避免区域故障(我知道整个 GCP 区域出现故障是罕见的,而且极不可能发生)。

我正在尝试使用Incubator 提供的Helm Chart进行此设置。

我按照本指南在 3 个 GCP 虚拟机上手动尝试了此设置,并且我能够毫无问题地完成此设置。

但是,在 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 replicas)。

...
# "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服务器都包含在配置文件中?

我该如何修改脚本?

4

1 回答 1

2

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

这不是一项容易的任务,我相信有多种方法可以实现它,但我将向您展示一种可以完成的方法,我相信它应该可以解决您的问题。

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

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

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

在 GCP 中它看起来像这样:

dns

完成后,只需修改这一行

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

像这样:

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

并记住将文件中的domain变量设置为Valueszookeeper.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
...

让我知道它是否有帮助

于 2019-11-05T11:57:33.340 回答