我有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服务器都包含在配置文件中?
我应该如何修改脚本?
答案 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.
完成后,只需修改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
...
让我知道它是否有帮助