版本

kafka_2.13-3.9.0

安装

单机部署

这里使用Kraft代替zookeeper的方式部署kafka,单节点的情况下可以实现运行一个进程即可,配置可以用默认或根据需求进行调整。

tar zxf kafka_2.13-3.9.0.tgz
./bin/kafka-storage.sh random-uuid
# 这里的uuid使用上面生成的内容,如果是集群方式部署,则每个节点都使用相同的uuid去初始化
./bin/kafka-storage.sh format -t  SqfZtGruT_G6fQWBCuQEbg -c ./config/kraft/server.properties
./bin/kafka-server-start.sh -daemon ./config/kraft/server.properties

集群部署

部署方式与单机的区别仅配置文件做部分调整。

主机规划

kafka1 kafka2 kafka3
10.11.200.47 10.11.200.48 10.11.200.49

解压文件

tar -zxf kafka_2.13-3.9.0.tgz -C /usr
ln -s /usr/kafka_2.13-3.9.0 /usr/kafka

编辑配置

cd /usr/kafka/config/kraft
vi server.properties

这里以10.11.200.47为例

advertised.listeners=PLAINTEXT://10.11.200.47:9092,CONTROLLER://10.11.200.47:9093
controller.listener.names=CONTROLLER
controller.quorum.voters=1@10.11.200.47:9093,2@10.11.200.48:9093,3@10.11.200.49:9093
inter.broker.listener.name=PLAINTEXT
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
listeners=PLAINTEXT://10.11.200.47:9092,CONTROLLER://10.11.200.47:9093
log.dirs=/usr/kafka/datas/broker
metadata.log.dir=/usr/kafka/datas/controller
log.retention.check.interval.ms=300000
log.retention.hours=168
log.segment.bytes=1073741824
node.id=1
num.io.threads=8
num.network.threads=3
num.partitions=3
num.recovery.threads.per.data.dir=1
offsets.topic.replication.factor=3
process.roles=broker,controller
socket.receive.buffer.bytes=102400
socket.request.max.bytes=104857600
socket.send.buffer.bytes=102400
transaction.state.log.min.isr=2
transaction.state.log.replication.factor=3
min.insync.replicas=2
default.replication.factor=3

注意:listeners用于broker本地监听使用, advertised.listeners用于客户端连接使用。因此,若要将集群暴露在公网访问,那么advertised.listeners需要配置为公网IP或域名。

其他节点配置

节点2修改如下配置,其他配置与节点1相同

node.id=2
advertised.listeners=PLAINTEXT://10.11.200.48:9092,CONTROLLER://10.11.200.48:9093
listeners=PLAINTEXT://10.11.200.48:9092,CONTROLLER://10.11.200.48:9093

节点3配置

node.id=3
advertised.listeners=PLAINTEXT://10.11.200.49:9092,CONTROLLER://10.11.200.49:9093
listeners=PLAINTEXT://10.11.200.49:9092,CONTROLLER://10.11.200.49:9093

初始化数据目录

bin/kafka-storage.sh random-uuid
EtlYelPSRZKCw3GtLJFZuA
bin/kafka-storage.sh format -t EtlYelPSRZKCw3GtLJFZuA -c /usr/kafka/config/kraft/server.properties

注意:集群部署模式下,所有节点需要使用相同的随机码进行格式化。

启动集群

在各节点依次启动

bin/kafka-server-start.sh -daemon /usr/kafka/config/kraft/server.properties

创建启动脚本

#!/bin/bash
cd `pwd`
bin/kafka-server-start.sh -daemon /usr/kafka/config/kraft/server.properties

Kraft+SASL+SCRAM部署

集群的部署和上面一致,这里主要区别在于部署认证鉴权的部分

服务端配置

vi /usr/kafka/config/kraft/server.properties

controller.quorum.voters=1@10.11.200.47:8093,2@10.11.200.48:8093,3@10.11.200.49:8093
######## 认证配置
listeners=SASL_PLAINTEXT://10.11.200.47:8092,CONTROLLER://10.11.200.47:8093
inter.broker.listener.name=SASL_PLAINTEXT
advertised.listeners=SASL_PLAINTEXT://10.11.200.47:8092
listener.security.protocol.map=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT,SSL:SSL,SASL_PLAINTEXT:SASL_PLAINTEXT,SASL_SSL:SASL_SSL
######## 认证机制 配置
sasl.enabled.mechanisms=SCRAM-SHA-512
sasl.mechanism.inter.broker.protocol=SCRAM-SHA-512
listener.name.sasl_plaintext.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="adminauth123";
######## ACL 账号限制 配置
super.users=User:admin;User:ANONYMOUS
# ACL 对于 KRaft 模式的授权方式(类名)
authorizer.class.name=org.apache.kafka.metadata.authorizer.StandardAuthorizer

这里把ANONYMOUS用户加到了超级用户里面,是因为当前Kraft集群的CONTROLL节点之间通信不支持认证模式,默认使用该账号,不添加这个账号会出现如下错误。

