解决Docker容器连接 Kafka 连接失败问题

2023-05-16

提出问题

近日助友 Docker 部署 Kafka 服务,服务日志启动正常,但客户端却无法连接

往日曾踩过此坑,然方法均源于博客,其语焉不详,不知为何不行,亦不知为何行,印象不甚深刻,耗费大量时间

为避此坑,特地学习官方文档相关章节,让我寻到珠丝马迹,请听我娓娓道来~

如嫌篇幅较长,可跳过验证,直奔结论

本文主要记录为何会出现无法连接到 Broker 的原因,想必看完本文你会知道该怎么做的 😃

谨以此文献给那些因为无知而浪费的时光!

大胆猜测

Kafka的服务端称为 Broker,每个 Broker 启动时会将自己的 Broker 配置信息上报给 Zookeeper ,如,监听地址与端口号等,Kafka的客户端(生产者与消费者统称)要连接 Broker 需要经过一层认证,不通过认证就无法连接!

小心求证

测试环境:

  • GNU/Linux Debian 10 4.19.0内核
  • Docker:19.03.6
  • Docker-compose:1.17.1
  • 镜像:zookeeper:3.5.5
  • 镜像:wurstmeister/kafka:2.12-2.2.1

设计实验:

使用 docker 镜像部署一套单节点的 Zookeeper + Kafka

要求Broker监听自定义域名(主机名)与端口,服务启动后展示 ZookeeperBroker 的注册信息

使用客户端连接 Broker ,使用不同的 --bootstrap-server 组合方式,进行验证

开始实验

为了提高部署效率,这里提供一个简单可启动的 docker-compose-test.yml

version: "3.3"
services:
    zookeeper:
        image: zookeeper:3.5.5
        restart: always
        container_name: zookeeper
        ports:
            - "2181:2181"
        expose:
            - "2181"
        environment:
            - ZOO_MY_ID=1
    kafka:
        image: wurstmeister/kafka:2.12-2.2.1
        restart: always
        container_name: kafka
        environment:
            - KAFKA_BROKER_ID=1
            - KAFKA_LISTENERS=PLAINTEXT://kafka:9090
            - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
            - KAFKA_MESSAGE_MAX_BYTES=2000000
        ports:
            - "9090:9090"
        depends_on:
            - zookeeper

docker-compose-test.yml 放入你的目录,运行部署脚本

查看两者的日志,检查是否正常启动

docker logs -f zookeeper

docker logs -f kafka

可以看到 Kafka 已经注册成功

让我们查看一下,Zookeeper 中注册的 Broker 信息

docker exec -it zookeeper bash bin/zkCli.sh

输入 quit 退出

想到我们已经将Kafka监听的端口号已经映射到宿主机了,使用宿主机 IP 访问不就得了?

先创建个Topic

docker run -it --rm --network host wurstmeister/kafka:2.12-2.2.1 \
             bash /opt/kafka/bin/kafka-topics.sh \
             --bootstrap-server 192.168.1.19:9090 \
             --create --topic logsTopic --partitions 1 --replication-factor 1

噢!又是这该死的错误!

想到刚才在 zookeeper 中看到的信息,要不我把 IP 换成 kafka 不就结了?

docker run -it --rm --network host wurstmeister/kafka:2.12-2.2.1 \
             bash /opt/kafka/bin/kafka-topics.sh \
             --bootstrap-server kafka:9090 \
             --create --topic logsTopic --partitions 1 --replication-factor 1

不对,宿主机本身没有对 kafka 作映射,问题一定出在这里!

再次执行刚才的命令,没有输出,说明创建 Topic 成功!

生产一条消息测试下

docker run -it --rm --network host wurstmeister/kafka:2.12-2.2.1 \
		bash /opt/kafka/bin/kafka-console-producer.sh \
		--broker-list kafka:9090 --topic logsTopic

输入回车,发送消息; ctrl + c 断开连接

