kafka配置外网访问
提纲
1、问题
2、原因分析
3、解决方案
1、问题
处于VPC网络中一个3节点的kafka集群,在vpc网络之外无法访问。即使给kafka集群中的一个节点映射了一个公网ip和端口,也是无法访问的。
具体问题见下图:
如下上图所示,在公司自建数据中心的vpc网络中有3个节点组成的一个kafka集群,分别是:
10.70.14.164:9092
10.70.14.165:9092
10.70.14.166:9092
vpc网络内部有一个跳板机,跳板机的vpc网络ip:10.70.14.174,跳板机上绑定了一个公网的ip:36.110.106.136。
这个集群可以被vpc网络内部的其他节点,比如跳板机这个节点,访问到,因为跳板机本身也是在vpc网络中的,但是不能被处于公司局域网的开发者和处于公网的开发者访问到,因为公司局域网和vpc网络是不同的两个网络,而公网又和公司局域网是隔离的。
那么如何才能让以上两类开发者顺利访问kafka集群呢?
2、原因分析
一般情况下开发者要访问kafka集群,就必须在自己的程序中配置kafka集群的至少一台机器的ip和kafka端口,在本例中ip:10.70.14.164,port:9092。
但是由于公司局域网和vpc网络不在一个网段中,所以,连处于公司局域网内部的开发者在配置了以上的ip和port后,都无法访问到kafka集群,更不要说处于公网的开发者访问了。
针对这种情况,我们首先想到了一个简单的处理方案,具体方案如下:
因为跳板机是有公网ip的,所以给跳板机做个端口映射,将跳板机的9092端口映射到10.70.14.164:9092,也就是36.110.106.136:9092->10.70.14.164:9092。这样其他开发者在自己的程序中配置kafka ip和port时,就配置成36.110.106.136:9092,这样当开发者访问36.110.106.136:9092时,实际上就相当于在访问10.70.14.164:9092,这不就是访问kafka集群了么?
可以不幸的是,这种方案表面上看似合理可行,实践中确实行不通的,为什么呢?
原来呀,kafka集群在客户端第一次访问它的时候,会把整个集群的信息都发给客户端,然后让客户端再访问整个集群。比如客户端配置了36.110.106.136:9092,当他访问的时候,因为36.110.106.136:9092和10.70.14.164:9092做了映射,所以,它会连到10.70.14.164:9092上,这时10.70.14.164:9092会把整个kafka集群中每个节点的server.conf中的listener字段的值发给客户端,也就是10.70.14.164:9092,10.70.14.165:9092,10.70.14.166:9092,发给客户端,最后客户端才能用整个集群的信息访问kafka集群。
但是,在本例中,当客户端从10.70.14.164:9092处收到了10.70.14.164:9092,10.70.14.165:9092,10.70.14.166:9092后,它用10.70.14.164:9092,10.70.14.165:9092,10.70.14.166:9092访问kafka集群,这时完全访问不通,因为从客户端的网络中找不到10.70.14.164,10.70.14.165,10.70.14.166这三个,因为它们三个ip是vpc内网的ip,非vpc ip是访问不到的。
3、解决方案
针对以上的情况,我们可以通过dns做域名和ip的转换来解决,具体方案如下。
第一步:给10.70.14.164,10.70.14.165,10.70.14.166三者每个都设置一个域名:
10.70.14.164 - thq-08
10.70.14.165 - thq-09
10.70.14.166 - thq-10
第二步:在每个节点的kafka的配置文件config/server.properties中的listener中配置如下,注意各个kafka的端口变了,不再是默认的9092.
10.70.14.164 - thq-08
listeners=PLAINTEXT://THQ-08:9092
10.70.14.165 - thq-09
listeners=PLAINTEXT://THQ-09:9093
10.70.14.166 - thq-10
listeners=PLAINTEXT://THQ-09:9094
第三步:在跳板机上做端口映射。
36.110.106.136:9092 -> 10.70.14.164:9092
36.110.106.136:9093 -> 10.70.14.165:9093
36.110.106.136:9094 -> 10.70.14.166:9094
第四步:在客户端的机器上做如下配置:
36.110.106.136 thq-08 thq-09 thq-10
第四步:客户端访问kafka集群
客户端配置:36.110.106.136:9092。
这样当客户端访问集群的时候,会收到THQ-08:9092,THQ-09:9093,THQ-10:9094,实际访问的时候做dns的域名到ip的映射,这样THQ-08:9092,THQ-09:9093,THQ-10:9094会被dns处理成:36.110.106.136:9092,36.110.106.136:9093,36.110.106.136:9094。
然后通过36.110.106.136:9092,36.110.106.136:9093,36.110.106.136:9094访问的时候,请求会到跳板机,由于跳板机上已经做了端口映射了,所以实际会访问到10.70.14.164:9092,10.70.14.165:9093,10.70.14.166:9094,这就是实际的kafka集群了。
这样也就解决了访问kafka的问题了。
参考文献:
1、https://www.luyouqi.com/shezhi/4703.html