如何使用多个Google Kubernetes Engine(GKE)集群构建多区域Kafka / Zookeeper集群?

时间:2019-10-30 18:36:03

标签: kubernetes google-cloud-platform google-kubernetes-engine apache-zookeeper kafka-cluster

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

此设置旨在承受区域性失败的影响(我知道整个GCP区域发生故障的情况很少,而且可能性很小)。

我正在使用Incubator提供的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服务器的 echos 脚本部分如下所示:

...
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图表创建的配置在配置中带有一个副本(配置为副本这里是Kubernetes Pods replicas)的以下Zookeeper服务器。

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

我应该如何修改脚本?

1 个答案:

答案 0 :(得分:1)

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

这不是一件容易的事,我相信有多种方法可以实现它 但我将向您展示一种可以完成此操作的方法,我相信它可以解决您的问题。

您需要做的第一件事是为每个Zookeeper实例创建一个LoadBalancer服务。 创建LoadBalancers后,记下已分配的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中看起来像这样:

dns

完成后,只需修改this line

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

像这样:

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

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

让我知道它是否有帮助