kerberos认证下kafka报错Bootstrap broker host:ip (id: -1 rack: null) disconnected

开启了kerberos认证后kafka运行kafka-console-producer.sh和kafka-console-consumer.sh报错
Bootstrap broker host:ip (id: -1 rack: null) disconnected (org.apache.kafka.clients.NetworkClient)

编辑$KAFKA_HOME/config/ 下的producer.properties和consumer.properties文件,在末尾添加认证方式

sasl.mechanism=GSSAPI
security.protocol=SASL_PLAINTEXT
sasl.kerberos.service.name=kafka

运行脚本时指定配置文件

bin/kafka-console-producer.sh --broker-list host:ip --topic test --producer.config config/producer.properties

bin/kafka-console-consumer.sh --bootstrap-server host:ip --topic test --from-beginning --consumer.config config/consumer.properties
你已经将 `bootstrap-servers` 配置为使用主机名(`kafka-broker1`, `kafka-broker2`, `kafka-broker3`),这是使用 **Kerberos 安全认证** 的前提条件之一。接下来,你需要确保这些主机名能够在你的客户端环境中正确解析,并且 Kafka broker 配置了相应的 Kerberos principal 和监听地址。 --- ## ✅ 下一步:验证并配置 Kerberos 客户端环境 ### 1. 确保 DNS 或 `/etc/hosts` 解析正常 #### Linux / Mac: 编辑 `/etc/hosts` 文件: ```bash sudo vi /etc/hosts ``` 添加如下内容: ``` 25.45.48.105 kafka-broker1 25.45.48.191 kafka-broker2 25.45.49.19 kafka-broker3 ``` #### Windows: 编辑 `C:\Windows\System32\drivers\etc\hosts` 文件,添加同样的内容。 --- ### 2. 验证主机名是否能解析为 IP 地址 使用命令验证: ```bash ping kafka-broker1 ping kafka-broker2 ping kafka-broker3 ``` 如果能正常 ping 通,说明 DNS 或 hosts 配置成功。 --- ## ✅ 下一步:配置 Kerberos 客户端环境 你需要确保 Kerberos 客户端环境配置正确,以便 Kafka 客户端能够使用 keytab 文件进行认证。 ### 1. 安装 Kerberos 客户端 #### Linux(Ubuntu/Debian): ```bash sudo apt-get install krb5-user ``` #### Linux(CentOS/RHEL): ```bash sudo yum install krb5-workstation ``` #### Windows: 安装 [MIT Kerberos for Windows](https://web.mit.edu/kerberos/dist/) 或使用 Windows 自带的 Kerberos--- ### 2. 配置 `krb5.conf` 在 `/etc/krb5.conf`(Linux)或 `C:\ProgramData\MIT\Kerberos5\krb5.ini`(Windows)中配置: ```ini [libdefaults] default_realm = HADOOP.COM dns_lookup_realm = false dns_lookup_kdc = false ticket_lifetime = 24h renew_lifetime = 7d forwardable = true [realms] HADOOP.COM = { kdc = kdc.hadoop.com admin_server = kdc.hadoop.com } [domain_realm] .hadoop.com = HADOOP.COM hadoop.com = HADOOP.COM ``` --- ## ✅ 下一步:测试 Kerberos 认证是否成功 使用 `kinit` 命令测试 keytab 是否能正常获取票据: ```bash kinit -kt user.keytab sh_sjzt_dwzy@HADOOP.COM ``` 如果命令执行成功,说明 Kerberos 配置正常。 --- ## ✅ 下一步:确保 Kafka broker 的 principal 匹配主机名 Kafka broker 的 principal 应该是: ``` kafka/kafka-broker1@HADOOP.COM kafka/kafka-broker2@HADOOP.COM kafka/kafka-broker3@HADOOP.COM ``` 你可以使用以下命令查看是否存在这些 principal: ```bash ktutil list -k user.keytab ``` 或者使用 Kerberos KDC 管理工具查询。 --- ## ✅ 下一步:Java 客户端配置 Kerberos 确保你的 Java 应用程序能够找到 Kerberos 配置文件和 keytab 文件。 ### 1. 设置 JVM 参数(启动时) ```bash -Djava.security.krb5.conf=/etc/krb5.conf -Dsun.security.krb5.debug=true ``` ### 2. Kafka 消费者配置(Spring Boot) ```java props.put("security.protocol", "SASL_PLAINTEXT"); props.put("sasl.kerberos.service.name", "kafka"); props.put("sasl.jaas.config", "com.sun.security.auth.module.Krb5LoginModule required " + "useKeyTab=true " + "storeKey=true " + "keyTab=\"/path/to/user.keytab\" " + "principal=\"sh_sjzt_dwzy@HADOOP.COM\";"); ``` --- ## ✅ 下一步:运行 Kafka 消费者测试连接 你可以运行以下代码测试 Kafka 消费者是否能够成功连接并消费消息: ```java import org.apache.kafka.clients.consumer.*; import org.apache.kafka.common.serialization.StringDeserializer; import java.time.Duration; import java.util.Collections; import java.util.Properties; public class KafkaConsumerTest { public static void main(String[] args) { Properties props = new Properties(); props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "kafka-broker1:21007,kafka-broker2:21007,kafka-broker3:21007"); props.put(ConsumerConfig.GROUP_ID_CONFIG, "test-group"); props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName()); props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest"); props.put("security.protocol", "SASL_PLAINTEXT"); props.put("sasl.kerberos.service.name", "kafka"); props.put("sasl.jaas.config", "com.sun.security.auth.module.Krb5LoginModule required " + "useKeyTab=true " + "storeKey=true " + "keyTab=\"/path/to/user.keytab\" " + "principal=\"sh_sjzt_dwzy@HADOOP.COM\";"); Consumer<String, String> consumer = new KafkaConsumer<>(props); consumer.subscribe(Collections.singletonList("xx")); try { while (true) { ConsumerRecords<String, String> records = consumer.poll(Duration.ofMillis(100)); for (ConsumerRecord<String, String> record : records) { System.out.printf("Received: %s (Topic: %s, Partition: %d, Offset: %d)%n", record.value(), record.topic(), record.partition(), record.offset()); } } } finally { consumer.close(); } } } ``` --- ## ✅ 下一步:排查常见错误 ### 常见错误及解决方案: | 错误信息 | 原因 | 解决方案 | |----------|------|-----------| | `Server not found in Kerberos database` | principal 不匹配 | 检查 Kafka broker 的 principal 是否为主机名 | | `Clock skew too great` | 时间不同步 | 使用 `ntpdate` 或 `chronyd` 同步时间 | | `Cannot find key of appropriate type` | keytab 文件不匹配 | 检查 keytab 文件是否包含正确的 principal | | `Connection refused` | Kafka broker 未启动或端口未开放 | 检查 Kafka broker 是否运行,防火墙是否开放 21007 端口 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值