Kubernetes部署Kafka执行topic命令报Timed out waiting for a node assignment错误
错误根因排查
- Kafka监听地址配置错误
你当前Deployment中配置的KAFKA_LISTENERS值为PLAINTEXT://localhost:9092,这会导致Kafka只绑定Pod内部的环回地址,仅允许Pod本地的请求访问,集群内其他服务、以及Docker Desktop宿主机的请求都无法建立有效连接,是触发超时的核心原因。对应Kafka运行日志也可以验证:Awaiting socket connections on localhost:9092。 - Service标签选择器不匹配
Deployment创建的Pod标签为io.bi.service: bi-kafka,但你的Kafka Service配置的selector是app: kafka、id: "0",二者完全不匹配,Service无法关联到后端运行的Kafka Pod,所有发送到Service地址的流量都没有后端实例承接。 - 通告地址配置冲突冗余
你同时配置了KAFKA_ADVERTISED_LISTENERS和已废弃的KAFKA_ADVERTISED_PORT,二者配置的值不匹配(9092和30718),会导致Kafka向Zookeeper注册的访问地址异常,客户端拿到错误的地址后无法正常通信。
修复方案
1. 修改Deployment配置
调整env下的Kafka相关配置项:
env: - name: KAFKA_ZOOKEEPER_CONNECT value: zoo1:2181 - name: KAFKA_ZOOKEEPER_CONNECTION_TIMEOUT_MS value: "30000" - name: KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR value: "1" # 监听所有网卡地址,允许外部访问 - name: KAFKA_LISTENERS value: "PLAINTEXT://0.0.0.0:9092" # 仅集群内访问填Service域名,需要宿主机访问填localhost:端口 - name: KAFKA_ADVERTISED_LISTENERS value: "PLAINTEXT://kafka-service:9092" - name: KAFKA_CREATE_TOPICS value: "test-topic:1:1" # 删除废弃的KAFKA_ADVERTISED_PORT配置项
修改完成后执行更新:kubectl apply -f <你的deployment配置文件名>
2. 修改Service配置
调整selector匹配Pod的实际标签:
apiVersion: v1 kind: Service metadata: name: kafka-service labels: name: kafka spec: ports: - port: 9092 name: kafka-port protocol: TCP # 需要宿主机直接访问可加nodePort: 30718,同时把type改为NodePort selector: io.bi.service: bi-kafka # 匹配Pod的实际标签 type: ClusterIP # 仅集群内访问用ClusterIP即可
修改完成后执行更新:kubectl apply -f <你的service配置文件名>
3. 访问验证
- 集群内Pod访问执行命令:
kafka-topics --list --bootstrap-server kafka-service:9092 - Docker Desktop宿主机访问,需要先将
KAFKA_ADVERTISED_LISTENERS改为PLAINTEXT://localhost:30718,Service改为NodePort类型并指定nodePort: 30718,再执行命令:kafka-topics --list --bootstrap-server localhost:30718
内容的提问来源于stack exchange,提问作者Mayak
相关产品推荐
相关产品推荐

