常见问题
使用 Kafka 过程中遇到的常见问题及对应的解决办法。
更多 Kafka 常见问题请
前往 Strimzi 官网
查看,或 [下载官方文档至本地](/zh/img/ds/Kafka faq.doc) (右键单击该链接,选择 链接存储为…
)。
遇到 “NoBrokersAvailable” 报错,如何处理?
问题描述
报错信息如下图所示。

解决办法
客户端版本错误,导致无法连接到 Kafka 集群。推荐用 Kafka 集群自带的客户端(Kafka 运行目录下的 bin 目录下的执行脚本)。
KafkaUser 资源的 Status 为空,如何处理?
问题描述
KafkaUser 资源的 Status 为空。
解决办法
请按照以下两个思路去排查和解决问题:
-
请检查 Kafka 资源和对应的 KafkaUser 资源(通过 LabelSelector 绑定)是否在同一个集群,如果不在同一个集群,请更新或重新创建资源。
-
请检查绑定 Kafka 资源和对应的 KafkaUser 资源的 LabelSelector 中是否已经正确的设置了 Label。
如何判断设置是否已经生效?
Kafka 部署中包含了较多的组件,任何一个针对实例的改动都可能会需要十几秒到几分钟的生效时间。您可以查看 Kafka.Status.conditions[0].lastTransitionTime
字段的值是否等于您最后一次修改配置的时间,来判断设置是否已经生效。Kafka 会在配置全部生效之后,更新这个时间为最后一次修改配置的时间。
TLS 连接中 SSL 握手失败,如何处理?
问题描述
在调用 producer 或者 consumer 的命令行过程中,偶尔会因为证书内置域名问题导致 SSL 握手失败,提示信息如下:
[root@mw-m1 kafka_verify]# ./bin/kafka-console-producer.sh --topic t1 --producer.config producer.config --broker-list my-cluster-kafka-external-bootstrap:9094
>[2020-09-24 11:28:52,634] ERROR [Producer clientId=console-producer] Connection to node -1 (my-cluster-kafka-external-bootstrap/10.109.110.231:9094) failed authentication due to: SSL handshake failed (org.apache.kafka.clients.NetworkClient)
[2020-09-24 11:28:52,634] WARN [Producer clientId=console-producer] Bootstrap broker my-cluster-kafka-external-bootstrap:9094 (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)
解决办法
需要通过 SSL debug 日志来辅助定位问题,可以在 cli 脚本中加入-Djavax.net.debug=ssl
来启用 ssl debug 日志。示例如下:

