上一篇文章中介绍了Kafka的SASL配置和SSL配置,其中SASL我们是只配了一个地址,但是在很多大型公司中,往往会使用更复杂一点的配置,来完成内外网通信的部署。
本篇主要设计到以下内容:
1.listener name的使用方法
2.listener涉及内外网访问的配置
1.listener name配置说明
Kafka 支持PLAINTEXT
,SSL
,SASL_PLAINTEXT,``SASL_SSL
四种安全协议(不区分大小写),且通过listeners
配置,可以同时监听多个端口。listeners
配置项通过逗号,
分割来指定多个listener
。每个listener
可以使用不同的安全协议。listeners中的每个listener配置格式为:
{LISTENER_NAME}://{hostname}:{port}
LISTENER_NAME
通常是一个描述性名称,用于定义listener
的目的。通常有两种常规用法:
1.1 客户端和Broker端使用不同Listener
例如,许多配置为客户端流量使用单独的listener
,因此可能在配置中将相应的LISTENER_NAME
为CLIENT
:
listeners= CLIENT://localhost:9092,BROKER://:9093
每个listener
使用的安全协议在配置项listener.security.protocol.map
中指定。例如来自客户端的通信使用SSL,broker相互之间的通信使用PLIANTEXT,则配置如下
listener.security.protocol.map = CLIENT:SSL,BROKER:PLAINTEXT
# Broker之间的连接用 BROKER监听器
inter.broker.listener.name=BROKER
1.2 提供不同安全协议的Listener
如果每个listener单独使用不同的安全协议,则可以直接使用安全协议作为LISTENER_NAME
。例如
listeners= SSL://localhost:9092,PLAINTEXT://localhost:9093
#以下两项都是默认配置
#inter.broker.listener.name=PLAINTEXT
#security.inter.broker.protocol=PLAINTEXT
在上述例子中,可以通过inter.broker.listener.name=PLAINTEXT
来指定broker间的通信时使用的listener
。但是该配置项并没有设置,因为inter.broker.listener.name
未配置时会使用security.inter.broker.protocol
来指定broker使用的listener
,不过该配置项的默认值为PLAINTEXT,所以也没有进行配置。
1.3 关于ListenerName的建议
配置多个listener
时,建议配置listener
的 LISTENER_NAME
,可以明确的描述listener
的作用。
2.listener涉及内外网访问的配置
2.1 Broker和客户端均在内网访问
当你的broker和客户端都在一个内部局域网的时候,所有的请求都是通过内部网络可达。只需要配置一个内网网址即可。
listeners=PLAINTEXT://内网ip:端口
2.2 Broker和客户端都可以进行外网访问
2.2.1 有外网网卡
这种场景比较少,当你的broker都有外网网卡的时候,所有请求都可以走外网抵达,可以进行如下配置即可:
listeners=PLAINTEXT://外网ip:端口
2.2.2 没有外网网卡
很多时候,我们都不会直接提供外网网卡而是通过其他入口转发到内部,比如你的客户端需要从外网访问broker时,可以进行如下配置:
listeners=PLAINTEXT://内网ip:端口1
advertised.listeners=PLAINTEXT://外网ip:端口1
可以使用相同的端口号,advertised.listeners
是提供给客户端拿到的地址,当客户端从外网往返该端口时,请求会被转发到内部网络的地址中去。
2.3 Broker和客户端的访问同时有内外网
上面的配置我们可以实现内外网的访问,但是在内外网我们很多时候希望使用不同的安全策略,这种时候前面的方式就很难实现。我们可以将lisenerName划分为内网和外网,选取不同的安全策略。
2.3.1 有外网网卡
当我们的机器本身有外网网卡的情况下,我们可以如下配置:
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
listeners=INTERNAL://内网ip:端口1,EXTERNAL://外网ip:端口2
advertised.listeners=INTERNAL://内网ip:端口1,EXTERNAL://外网ip:端口2
inter.broker.listener.name=INTERNAL
2.3.2 没有外网网卡
没有外网网卡的情况,我们就需要配置将外网的ip转发到内网:
listener.security.protocol.map=INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT
listeners=INTERNAL://内网ip:端口1,EXTERNAL://内网ip2:端口2
advertised.listeners=INTERNAL://内网ip:端口1,EXTERNAL://外网ip:端口2
inter.broker.listener.name=INTERNAL