创建消费者,消费消息测试

docker run -it --rm --network host wurstmeister/kafka:2.12-2.2.1 \
		bash /opt/kafka/bin/kafka-console-consumer.sh \
		--bootstrap-server kafka:9090  --topic logsTopic  --from-beginning

嗯,消费也成功了

归纳总结

这个实验说明了什么呢?

说明 Kafka 客户端在连接 Broker 的时候,Broker 将客户端发来的请求带的信息与 Broker 启动时上报给 Zookeeper 的信息 进行了比对,比对相同则认证通过,反之建立连接失败!

官方文档

通过耐心地查看 Kafka 的官方文档,终于在角落里看到她的影子!(好久不见妹子,看文档都眉清目秀的~)

比如下面这段:

From Kafka version 2.0.0 onwards, host name verification of servers is enabled by default for client connections as well as inter-broker connections to prevent man-in-the-middle attacks.

大意是讲通过这种认证hostname的机制,来避免中间人攻击

还有这段:

advertised.host.name: DEPRECATED: only used when advertised.listeners or listeners are not set. Use advertised.listeners instead. Hostname to publish to ZooKeeper for clients to use. In IaaS environments, this may need to be different from the interface to which the broker binds. If this is not set, it will use the value for host.name if configured. Otherwise it will use the value returned from java.net.InetAddress.getCanonicalHostName().

虽然这个参数已经标记为废弃了,但是她提供了个信息:如果设置主机名可能会被上报

最后看看这段

advertised.listeners: Listeners to publish to ZooKeeper for clients to use, if different than the listeners config property. In IaaS environments, this may need to be different from the interface to which the broker binds. If this is not set, the value for listeners will be used. Unlike listeners it is not valid to advertise the 0.0.0.0 meta-address.

也就是说,默认设置 advertised.listenerslisteners 的值相同,上报Zookeeper供客户端使用;无需绑定不同接口时,只需要设置 listeners 即可。

结论

Kafka 客户端在连接 Broker 的时候,Broker 将客户端发来的请求附加信息与 Broker 启动时上报给 Zookeeper 的 listeners参数信息、host(来自listeners的中间域名或主机名部分)、port (来自listeners的端口部分) 进行了验证,认证通过建立连接执行请求,反之建立连接失败

如果看完本文还不知如何去做,请参考https://www.cnblogs.com/hellxz/p/how_to_add_hosts_on_docker.html

写这篇文章费了好大的功夫,猜是一回事,弄明白又是一回事,如果本文对你有所帮助,欢迎点推荐与关注

引用:https://kafka.apache.org/documentation.html

本文采用 CC BY 4.0 协议进行授权,转载请标注作者署名及来源。https://www.cnblogs.com/hellxz/p/why_cnnect_to_kafka_always_failure.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

