使用Docker部署Kafka时的网络应该如何配置

本文是我在使用Docker部署kafka遇到一些问题之后,在网上看到的一篇比较优秀的英文资料Link。借此翻译一下这篇文章,也帮助自己搞懂在使用Docker时遇到的一些网络问题,尤其是Host怎样配置。

作者的Kafka使用环境是Kafka Producer 和 Broker 均在 Docker 网络中, Kafka Consumer 在宿主机环境中。结构如下图这样子:

use-case.png

首先,我从Docker hub 中找到了一个Kafka Docker image。 我使用的是Wurstmeister Kafka and ZooKeeper images, 然后Docker-compose的文件是按照下面的格式定义的:

version: '2'

services:

  zookeeper:
    image: wurstmeister/zookeeper:3.4.6
    expose:
    - "2181"

  kafka:
    image: wurstmeister/kafka:2.11-2.0.0
    depends_on:
    - zookeeper
    ports:
    - "9092:9092"
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

启动Docker,然后按照kafka QuickStart 的步骤来使用kafka-console-producer.shkafka-console-consumer.sh

在宿主机中运行 Producer 的结果:

andrew@host$ bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>Hi there!
>It is a test message.

在宿主机中运行 Consumer的结果:

andrew@host$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
Hi there!
It's a test message.

可以看到,不管是producer还是consumer都可以在宿主机网络中正常工作。需要注意的是KAFKA_ADVERTISED_LISTENERS这个环境变量在Compose文件中的设置.Kafka会在client第一次连接的时候把这个变量值发送给client。在接收到这个变量值之后,client就可以使用它来从kafka 的 broker 中消费或者生产数据了。

由于我们定义的变量值为 PLAINTEXT://localhost:9092, producer和consumer在初始化连接时都会使用它并且之后所有的通信都会通过 9092 这个端口。

client-on-host-kafka-in-docker-wrong.png

这里的关键要点是客户端使用指定的Kafka地址(--bootstrap-server and --broker-list的值)。Kafka之后冲顶下他们的值为KAFKA_ADVERTISED_LISTENERS

下面让我们在运行Kafka容器的同一Docker网络内的任意Docker容器内运行Producer:

oot@869f83f2f265:/kafka# bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
>Hi there!
[2018-10-10 14:37:40,397] WARN [Producer clientId=console-producer] Connection to node -1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)

这时候就会报错了。这时候发生的事情是client收到了KAFKA_ADVERTISED_LISTENERS这个环境变量的值(PLAINTEXT://localhost:9092),之后尝试去连接它然后发现失败了,因为在自己docker网络中并没有这个地址。显然,从client的角度来说可以通过kafka:9092这个地址来连接kafka。因此,为了使 client 能够和 broker 通信,KAFKA_ADVERTISED_LISTENERS这个变量值就必须设置为PLAINTEXT://kafka:9092,那么,下面就来重新构建一下我们的Compose文件:

kafka:
    image: wurstmeister/kafka:2.11-2.0.0
    depends_on:
    - zookeeper
    ports:
    - "9092:9092"
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
      KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

然后测试producer:

oot@7dfb9eaa81dc:/kafka# bin/kafka-console-producer.sh --broker-list kafka:9092 --topic test
>Hi there!

成功!现在我们可以在Docker容器内使用Producer发送消息了。

下面我们来尝试通过宿主机上的Consumer消费Kafka的数据:

andrew@host$ bin/kafka-console-consumer.sh --bootstrap-server kafka:9092 --topic test --from-beginning
[2018-10-10 23:57:06,827] WARN Removing server kafka:9092 from bootstrap.servers as DNS resolution failed for kafka (org.apache.kafka.clients.ClientUtils)

正如预料的,此时consumer并不能连接到broker因为宿主机并不能识别kafka:9092这个地址。我们需要再重新设置一下上面的Compose文件:

  kafka:
    image: wurstmeister/kafka:2.11-2.0.0
    depends_on:
    - zookeeper
    ports:
    - "9092:9092"
    expose:
    - "9093"
    environment:
      KAFKA_ADVERTISED_LISTENERS: INSIDE://kafka:9093,OUTSIDE://localhost:9092
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INSIDE:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_LISTENERS: INSIDE://0.0.0.0:9093,OUTSIDE://0.0.0.0:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_INTER_BROKER_LISTENER_NAME: INSIDE

下面让我们来解释一下上面的几个环境变量:

  • KAFKA_ADVERTISED_LISTENERS

    kafka的broker将监听地址表(0.0.0.0:9093, 0.0.0.0:9092)和 listener (INSIDE, OUTSIDE

  • KAFKA_ADVERTISED_LISTENERS

    指向Broker的可用地址列表,kafka 将会在初始连接时将地址发送给client

  • KAFKA_LISTENER_SECURITY_PROTOCOL_MAP

    将上面定义的 listener 名称(INSIDE,OUTSIDE)映射到PLAINTEXT Kafka协议。

  • KAFKA_INTER_BROKER_LISTENER_NAME

    指向跨Broker间通信时的命名地址

这里我们定义了两个listeners(INSIDE://0.0.0.0:9093, OUTSIDE://0.0.0.0:9092)来分别表示Docker网络内部的流量和Docker主机外部的流量。我们为跨Broker间的通信定义了 INSIDE listener。通过KAFKA_ADVERTISED_LISTENERSKAFKA_LISTENER_SECURITY_PROTOCOL_MAP

我们将PLAINTEXT://kafka:9093发送给那些使用kafka:9093连接的客户端和

PLAINTEXT://localhost:9092发送给那些使用localhost:9092连接的客户端。

总之,我们定义了两种类型的客户端-内部和外部-并且配置kafka返回不同的地址给对应的客户端。

现在我们再来尝试下在Docker网络中使用Producer:

root@7dfb9eaa81dc:/kafka# bin/kafka-console-producer.sh --broker-list kafka:9093 --topic test
>Hi there!

在宿主机中使用Consumer:

andrew@host$ bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic test --from-beginning
Hi there!

现在全部都是成功的了!

producer和kafka broker都是在docker网络的内部。

client-and-kafka-in-docker.png

Consumer在外部, borker在Docker网络内部

client-on-host-kafka-in-docker.png

现在,当服务和kafka 部署在不同的网络环境中的时候,我们也知道该如何去配置Docker了。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容