如何连通私有子网中的 MSK / Kafka 集群?

发布于:2024-04-16 ⋅ 阅读:(16) ⋅ 点赞:(0)

MSK 集群通常都是建在私有子网中的,这给本地访问带来了很多麻烦,特别是需要在本地使用 Kafka GUI 客户端管理和读写 MSK 数据的时候。本文会给出一套解决方案。

我们这里讨论的问题有一点特殊性,那就是:由于 MSK 是托管服务,它的 Broker 主机名虽然映射了一个私有的 IP 地址,但是不能通过 SSH 登录的,这是比较特殊的一个地方,另一个地方是:Kafka 集群基本都是三个以上的 Broker,它的连接地址往往是三台以上的主机+端口号,这是另一个比较特殊的地方。

通常,通过 SSH Tunnel 建立端口端口转发是首先会被想到的解决方案,但是,测试并没有成功,当然,这不代表这一方向有问题,只是还没有找到正确的端口转发方法。

本文,我们使用专门的 Kafka 端口转发工具:Kafka Proxy,本地安装的 Kafka GUI 工具是 Offset Explorer ,测试环境如下:

信息项 取值
Kafka Broker List b-1.xxx.kafka.us-east-1.amazonaws.com:9092,b-2.xxx.kafka.us-east-1.amazonaws.com:9092,b-3.xxx.kafka.us-east-1.amazonaws.com:9092
位于公共子网中的堡垒机 ec2-13-88-56-217.compute-1.amazonaws.com

首先,登录位于公共子网中的堡垒机,执行如下命令安装 kafka-proxy:

curl -Ls https://github.com/grepplabs/kafka-proxy/releases/download/v0.3.8/kafka-proxy-v0.3.8-linux-amd64.tar.gz | tar xz
sudo mv ./kafka-proxy /usr/local/kafka-proxy

然后启动代理服务,命令如下(注意替换命令行中的主机名):

kafka-proxy server --bootstrap-server-mapping "b-1.xxx.kafka.us-east-1.amazonaws.com:9092,0.0.0.0:9092,ec2-13-88-56-217.compute-1.amazonaws.com:9092" \
                   --bootstrap-server-mapping "b-2.xxx.kafka.us-east-1.amazonaws.com:9092,0.0.0.0:9093,ec2-13-88-56-217.compute-1.amazonaws.com:9093" \
                   --bootstrap-server-mapping "b-3.xxx.kafka.us-east-1.amazonaws.com:9092,0.0.0.0:9094,ec2-13-88-56-217.compute-1.amazonaws.com:9094" \
                   --dynamic-listeners-disable

上述命令中最重要的是就是 --bootstrap-server-mapping 参数,其值由三部分组成,使用两个逗号分隔,格式为:

Kafka Broker 主机名:端口,本地绑定主机名:端口,暴露给远端连接的主机名:端口

这里只强调一点:测试表明,暴露给远端连接的主机名:端口必须要提供,否则本地客户端工具链接不上!,以下是本地客户端连接 MSK 的关键配置项,Broker List 的值:

ec2-13-88-56-217.compute-1.amazonaws.com:9092,ec2-13-88-56-217.compute-1.amazonaws.com:9093,ec2-13-88-56-217.compute-1.amazonaws.com:9094

以下是连接配置截图,MSK 集群使用 PLAINTEXT + NO Authentication!

image-20240408153155300