一、如何通过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模块支持的属性配置如下

    

pyhive kerberos pyhive kerberos认证_客户端

三、问题总结

    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步骤以后报错完美解决!