解决Docker容器连接 Kafka 连接失败问题 的相关文章

  • 开源软件Asterisk:386变身交换机

    有关开源软件最令人激动的事情之一就是其创建超越传统的IT基础架构的应用程序的方式 一个恰当的例子是称作 Asterisk 的电话应用程序 Asterisk是一种功能非常齐全的应用程序 xff0c 提供了许多电信功能 也许它最著名的应用是当作
  • 2016.9---2017.1半年总,外派工作的感觉真爽 (补17年1月)

    16年8月份 xff0c 第二版订餐系统上线 xff0c 我就着手出去上班 xff0c 8月初提交简历后 xff0c 面试就一发不可收 xff0c 一直到12月初才出去 xff0c 历时四个月 xff0c 期间边学习边面试 xff0c 但这
  • gerrit - first commit

    最近公司有新项目 xff0c 已经让领导帮我把clone和push的权限都开通了 xff0c 但是在push的时候还是提交失败 xff0c 错误信息如下 xff1a git push origin master Counting objec
  • AutoML领域的一把利器---HyperGBM

    AutoML领域的一把利器 HyperGBM 文章目录 AutoML领域的一把利器 HyperGBM 前言一 何为AutoML xff1f 二 如何使用HyperGBM1 引入库2 读入数据3 初始化make experiment4 调用m
  • AutoML工具之HyperGBM介绍

    HyperGBM介绍 本文章主要是对autoML开源框架HyperGBM的一个介绍 文章目录 HyperGBM介绍一 关于HyperGBM二 功能特性总览二 如何安装HyperGBM三 HyperGBM入门样例1 准备数据集2 创建实验并进
  • HyperGBM如何定义autoML的搜索空间

    HyperGBM学习笔记之如何定义autoML搜索空间 文章目录 HyperGBM学习笔记之如何定义autoML搜索空间前言一 入门篇1 定义需求2 需求解析 二 进阶篇1 定义参数的搜索范围2 构建autoML伪代码3 HyperGBM定
  • HyperGBM之进化搜索算法

    HyperGBM学习笔记之进化搜索算法 文章目录 HyperGBM学习笔记之进化搜索算法一 什么是进化搜索算法 xff1f 二 HyperGBM中的变异算法实现1 构建进化搜索实例2 变异算法实现3 进化搜索算法整体流程 三 HyperGB
  • 机器学习之如何处理缺失值(missing value)

    机器学习之如何处理缺失值 备注 xff1a 本次数据来源于kaggle xff0c 详情请戳here xff0c 原文参考连接 xff0c 请戳here xff0c 本文篇幅较长 xff0c 旨在多介绍EDA过程中的一些思想和细节 文章目录
  • 机器学习中的早停策略

    前言 在做机器学习模型调优的时候 xff0c 往往会通过一系列的操作去提升调优效率 xff0c 其中有一种技术就是合理运用早停策略 关于数据集 xff1a 本文直接使用kaggle的数据集 xff0c 你可以直接点击链接下载 一 入门 1
  • 机器学习中如何处理非数值型的特征

    前言 传统的机器算法一般处理的是结构化数据 xff0c 而结构化数据中往往包含以下几种类别 xff1a 传统的机器学习算法 SVM xff0c LR xff0c lightgbm xff0c xgboost等 结构化数据类别 Categor
  • automl中如何提升搜索效率

    前言 automl 简单来说 xff0c 就是将机器学习应用于现实问题的端到端流程自动化的过程 xff0c 其产生的主要原因就是因为机器学习的应用需要大量的人工干预 xff0c 这些人工干预表现在 xff1a 特征分析 模型选择 参数调节等
  • Linux操作系统下搭建VNC远程控制软件详尽教程

    摘自 xff1a http os 51cto com art 200802 65589 htm VNC简介 xff1a 虽然VNC 还有着在Linux下无法按热键呼出中文输入等等小小不足 xff0c 但仍然无法阻止其在Linux系统中的地位
  • automl工具入门介绍

    前言 自动化机器学习已经被广泛应用于各种 跨 业务场景的模型构建 xff0c 实验以及生产部署当中 automl领域中有各种各样的开源项目可以直接使用 xff0c 本篇文章尝试对一些主流的开源框架进行介绍 autogluon hypergb
  • Ensemble算法之GreedyEnsemble

    前言 我们常说三个臭皮匠顶个诸葛亮 xff0c 在机器学习领域中将这个理念应用到极致的技术是boosting xff0c 将N多的弱分类器组合到一起 xff0c 达到一个强分类器的效果 xff0c 主流代表的算法就是xgboost xff0
  • Hadoop URL数据读取操作

    hadoop可以从命令行上使用hadoop fs command 来读取文件系统中的文件 同时也可以使用java接口来实现这些功能 刚写好了一个权威指南上的例子 xff0c 附上代码 xff1a package baseOperation
  • ubuntu更改默认启动项顺序

    ubuntu更改默认启动项顺序 因为经常需要在ubuntu下调试openstack代码 xff0c 在windows下用虚拟机又会严重影响使用性能 xff0c 所以干脆将笔记本装了windows 43 ubuntu双系统 xff0c 曾多次
  • tensorflow学习笔记(十九):分布式Tensorflow

    最近在学习怎么分布式Tensorflow训练深度学习模型 看官网教程看的云里雾里 最终结合着其它资料 终于对分布式Tensorflow有了些初步了解 gRPC google remote procedure call 分布式Tensorfl
  • gcc安装教程(windows版本)

    windows下的gcc有两个版本mingw和cygwin xff0c 二选一就好 已学会C 43 43 xff0c 做工程 xff0c 建议用mingw 用cygwin编译后的二进制码在别人机器上用不了 xff0c 因为其他人的机器没有c
  • 华为以太网链路聚合Eth-Trunk实验

    链路聚合Eth Trunk 什么是链路聚合 xff1f 原理基本术语聚合模式负载分担的逐流转发和逐包转发负载分担的延伸链路聚合实验一 手工聚合链路聚合实验二 LACP STATIC聚合链路聚合实验的疑问思考补充 xff0c 三层Eth Tr
  • 关于Linux 下的错误路由产生火星包的问题

    关于linux下的错误路由产生火星包的问题 错误原理 linux 下的route表 xff0c 不仅负责包的转发路径选择 xff0c 还负责检验包的来源的合理性 xff0c 比如 ip r default via 10 0 2 2 dev

