【发布时间】:2020-02-26 04:30:28
【问题描述】:
我有一个 Zookeeper 服务器(比如xx.xx.xx.xxx:2181)分别在一个 GCP 计算实例 VM 上运行。
我在不同区域有 3 个 GKE 集群,我试图在这些集群上安装 Kafka 代理节点,以便所有节点都连接到一个 Zookeeper 服务器 (xx.xx.xx.xxx:2181)。
我在this guide 之后的 VM 上安装了 Zookeeper 服务器,zookeeper 属性如下所示:
dataDir=/tmp/data
clientPort=2181
maxClientCnxns=0
initLimit=5
syncLimit=2
tickTime=2000
# list of servers
server.1=0.0.0.0:2888:3888
我正在使用这个Incubator Helm Chart 在 GKE 集群上部署代理。
根据README.md,我正在尝试使用以下命令进行安装:
helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator
helm install --name my-kafka \
--set replicas=1,zookeeper.enabled=false,configurationOverrides."broker\.id"=1,configurationOverrides."zookeeper\.connect"="xx.xx.xx.xxx:2181" \
incubator/kafka
错误
当我在所有三个 GKE 集群上使用上述任何一种方式进行部署时,只有一个代理连接到 Zookeeper 服务器,而其他两个 Pod 只是无限重启。
当我检查 Zookeeper 日志(在 VM 上)时,它看起来像下面这样:
...
[2019-10-30 14:32:30,930] INFO Accepted socket connection from /xx.xx.xx.xxx:54978 (org.apache.zookeeper.server.NIOServerCnxnFactory)
[2019-10-30 14:32:30,936] INFO Client attempting to establish new session at /xx.xx.xx.xxx:54978 (org.apache.zookeeper.server.ZooKeeperServer)
[2019-10-30 14:32:30,938] INFO Established session 0x100009621af0057 with negotiated timeout 6000 for client /xx.xx.xx.xxx:54978 (org.apache.zookeeper.server.ZooKeeperServer)
[2019-10-30 14:32:32,335] INFO Got user-level KeeperException when processing sessionid:0x100009621af0057 type:create cxid:0xc zxid:0x422 txntype:-1 reqpath:n/a Error Path:/config/users Error:KeeperErrorCode = NodeExists for /config/users (org.apache.zookeeper.server.PrepRequestProcessor)
[2019-10-30 14:32:34,472] INFO Got user-level KeeperException when processing sessionid:0x100009621af0057 type:create cxid:0x14 zxid:0x424 txntype:-1 reqpath:n/a Error Path:/brokers/ids/0 Error:KeeperErrorCode = NodeExists for /brokers/ids/0 (org.apache.zookeeper.server.PrepRequestProcessor)
[2019-10-30 14:32:35,126] INFO Processed session termination for sessionid: 0x100009621af0057 (org.apache.zookeeper.server.PrepRequestProcessor)
[2019-10-30 14:32:35,127] INFO Closed socket connection for client /xx.xx.xx.xxx:54978 which had sessionid 0x100009621af0057 (org.apache.zookeeper.server.NIOServerCnxn)
[2019-10-30 14:36:49,123] INFO Expiring session 0x100009621af003b, timeout of 6000ms exceeded (org.apache.zookeeper.server.ZooKeeperServer)
...
我确信我已经创建了防火墙规则来打开必要的端口,这不是问题,因为其中一个代理节点能够连接(首先到达的那个)。
在我看来,borkerID 似乎由于某种原因没有改变,这就是 Zookeeper 拒绝连接的原因。
我这样说是因为kubectl logs pod/my-kafka-n 输出如下内容:
...
[2019-10-30 19:56:24,614] INFO [SocketServer brokerId=0] Shutdown completed (kafka.network.SocketServer)
...
[2019-10-30 19:56:24,627] INFO [KafkaServer id=0] shutting down (kafka.server.KafkaServer)
...
正如我们在上面看到的,brokerId=0 表示所有 3 个集群中的所有 pod。
但是,当我执行kubectl exec -ti pod/my-kafka-n -- env | grep BROKER 时,我可以看到环境变量KAFKA_BROKER_ID 更改为1、2 和3,用于我设置的不同代理。
我做错了什么?更改 kafka-broker id 或使所有代理连接到一个 Zookeeper 实例的正确方法是什么?
【问题讨论】:
-
您在说明或图表变量中的哪些地方看到经纪商 ID 是可覆盖的?即使您尝试设置它,也会尝试为每个代理设置相同的值。此外,单个 Kubernetes 或 Kafka 集群应该扩展区域......您是指可用区吗?
-
configurationOverrides变量的默认值为{ "confluent.support.metricsenable": false },正如我们在可配置参数中看到的那样,该变量的描述类似于 Kafka configuration setting 以字典格式覆盖 .单击“配置设置”将我们带到 kafka 代理配置页面,该页面同时具有zookeepeer.connect和broker.id。 -
拉伸区域是一项要求。区域会非常简单,我知道使用多区域 GKE 集群很重要。 ????
-
关于更改代理 ID,我假设最重要的是,当我们将 pod 副本增加到 2 个或更多时,所有代理都会连接到一个 Zookeeper。所以不知何故,这意味着brokerid正在改变,对吧?我说得对吗?
-
1) 在文档中,
If unset, a unique broker id will be generated2) The broker id is set by the pod name,您不应该在外部设置它,否则。 3)我没有在 k8s 上使用 Kafka 的经验,但我会先考虑使用 Strimzi 而不是孵化器图表
标签: kubernetes apache-kafka google-kubernetes-engine apache-zookeeper kubernetes-helm