Kubernetes Kafka 到 Zookeeper - “ZooKeeperClientTimeoutException”错误

问题描述

就上下文而言,我通过 Helm 在使用 Kubernetes 的 Ubuntu 机器上本地启动 Kafka 和 Zookeeper:

  - name: kafka
    version: 12.7.3
    repository: https://charts.bitnami.com/bitnami

我已经查看了有关此错误的现有问题,但似乎没有一个与我的问题完全相关。对于这些现有问题,我看到问题似乎涉及 docker 网络或通信。但是,在我的本地设置中,我可以看到 Kafka 可以 成功与 Zookeeper 通信并启动 TCP 连接。我看到以下 tshark 日志,其中 .83 是 Kafka,.80 是 Zookeeper:

 57 118.532604170 192.168.83.83 → 192.168.83.80 TCP 74 44978 → 2181 [SYN] Seq=0 Win=64800 Len=0 MSS=1440 SACK_PERM=1 TSval=3500466016 TSecr=0 WS=128
   58 118.532617080 192.168.83.80 → 192.168.83.83 TCP 74 2181 → 44978 [SYN,ACK] Seq=0 Ack=1 Win=64260 Len=0 MSS=1440 SACK_PERM=1 TSval=1996498322 TSecr=3500466016 WS=128
   59 118.532633329 192.168.83.83 → 192.168.83.80 TCP 66 44978 → 2181 [ACK] Seq=1 Ack=1 Win=64896 Len=0 TSval=3500466016 TSecr=1996498322
   60 118.535617526 192.168.83.83 → 192.168.83.80 TCP 115 44978 → 2181 [PSH,ACK] Seq=1 Ack=1 Win=64896 Len=49 TSval=3500466019 TSecr=1996498322
   61 118.535644624 192.168.83.80 → 192.168.83.83 TCP 66 2181 → 44978 [ACK] Seq=1 Ack=50 Win=64256 Len=0 TSval=1996498325 TSecr=3500466019
   62 118.537006985 192.168.83.80 → 192.168.83.83 TCP 107 2181 → 44978 [PSH,ACK] Seq=1 Ack=50 Win=64256 Len=41 TSval=1996498326 TSecr=3500466019
   63 118.537047974 192.168.83.83 → 192.168.83.80 TCP 66 44978 → 2181 [ACK] Seq=50 Ack=42 Win=64896 Len=0 TSval=3500466020 TSecr=1996498326
   64 118.540259005 192.168.83.83 → 192.168.83.80 TCP 78 44978 → 2181 [PSH,ACK] Seq=50 Ack=42 Win=64896 Len=12 TSval=3500466024 TSecr=1996498326
   65 118.540263332 192.168.83.80 → 192.168.83.83 TCP 66 2181 → 44978 [ACK] Seq=42 Ack=62 Win=64256 Len=0 TSval=1996498330 TSecr=3500466024
   66 118.541564514 192.168.83.80 → 192.168.83.83 SMPP 86 Bind_receiver[Malformed Packet]
   67 118.541607278 192.168.83.83 → 192.168.83.80 TCP 66 44978 → 2181 [ACK] Seq=62 Ack=62 Win=64896 Len=0 TSval=3500466025 TSecr=1996498331
   68 118.541999795 192.168.83.80 → 192.168.83.83 TCP 66 2181 → 44978 [FIN,ACK] Seq=62 Ack=62 Win=64256 Len=0 TSval=1996498331 TSecr=3500466025
   69 118.542214437 192.168.83.83 → 192.168.83.80 TCP 66 44978 → 2181 [FIN,ACK] Seq=62 Ack=63 Win=64896 Len=0 TSval=3500466026 TSecr=1996498331

尽管如此,我似乎仍然在 Kafka 日志中看到以下错误

[2021-01-29 19:17:49,922] INFO Session: 0x1000031e07c0011 closed (org.apache.zookeeper.ZooKeeper)
[2021-01-29 19:17:49,922] INFO EventThread shut down for session: 0x1000031e07c0011 (org.apache.zookeeper.ClientCnxn)
[2021-01-29 19:17:49,925] INFO [ZooKeeperClient Kafka server] Closed. (kafka.zookeeper.ZooKeeperClient)
[2021-01-29 19:17:49,928] ERROR Fatal error during KafkaServer startup. Prepare to shutdown (kafka.server.KafkaServer)
kafka.zookeeper.ZooKeeperClientTimeoutException: Timed out waiting for connection while in state: CONNECTING
    at kafka.zookeeper.ZooKeeperClient.$anonfun$waitUntilConnected$3(ZooKeeperClient.scala:262)
    at kafka.zookeeper.ZooKeeperClient.waitUntilConnected(ZooKeeperClient.scala:258)
    at kafka.zookeeper.ZooKeeperClient.<init>(ZooKeeperClient.scala:119)
    at kafka.zk.KafkaZkClient$.apply(KafkaZkClient.scala:1881)
    at kafka.server.KafkaServer.createZkClient$1(KafkaServer.scala:441)
    at kafka.server.KafkaServer.initZkClient(KafkaServer.scala:466)
    at kafka.server.KafkaServer.startup(KafkaServer.scala:233)
    at kafka.server.KafkaServerStartable.startup(KafkaServerStartable.scala:44)
    at kafka.Kafka$.main(Kafka.scala:82)
    at kafka.Kafka.main(Kafka.scala)

我尝试了几件事:

  1. 如上所述,我看到 Kafka 和 Zookeeper 之间的 IP/TCP 流量似乎工作正常,所以我不认为这是潜在的路由问题。
  2. 这在 (1) 中有点暗示,但我查看了 iptables 表中的 nat 规则,这些规则似乎是正确的。 zookeeper 服务已正确 NAT 到 zookeeper pod IP。
  3. 我已经手动尝试从 Kafka pod 中运行调试命令,以再次确认它是否可以与 Zookeeper 建立端到端的连接。以下似乎有效:echo mntr | nc 10.96.85.98 2181
  4. 据我所知,我没有运行任何防火墙。完全有可能 iptables 中的某些东西阻止了另一层的工作,但我希望对此有所澄清。

解决方法

我现在有这个工作。这似乎是因为我反复关闭和​​打开集群并且没有正确清除网络状态,这可能导致某处出现某种黑洞。

这可能有点矫枉过正,但我​​最终做的只是刷新 iptables 规则并重新启动所有相关服务,例如需要特殊 docker 规则的 iptables。现在集群正在运行,我不认为重复重新创建集群。