随机推荐

  • 配置SSH的对等性

    在所有节点配置SSH的对等性 在安装Oracle Real Application clusters之前 必须先配置所有节点的SSH对等性 因为在安装过程种Oracle Universal Installer 使用ssh和scp命令执行远程
  • apt-get下载安装本地包

    一 使用场景 xff1a Ubuntu系统 1 Computer A不能上网 xff0c 需通过Computer B将安装包下载后 xff0c 拷贝给Computer A进行本地安装 前提是 xff0c 2台机器上的操作系统环境相同 2 也
  • sklearn专题六:聚类算法K-Means

    目录 1 概述 1 1 无监督学习与聚类算法 1 2 sklearn中的聚类算法 2 KMeans 2 1 KMeans是如何工作的 2 2 簇内误差平方和的定义和解惑 2 3 KMeans算法的时间复杂度 3 sklearn cluste
  • 查找某个导师(博导、硕导)所带学生的学位论文的步骤

    怎么查找某个导师 xff08 博导 硕导 xff09 所带学生的学位论文呢 xff1f 一般经过这几个步骤就能找到 xff1a 第一步 xff1a 在浏览器中输入网址https www cnki net xff0c 进入中国知网 第二步 x
  • 我的三色2016

    2016年于我来讲是无疑是迄今为止最为多彩与丰富的一年 xff0c 在这一年里我完成了从象牙塔到职场的过渡 xff0c 经历过迷茫 xff0c 遭受过歧视 xff0c 遇到过挑战 xff0c 好在上帝虽然关闭了所有的门却为我 打开了一道窗
  • 图像处理之Haar特征

    Haar like 特征是计算机视觉领域一种常用的特征描述算子 也称为 Haar 特征 xff0c 这是因为 Haar like 是受到一维 haar 小波的启示而发明的 所以称为类 Haar 特征 xff0c 后来又将 Haar like
  • 任意大小汉字点阵字库(字模)的制作与生成 单片机GUI/STemwin

    1 首先介绍一下汉字点阵在汉字库中的地址计算公式 xff1a 汉字库种类繁多 xff0c 但都是按照 区位的顺序 排列的 前一个字节为该汉字的区号 xff0c 后一个字节为该字的位号 每一个区记录94个汉字 xff0c 位号则为该字在该区中
  • ubuntu下ifconfig找不到命令,packege ‘net-tools‘ has no installation candidate

    PS xff1a 首先要将网络适配器设置为NAT模式 刚用虚拟机安装完ubuntu后 xff0c 实用ifconfig提示找不到命令 xff1a 用sudo apt install net tools也提示错误 xff1a Package
  • caffe+opencv linux安装

    有gpu http blog csdn net leijiezhang article details 53688157 仅CPU http blog csdn net u010402483 article details 51506616
  • Deep learning系列(十五)有监督和无监督训练

    1 前言 在学习深度学习的过程中 xff0c 主要参考了四份资料 xff1a 台湾大学的机器学习技法公开课 xff1b Andrew NG的深度学习教程 xff1b Li feifei的CNN教程 xff1b caffe官网的教程 xff1
  • c++ item

    C 43 43 书单 xff1a 1 第一本 基础好一些的 xff0c 可以看Stanley B Lippman的C 43 43 Primer xff0c 基础不太好的话 xff0c 可以看Stanley B Lippman的 Essent
  • 链表基础知识总结

    链表和数组作为算法中的两个基本数据结构 xff0c 在程序设计过程中经常用到 尽管两种结构都可以用来存储一系列的数据 xff0c 但又各有各的特点 数组的优势 xff0c 在于可以方便的遍历查找需要的数据 在查询数组指定位置 xff08 如
  • 关系型 和 非关系型 数据库使用场景

    面试 xff1a 你懂什么是分布式系统吗 xff1f Redis分布式锁都不会 xff1f gt gt gt 关系型数据库优点 SQL方便在多个表之间 做非常复杂的数据查询事务支持 安全性能高 关系型数据库缺点 不擅长大量数据的写入处理不擅
  • Dont't recreate the sequence! You would invalidate all independent objects and l

    原文出处 xff1a https community oracle com message 4016489 4016489 Dont 39 t recreate the sequence You would invalidate all i
  • June 11th 模拟赛C T1 Sandcas Solution

    空降题目处 点我点我点我 Description FJ居住的城堡有N个城墙 1 lt 61 N lt 61 25 000 xff0c 编号为1到N xff0c 每个城墙的高度为M i 1 lt 61 M i lt 61 100 000 xf
  • 树莓派3B安装64位系统

    树莓派是一款微型计算机 xff0c 并且树莓派3B是目前树莓派家族中唯一一款采用64位处理器的产品 但是树莓派官方提供的系统都是32位的 Linux操作系统厂商SUSE已经宣布专门为Raspberry Pi 3用户推出了一个64位Linux
  • winform中进行动态布局

    在某些网页中 xff0c 对有些按钮进行选择后 xff0c 网页中的布局会增加或者减少 xff0c 无论增加还是减少 xff0c 都会按照顺序进行排序 这个效果在winform中也是可以的 1 建立一个winform项目 2 拖动控件后 x
  • 【排坑】 Ubuntu 16.04 修改 lightdm.conf 后图形界面崩溃,报错 the system is running in low-graphics mode

    系统 Ubuntu 16 04 xff0c 英特尔最不值钱的复合显卡 起因 xff1a 笔者想要用 docker 的 container 能显示出一次些基础的视觉效果 xff0c 类似于在 container 中跑 matplot 函数 x
  • Java 观察者模式 详解

    观察者模式是一种常见的设计模式 xff0c 也称作发布 订阅模式 它主要解决了对象之间的通知依赖关系问题 在这种模式中 xff0c 一个对象 xff08 称作Subject xff09 维护着一个对象列表 xff0c 这些对象 xff08
  • 解决Docker容器连接 Kafka 连接失败问题

    提出问题 近日助友 Docker 部署 Kafka 服务 xff0c 服务日志启动正常 xff0c 但客户端却无法连接 往日曾踩过此坑 xff0c 然方法均源于博客 xff0c 其语焉不详 xff0c 不知为何不行 xff0c 亦不知为何行