感谢大佬的指点,目前已经全部调通,包括kerberos环境!
非kerberos环境最后配置的格式就是上面贴的。
kerberos环境 大致还需要以下几点。
1、kafka-server端加了环境变量
export KAFKA_OPTS="-Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_jaas.conf"
2、/etc/krb5.conf文件可能需要加一行udp_preference_limit = 1 将udp改成tcp防止丢包(这个不一定需要)
3、客户端需要一个kafka_client_jaas.conf
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
renewTicket=true
serviceName="kafka";
};
Client {
com.sun.security.authcom.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
renewTicket=true
serviceName="zookeeper";
};
4、然后一些sasl的配置,监听器的配置就不赘述了
总结:之前对“主动发现集群机制”了解不够,也不知道消费时要对每一个broker都开一个长连接* 加上报错一直都是权限验证失败让人感觉是kerberos的问题,绕了很久。后面排除无关的因素,就很明显了。另外提醒ambari安装的kafka不管界面上配置的advertised.listeners是多少,内部代码还是会强行将listeners的值赋给advertised.listeners。
还是很感谢大佬的及时回复 耐心指导。期待以后更多的交流
感谢大佬的指点,目前已经全部调通,包括kerberos环境!
非kerberos环境最后配置的格式就是上面贴的。
kerberos环境 大致还需要以下几点。
1、kafka-server端加了环境变量
export KAFKA_OPTS="-Djava.security.auth.login.config=/usr/hdp/current/kafka-broker/conf/kafka_jaas.conf"
2、/etc/krb5.conf文件可能需要加一行udp_preference_limit = 1 将udp改成tcp防止丢包(这个不一定需要)
3、客户端需要一个kafka_client_jaas.conf
KafkaClient {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
renewTicket=true
serviceName="kafka";
};
Client {
com.sun.security.auth.module.Krb5LoginModule required
useTicketCache=true
renewTicket=true
serviceName="zookeeper";
};
4、然后一些sasl的配置,监听器的配置就不赘述了
总结:之前对“主动发现集群机制”了解不够,也不知道消费时要对每一个broker都开一个长连接* 加上报错一直都是权限验证失败让人感觉是kerberos的问题,绕了很久。后面排除无关的因素,就很明显了。另外提醒ambari安装的kafka不管界面上配置的advertised.listeners是多少,内部代码还是会强行将listeners的值赋给advertised.listeners。
还是很感谢大佬的及时回复 耐心指导。期待以后更多的交流
不好意思 环境配置 提供的有点问题
实际是这样的
dn86:
port=26667
advertised.listeners=PLAINTEXT://dn86:26667
listeners=PLAINTEXT://内网ip:26667
dn87:
port=26668
advertised.listeners=PLAINTEXT://dn87:26668
listeners=PLAINTEXT://内网ip:26668
然后在客户端添加dn86 dn87的域名映射
我自己测试的结果写
58.240.115.226 dn86
58.240.115.226 dn87
是不是这样就可以实现一个公网ip下的 “外网访问内网集群”
有点乱,你提供的配置。
90.86
listeners=PLAINTEXT://dn86:26667
90.87
listeners=PLAINTEXT://dn86:26668
这个dn86
是一样的?
另外,你应该一个kafka集群走内网,客户端走外网,否则全走外网,kafka集群性能很差的。
例如:
port=26667
advertised.listeners=PLAINTEXT://外网ip:26667
listeners=PLAINTEXT://内网ip:26667
看了上述提到的文章 认真看了一遍 有解释单个公网ip不可以 也有称解决了的
重新提问一个问题和我的验证思路
我新找了个无kerberos的kafka环境
90.86
port=26667
advertised.listeners=PLAINTEXT://dn86:26667
listeners=PLAINTEXT://dn86:26667
90.87
port=26668
advertised.listeners=PLAINTEXT://dn86:26668
listeners=PLAINTEXT://dn86:26668
将dn86的26667映射到外网的26667
将dn87的26668映射成外网的26668
在客户端90.86的/etc/hosts
中配置
58.240.115.226 dn86
58.240.115.226 dn87
启动
cd /usr/hdp/3.1.0.0-78/kafka/bin/ && ./kafka-console-producer.sh --broker-list dn86:26667 --topic test_kk
这样的话 不管从zk中返回的是dn86:26667 还是dn87:26668 那么访问的都是dn86 dn87两个节点 两个端口。
想问一下 这种方案 理论上是否可行
补充:因为90.86-87节点和测试的客户端节点70.110本身是能访问的,所以为了排除风险。
在86 87上开了防火墙 86 87互为白名单,开放26667 26668 2181 端口,最后把70.110拉入黑名单,70.110直接访问86 87是不通的。
截至目前是可以消费了(无kerberos)但是之前报错太多了 不是很确定,所以请大佬帮忙再看一下目前的方案理论上是否ok。
公网ip只有一个,是不行的。因为kafka客户端要与每个node建立长连接,进行数据交换的。
你可以参考:kafka外网访问 ,里面有外网转发的原因。
另外注意,端口不能变,要映射一模一样的。
最后,你做测试的时候,可以先不用kerberos,一步一步来,如果内网、外网消费和生产都可以了,在加上认证。