缺少 Clusterrole 导致 Kafka 集群创建失败,如何处理?
问题描述
由于缺少 Clusterrole,导致 Kafka 集群创建失败。
解决办法
在部署集群之后创建资源之前,需要手工创建两个 clusterrole(strimzi-entity-operator 和 strimzi-kafka-broker),用于被 Operator 绑定。
-
strimzi-entity-operator 的定义如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-entity-operator labels: app: strimzi rules: - apiGroups: - "kafka.strimzi.io" resources: # The entity operator runs the KafkaTopic assembly operator, which needs to access and manage KafkaTopic resources - kafkatopics - kafkatopics/status # The entity operator runs the KafkaUser assembly operator, which needs to access and manage KafkaUser resources - kafkausers - kafkausers/status verbs: - get - list - watch - create - patch - update - delete - apiGroups: - "" resources: - events verbs: # The entity operator needs to be able to create events - create - apiGroups: - "" resources: # The entity operator user-operator needs to access and manage secrets to store generated credentials - secrets verbs: - get - list - create - patch - update - delete
-
strimzi-kafka-broker 的定义如下:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: strimzi-kafka-broker labels: app: strimzi rules: - apiGroups: - "" resources: # The Kafka Brokers require "get" permissions to view the node they are on # This information is used to generate a Rack ID that is used for High Availability configurations - nodes verbs: - get
KafkaConnect 和 KafkaMirrorMaker/KafkaMirrorMaker2 因为连接不上 Kafka 导致启动失败,如何处理?
问题描述
通过检查发现因为无法链接 Kafka 集群,导致 KafkaConnect 和 KafkaMirrorMaker 启动失败,错误日志如下:
2020-09-27 03:02:31,641 ERROR Stopping due to error (org.apache.kafka.connect.cli.ConnectDistributed) [main]
org.apache.kafka.connect.errors.ConnectException: Failed to connect to and describe Kafka cluster. Check worker's broker connection and security properties.
at org.apache.kafka.connect.util.ConnectUtils.lookupKafkaClusterId(ConnectUtils.java:64)
at org.apache.kafka.connect.util.ConnectUtils.lookupKafkaClusterId(ConnectUtils.java:45)
at org.apache.kafka.connect.cli.ConnectDistributed.startConnect(ConnectDistributed.java:95)
at org.apache.kafka.connect.cli.ConnectDistributed.main(ConnectDistributed.java:78)
Caused by: java.util.concurrent.ExecutionException: org.apache.kafka.common.errors.TimeoutException: Call(callName=listNodes, deadlineMs=1601175751636) timed out at 1601175751637 after 1 attempt(s)
at org.apache.kafka.common.internals.KafkaFutureImpl.wrapAndThrow(KafkaFutureImpl.java:45)
at org.apache.kafka.common.internals.KafkaFutureImpl.access$000(KafkaFutureImpl.java:32)
at org.apache.kafka.common.internals.KafkaFutureImpl$SingleWaiter.await(KafkaFutureImpl.java:89)
at org.apache.kafka.common.internals.KafkaFutureImpl.get(KafkaFutureImpl.java:260)
at org.apache.kafka.connect.util.ConnectUtils.lookupKafkaClusterId(ConnectUtils.java:58)
... 3 more
解决办法
这个错误可能是因为网络策略不允许通信导致,可以在当前的命名空间下创建对应的网络策略来允许通信。
如下示例中的网络策略允许访问同一命名空间内的网络,参照示例在 Kafka 集群所在的命名空间中创建网络策略即可解决以上无法连通的问题。
提示:网络策略创建方式有很多种,用户可以根据使用场景来创建适合的网络策略。
命名空间允许网络策略示例:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: deny-other-namespaces
spec:
ingress:
- from:
- podSelector: {}
podSelector: {}
policyTypes:
- Ingress
Kafka User Operator/Topic Operator 反复重启,如何处理?
问题描述
Kafka User Operator/Topic Operator 反复重启。
解决办法
Kafka 对资源需求比较高,如果所在命名空间的 CPU request/limit 小于 1000mi,经常会导致部分组件因为启动超时而被反复重启。建议设置 Kafka 所在命名空间的 CPU request/limit 大于等于 1000mi。
如何设置 jvm 垃圾回收的必要参数?
参数设置示例如下:
OpenJDK 64-Bit Server VM warning: If the number of processors is expected to increase from one, then you should configure the number of parallel GC threads appropriately using -XX:ParallelGCThreads=N
start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec
创建 KafkaRebalance 后提示 InvalidResourceException,如何处理?
KafkaRebalance 简介
KafkaRebalance 的主要功能如下:
-
保证 Kafka 集群资源的均衡:磁盘、网络和 CPU。
-
如果有 broker 崩溃,自动将副本重新分配给其他 broker,并重置复制系数。
-
识别出消耗资源最多的主题分区。
-
在扩展集群或 broker 退役时只需要少量的人工介入。
-
支持异构的 Kafka 集群以及单台主机部署多个 broker 实例。
KafkaRebalance 要完成以上功能,需要从集群收集 Kafka 的度量指标和每个分区的资源度量指标,通过这些指标和相关的目标规定生成集群工作负载模型,所谓的集群工作负载模型就是集群处于平衡状态时的分区情况。
Cruise Control 就是负责从集群收集 Kafka 的度量指标和每个分区的资源度量指标,通过这些指标和相关的目标规定生成集群工作负载模型。
KafkaRebalance 根据生成的模型执行相关的操作使集群达到平衡状态。
部署 kafka 集群时会根据相关配置生成相应的度量指标和相关端口,Cruise Control 通过这个端口获取生成的度量指标。
创建 Topic 时会根据 Topic 所在的 kafka 集群配置也生成相关度量指标和端口,Cruise Control 也通过这个端口获取生成的度量指标。
所以,要想使用 KafkaRebalance 的功能,需要在 kafka 集群部署时配置 cruiseControl 属性,说明与 cruiseControl 相关的一些配置,这个时候部署的 kafka 的集群就会生成相关的度量指标和相应的 service,用于获取度量指标。
在此基础上创建的 Topic 也会生成相关的度量指标和相应的 service。
问题描述
根据以上描述导致 InvalidResourceException 异常的原因是在部署 kafka 集群时没有设置 cruiseControl 相关属性,也就是 kafka 集群无法生成相关的度量指标和相应的 service,cruiseControl 不能生成模型,KafkaRebalance 获取不到模型导致无法正常工作。
解决办法
先更新 Kafka 集群的 cruiseControl 属性,然后删除已创建的 Topic 的相关资源,重新创建 Topic 实例。