AWS Privatelink跨VPC访问Kafka advertised listener配置异常问题
问题根因
- 缺少显式
listeners配置
你当前的docker-compose配置中只声明了KAFKA_ADVERTISED_LISTENERS,没有显式配置KAFKA_LISTENERS参数。Kafka的listeners定义的是进程实际绑定的网卡和端口,advertised.listeners是对外通告给客户端的访问地址,二者必须配套配置。你使用的Confluent Server镜像在未显式配置listeners时,会尝试解析advertised.listeners中的域名进行绑定,而broker.confluent-playground是VPC-A侧的Privatelink域名,在VPC-B的Kafka宿主机上无法解析到本地网卡IP,导致EXTERNAL监听器绑定异常,安全规则匹配混乱。 - Confluent Server默认ACL限制
你使用的confluentinc/cp-server是企业版镜像,默认开启了Confluent Authorizer授权校验,ALLOW_EVERYONE_IF_NO_ACL_FOUND参数默认为false:- 场景1:连接匹配到EXTERNAL监听器时,匿名用户仅默认拥有
_confluent开头的系统topic的访问权限,所以只能看到7个内部topic - 场景2:由于监听器配置异常,9092端口的连接被误识别为INTERNAL内部监听器,内部监听器默认拥有全量权限,所以可以看到所有40个topic,但返回给客户端的通告地址是VPC-B的私网IP,VPC-A没有到该地址的路由,所以无法生产消息。
- 场景1:连接匹配到EXTERNAL监听器时,匿名用户仅默认拥有
正确配置方案
修改docker-compose中broker的environment配置,完整配置如下:
broker: image: confluentinc/cp-server:6.1.1 hostname: broker container_name: broker depends_on: - zookeeper ports: - "9092:9092" - "9101:9101" environment: KAFKA_BROKER_ID: 1 KAFKA_ZOOKEEPER_CONNECT: 'zookeeper:2181' KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,EXTERNAL:PLAINTEXT # 显式指定监听所有网卡,避免绑定失败 KAFKA_LISTENERS: INTERNAL://0.0.0.0:29092,EXTERNAL://0.0.0.0:9092 # 对外通告Privatelink域名,VPC-A客户端可直接访问 KAFKA_ADVERTISED_LISTENERS: INTERNAL://broker:29092,EXTERNAL://broker.confluent-playground:9092 KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL # 关闭默认ACL校验,允许匿名用户访问所有topic(如有安全需求可自行配置ACL替代) KAFKA_ALLOW_EVERYONE_IF_NO_ACL_FOUND: 'true'
验证步骤
- 重启Kafka容器,等待服务就绪
- 在VPC-A的EC2上执行
kafkacat -b broker.confluent-playground:9092 -L,可正常返回全部40个topic - 执行命令验证生产消费功能正常:
生产:echo "test message" | kafkacat -b broker.confluent-playground:9092 -t <你的topic名称> -P
消费:kafkacat -b broker.confluent-playground:9092 -t <你的topic名称> -C
内容的提问来源于stack exchange,提问作者Alexander Witte
相关产品推荐
相关产品推荐

