【问题标题】:Can't change kafka broker-id in Incubator Helm chart?无法在 Incubator Helm 图表中更改 kafka broker-id?
【发布时间】: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 更改为123,用于我设置的不同代理。

我做错了什么?更改 kafka-broker id 或使所有代理连接到一个 Zookeeper 实例的正确方法是什么?

【问题讨论】:

  • 您在说明或图表变量中的哪些地方看到经纪商 ID 是可覆盖的?即使您尝试设置它,也会尝试为每个代理设置相同的值。此外,单个 Kubernetes 或 Kafka 集群应该扩展区域......您是指可用区吗?
  • configurationOverrides 变量的默认值为 { "confluent.support.metricsenable": false },正如我们在可配置参数中看到的那样,该变量的描述类似于 Kafka configuration setting 以字典格式覆盖 .单击“配置设置”将我们带到 kafka 代理配置页面,该页面同时具有 zookeepeer.connectbroker.id
  • 拉伸区域是一项要求。区域会非常简单,我知道使用多区域 GKE 集群很重要。 ????
  • 关于更改代理 ID,我假设最重要的是,当我们将 pod 副本增加到 2 个或更多时,所有代理都会连接到一个 Zookeeper。所以不知何故,这意味着brokerid正在改变,对吧?我说得对吗?
  • 1) 在文档中,If unset, a unique broker id will be generated 2) The broker id is set by the pod name,您不应该在外部设置它,否则。 3)我没有在 k8s 上使用 Kafka 的经验,但我会先考虑使用 Strimzi 而不是孵化器图表

标签: kubernetes apache-kafka google-kubernetes-engine apache-zookeeper kubernetes-helm


【解决方案1】:

让所有代理连接到一个 Zookeeper 实例?

您似乎可以通过configurationOverrides 选项做到这一点。这将部署具有相同配置的所有 pod。

话虽如此,每个 pod 的代理 ID 不应该相同。如果您检查 statefulset YAML,似乎 the broker ID is calculated based on the POD_NAME variable


旁注

3 个 GKE 集群都位于我尝试安装 Kafka 代理节点的不同区域,以便所有节点都连接到一个 Zookeeper 服务器

我不清楚如何在一次 API 调用中部署到 3 个单独的集群。但是,Kafka、Zookeeper 或 Kubernetes 社区不推荐这种架构,除非这些区域“地理位置相近”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-11-14
    • 2020-05-03
    • 1970-01-01
    • 2022-07-06
    • 2018-11-03
    • 1970-01-01
    • 2021-06-28
    相关资源
    最近更新 更多