我正在通过SSL传输Kafka的流量。我们在每个地区都有两个集群。
使用Kafka 2.7.0版。
除了一个群集外,所有区域和所有群集都可以通过SSL正常工作。
在其他工具中,我使用kafkacat
来探测集群。
当通过纯文本连接对此群集执行kafkacat -L
时,它将列出所有代理、主题和分区,并显示每个分区的领导者:
# kafkacat -b kafka-cluster1-kafka-brokers.domain.com:9092 -L | head
Metadata for all topics (from broker -1: kafka-cluster1-kafka-brokers.domain.com:9092/bootstrap):
4 brokers:
broker 1 at kafka-cluster1-kafka-1.domain.com:9092 (controller)
broker 4 at kafka-cluster1-kafka-4.domain.com:9092
broker 2 at kafka-cluster1-kafka-2.domain.com:9092
broker 3 at kafka-cluster1-kafka-3.domain.com:9092
49 topics:
topic "topic.name" with 4 partitions:
partition 0, leader 3, replicas: 3,2,1, isrs: 1,2,3
partition 1, leader 1, replicas: 1,3,4, isrs: 1,3,4
通过SSL执行相同的命令时,kafkacat
会找到:
- 0个经纪人
1.列出主题和分区,但不列出前导
# kafkacat -b kafka-cluster1-kafka-brokers.domain.com:9093 -X security.protocol=SSL -X ssl.endpoint.identification.algorithm=none -X enable.ssl.certificate.verification=false -L | head
Metadata for all topics (from broker -1: ssl://kafka-cluster1-kafka-brokers.domain.com:9093/bootstrap):
0 brokers:
49 topics:
topic "topic_name" with 4 partitions:
partition 0, leader -1, replicas: 3,2,1, isrs: 1,2,3, Broker: Leader not available
partition 1, leader -1, replicas: 1,3,4, isrs: 1,3,4, Broker: Leader not available
partition 2, leader -1, replicas: 4,1,2, isrs: 1,2,4, Broker: Leader not available
partition 3, leader -1, replicas: 2,4,3, isrs: 2,3,4, Broker: Leader not available
对该区域中的其他集群使用相同的命令,无论是通过明文还是通过SSL,都可以完美地工作。inter.broker.protocol
和与Zookeeper集群的通信是PLAINTEX. SSL目前只用于与Kafka客户端通信.还没有使用身份验证,客户端也不验证服务器的证书.
集群是使用Packer for AMI和Terraform进行部署的,这都是自动的。我已经检查了三遍,这个集群的配置与其他集群没有什么不同。
使用的证书是由Let 's Encrypt颁发的。我甚至尝试从该区域中的其他群集复制证书,这工作正常,但我仍然得到相同的结果。
除了主机名之外,使用SSL的群集和不使用SSL的群集之间的配置是相同的。
还有什么能引起如此古怪的行为呢?
编辑:更多的调查显示,此集群上Kafka代理的Zookeeper记录缺少SSLMap:
{"features":{},"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT"},"endpoints":["PLAINTEXT://kafka-cluster1-kafka-1.domain.com:9092"],"rack":"ap-southeast-2a","jmx_port":9999,"port":9092,"host":"kafka-cluster1-kafka-1.domain.com","version":5,"timestamp":"1628554957052"}
与“健康”群集相对:
{"features":{},"listener_security_protocol_map":{"PLAINTEXT":"PLAINTEXT","SSL":"SSL"},"endpoints":["PLAINTEXT://kafka-cluster2-kafka-1.domain.com:9092","SSL://kafka-cluster2-kafka-1.domain.com:9093"],"rack":"ap-southeast-2a","jmx_port":9999,"port":9092,"host":"kafka-cluster2-kafka-1.domain.com","version":5,"timestamp":"1626842428002"}
当我们停止代理时,Zookeeper记录被删除,但当我们启动它时,它显示相同的错误内容。
代理的server.properties
文件过去不包含listener.security.protocol
行,因为我们需要默认值,但即使像这样取消注解它也没有什么区别:
listener.security.protocol.map=PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
所以现在的问题是-Kafka从哪里得到它放在Zookeeper记录中的信息?
1条答案
按热度按时间d7v8vwbk1#
问题是Kafka动态配置是在该集群上设置的,并覆盖了文本文件中设置的“静态”配置。
其他没有此问题的集群的此记录为空。删除坏集群的if修复了此问题,
kafkacat
开始通过SSL工作,与对PLAINTEXT的工作相同。要删除的命令:
其中,
x
是集群中的每个broker.id
。