使用Terraform搭建ECS Fargate集群Kafka无法解析zookeeper地址问题
问题根因与修复方案
1 立即修复DNS解析报错
ECS Fargate 使用 awsvpc 网络模式时,同一个任务定义内的所有容器共享同一个网络命名空间,无需通过容器名做DNS解析,直接使用 localhost 即可访问同任务下其他容器暴露的端口。
你只需要把Kafka容器的环境变量 KAFKA_CFG_ZOOKEEPER_CONNECT 的值从 zookeeper:2181 改为 localhost:2181 即可解决当前的无法解析地址报错。
对应代码修改示例:
{ "name" : "KAFKA_CFG_ZOOKEEPER_CONNECT", "value" : "localhost:2181" }
2 优化启动依赖避免偶发连接失败
你当前配置的depends_on默认仅等待zookeeper容器启动完成,不会等待zookeeper服务初始化就绪,大概率会出现kafka启动时zookeeper还没开始监听端口的偶发连接报错。
需要给zookeeper容器增加健康检查,同时修改kafka的依赖条件为等待zookeeper健康检查通过:
首先给zookeeper容器新增健康检查配置:
healthCheck = { command = ["CMD-SHELL", "zookeeper-shell.sh localhost:2181 ls / || exit 1"] interval = 5 timeout = 2 retries = 3 startPeriod = 10 }
然后修改kafka的depends_on配置:
depends_on = [ { containerName = "zookeeper" condition = "HEALTHY" } ]
3 额外Kafka配置优化(避免后续报错)
当前你缺少Kafka的监听地址配置,后续会出现客户端无法连接Kafka的问题,需要给kafka容器新增两个环境变量:
{ "name" : "KAFKA_CFG_LISTENERS", "value" : "PLAINTEXT://0.0.0.0:9092" }, { "name" : "KAFKA_CFG_ADVERTISED_LISTENERS", "value" : "PLAINTEXT://localhost:9092" }
如果你的Kafka需要被任务外的服务访问,把KAFKA_CFG_ADVERTISED_LISTENERS的值改为对应ECS服务的服务发现域名或者负载均衡地址即可。
内容的提问来源于stack exchange,提问作者Rohit Bhatt
相关产品推荐
相关产品推荐

