一、如何通过Kerberos认证.
1.安装Kerberos客户端
yum install krb5-libs krb5-workstation (使用which kinit查看是否安装成功)
2.拷贝Kerberos配置文件
- krb5.conf: 此文件用于定位kdc服务器和realm,一般放在/etc/
- principal/keytab文件: 相当于用户名和密码文件,由kadmin.local -q "ktadd -k /tmp/yl.keytab principal"
- servername: 来自于用户启动kafka的配置文件server.properties中的sasl.kerberos.service.name配置项
- kdc、kafka集群的相关host->ip映射
conf目录下krb5.conf和kafka.keytab和jaas.conf拷贝到客户端机器上, 同时,krb5.conf中的kdc集群主机名和IP配置到客户端机器hosts配置文件中
3.Kinit客户端通过kerberos认证
kinit -kt kafka.keytab kafka (kafka.keytab为kerberos认证的keytab,kafka为kerberos认证的用户名)
(1).没任何输出: 认证成功,使用klist能看到刚才认证的principal
(2).报错: kinit: Keytab contains no suitable keys for test1@EXAMPLE.COM while getting initial credentials
确认keytab文件和principal是正确对应的,且没有输出错误
(3).报错: kinit: Cannot contact any KDC for realm 'EXAMPLE.COM' while getting initial credentials
确认kdc服务器的host->ip映射正确且已经加入hosts文件中
确认是否能ping通服务器
二、准备Python访问Kafka的运行环境
1.安装操作系统依赖包
yum -y install gcc-c++ python-devel.x86_64 cyrus-sasl-devel.x86_64
2.安装kafka-python依赖包
pip install kafka-python
3.安装gssapi依赖包,该依赖包为Python访问Kerberos环境的模块
pip install gssapi
4.Kerberos认证方式生产者写入测试python代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from kafka import KafkaProducer
topic_name = "test"
producer = KafkaProducer(
bootstrap_servers='test-01:9092,test-02:9092,test-03:9092', //kerberos认证方式bootstrap_servers最好使用域名
security_protocol='SASL_PLAINTEXT',
sasl_mechanism='GSSAPI',
ssl_certfile=r'/opt/conf/kafka_test.keytab',
sasl_kerberos_service_name='kafka'
)
for i in range(10):
producer.send(topic_name, "Hello {}".format(i).encode("utf-8"))
producer.close()
5.Kerberos方式消费者读取测试python代码如下:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from kafka import KafkaConsumer
topic_name = "test"
consumer = KafkaConsumer(
bootstrap_servers='test-01:9092,test-02:9092,test-03:9092', //Kerberos认证方式bootstrap_servers最好使用域名
security_protocol='SASL_PLAINTEXT',
sasl_mechanism='GSSAPI',
ssl_certfile=r'/opt/conf/kafka_test.keytab',
sasl_kerberos_service_name='kafka'
)
for msg in consumer:
print("%s:%d:%d: key=%s value=%s" % (msg.topic, msg.partition, msg.offset, msg.key, msg.value.decode()))
6.关于Kafka模块支持的属性配置如下
三、问题总结
1.使用kafka-python往kafka写数据时报错:kafka.errors.NoBrokersAvailable: NoBrokersAvailable
这个错误是我测试代码的时候遇到的,当时网上查了好多都是加一个api_version =(kafka版本)参数,但是我测试了一下完全没有效果,道坎一边代码后发现在kafka-python 2.0.2的版本里面,是有自动获取版本的操作的,只有连接失败的情况之后才会使用手动设置版本,查找了相关资料后发现少了kerberos里面有个kinit操作(对应本文1-3.Kinit客户端通过kerberos认证),所以需要在代码里加上这步操作:
有2种方式:
1、可以安装 krbticket 模块,该模块可以Kinit客户端(详细使用方法见 https://pypi.org/project/krbticket/1.0.6/#description)
subprocess模块调用系统命令执行kinit -kt kafka.keytab kafka
代码中加入kinit步骤以后报错完美解决!