[2025-01-06 16:51:06,801] INFO [MetadataLoader id=1] initializeNewPublishers: the loader is still catching up because we still don't know the high water mark yet. (org.apache.kafka.image.loader.MetadataLoader)
[2025-01-06 16:51:06,805] ERROR [ControllerApis nodeId=1] Unexpected error handling request RequestHeader(apiKey=VOTE, apiVersion=1, clientId=raft-client-2, correlationId=0, headerVersion=2) -- VoteRequestData(clusterId='vXi-iuLbS0GLr_cp021e
9w', voterId=1, topics=[TopicData(topicName='__cluster_metadata', partitions=[PartitionData(partitionIndex=0, candidateEpoch=1, candidateId=2, candidateDirectoryId=stfw7wSuwgKpeViTito0TQ, voterDirectoryId=AAAAAAAAAAAAAAAAAAAAAA, lastOffsetEpoch=0, lastOffset=0)])]) with context RequestContext(header=RequestHeader(apiKey=VOTE, apiVersion=1, clientId=raft-client-2, correlationId=0, headerVersion=2), connectionId='10.11.200.47:8093-10.11.200.48:49364-0', clientAddress=/10.11.200.48, principal=User:ANONYMOUS, listenerName=ListenerName(CONTROLLER), securityProtocol=PLAINTEXT, clientInformation=ClientInformation(softwareName=apache-kafka-java, softwareVersion=3.9.0), fromPrivilegedListener=false, principalSerde=Optional[org.apache.kafka.common.security.authenticator.DefaultKafkaPrincipalBuilder@a770ef2]) (kafka.server.ControllerApis)

但是这里可以对ANONYMOUS账号进行权限控制,仅允许访问元数据,admin-user-jass鉴权文件在文中后续配置客户端鉴权信息部分会提到。

#限制ANONYMOUS账号权限
bin/kafka-acls.sh --bootstrap-server 10.11.200.47:8092  --add --allow-principal User:ANONYMOUS  --operation Read --topic __cluster_metadata --command-config config/admin-user-jaas

listener.name.sasl_plaintext.scram-sha-512.sasl.jaas.config这个配置项在server.properties中的作用是配置broker之间的通信鉴权信息,若单独配置了broker之间采用非鉴权方式PLANINTEXT通信,则理论上可以不配置该项,但若kafka启动报错,故需要像如下方式配置即可:

listener.name.sasl_plaintext.scram-sha-512.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required;

集群初始化

格式化存储时添加管理账号,每一台都要执行

bin/kafka-storage.sh random-uuid
vXi-iuLbS0GLr_cp021e9w
bin/kafka-storage.sh format -t vXi-iuLbS0GLr_cp021e9w -c /usr/kafka/config/kraft/server.properties --add-scram 'SCRAM-SHA-512=[name=admin,iterations=8192,password=adminauth123]'

启动集群

在各节点依次启动

bin/kafka-server-start.sh -daemon /usr/kafka/config/kraft/server.properties

配置客户端鉴权信息

vi config/admin-user-jaas
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="adminauth123";

后续的访问操作都需要带上鉴权文件

创建普通用户

bin/kafka-configs.sh --bootstrap-server kafka1:8092  --alter --add-config 'SCRAM-SHA-512=[password=ghca123]' --entity-type users --entity-name ghca --command-config /usr/kafka/kafka_2.13-3.9.0/config/admin-user-jaas

用户赋权

这里做测试使用权限赋予的比较大

bin/kafka-acls.sh --bootstrap-server kafka1:8092 --add --producer --allow-principal User:ghca --topic * --command-config /usr/kafka/config/admin-user-jaas
bin/kafka-acls.sh --bootstrap-server kafka1:8092 --add --consumer --allow-principal User:ghca --topic * --group * --command-config /usr/kafka/config/admin-user-jaas
bin/kafka-acls.sh --bootstrap-server  kafka1:8092 --list --operation all --command-config /usr/kafka/config/admin-user-jaas

创建普通用户鉴权信息

vim config/command_config
security.protocol=SASL_PLAINTEXT
sasl.mechanism=SCRAM-SHA-512
sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="ghca" password="ghca123";

访问测试

访问集群的时候都需要带上鉴权文件

创建主题
./bin/kafka-topics.sh --bootstrap-server kafka1:8092 --create --topic test --partitions 3 --replication-factor 3 --command-config /usr/kafka/config/command_config
查看主题
./bin/kafka-topics.sh --bootstrap-server kafka1:8092 --list --command-config /usr/kafka/config/command_config

生产消息
bin/kafka-console-producer.sh --broker-list kafka1:8092 --topic test --producer.config /usr/kafka/config/command_config
消费消息
bin/kafka-console-consumer.sh --bootstrap-server kafka1:8092  --topic test --consumer.config /usr/kafka/config/command_config --from-beginning

问题总结

当前基于Kraft的集群在仅开启PLAIN认证方式的集群时,是没有任何问题的,但是缺点就是账号密码不能灵活变动。若开启SCRAM认证集群,账号密码信息都写在集群元数据中,此时需要开启ACL,就会影响到controller节点之间的通信。我查阅了很多资料以及尝试了多种组合配置方式,只要不添加ANONYMOUS账号到超级用户里,集群就不能正常启动。因此根据资源和最终实践的结果判断,controller节点之间不支持SASL认证方式。

资料

Kafka KRaft模式探索:https://www.cnblogs.com/smartloli/p/16430041.html

ACL认证鉴权配置:https://www.cnblogs.com/Sol-wang/p/17675535.html

SASL认证鉴权配置:https://blog.csdn.net/qq_27047215/article/details/126800578

posted on 2025-11-27 16:37  lzc_jack  阅读(68)  评论(0)    收藏  举报