【发布时间】:2020-12-17 20:54:05
【问题描述】:
在网络方面有点新手......
- 我有一个使用 Docker Swarm 在笔记本电脑上的 2 个 Vbox 虚拟机上运行的 Kafka 集群(1 个主节点和 1 个工作节点)。此 VM 具有设置为单个 IP 地址的网桥适配器。确切的 YAML 是
enp0s8:
dhcp4: no
renderer: networkd
addresses: [192.168.0.50/24]
gateway4: 192.168.1.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
- 我尝试运行连接到我的 Kafka 集群的本地 Python 脚本。当我在笔记本电脑上执行此操作时,此方法有效,但是当我在 Docker 容器中运行相同的 Python 脚本时,它不起作用!
这几乎可以将其范围缩小到网络问题。我尝试使用--net=host 运行容器,但它仍然无法正常工作。困惑为什么我的 Docker 容器无法连接到虚拟机的 IP 地址,但在我的 macbook 本地运行良好。
编辑:
为了进一步说明 Python 脚本... 整个脚本在这里:
from kafka.consumer import KafkaConsumer
def create_kafka_consumer(topic, group_id, brokers):
return KafkaConsumer(topic,
bootstrap_servers=brokers,
auto_offset_reset='earliest',
enable_auto_commit=True,
group_id=group_id,
value_deserializer=lambda x: x.decode('utf-8'))
GROUP_ID = 'test'
def main():
topic ='airbnb'
c = create_kafka_consumer(topic, 'tester', '192.168.0.51:9093')
for msg in c:
print(msg)
if __name__ == '__main__':
main()
IP 地址和端口用于 Kafka WORKER 节点(在 Virtual Box 中运行),而不是主节点(上面列出的 IP 地址)。我在VM中设置了IP,并且在docker-compose文件中手动设置了端口。
成功输出示例(只打印所有kafka日志):
ConsumerRecord(topic='airbnb', partition=0, offset=169, timestamp=1598650807052, timestamp_type=0, key=None, value='adivinen quien cogio un airbnb para salir de la rutina y tiene que trabajar el周末? ', headers=[], checksum=None, serialized_key_size=-1, serialized_value_size=111, serialized_header_size=-1) ConsumerRecord(topic='airbnb', partition=0, offset=170, timestamp=1598650821359, timestamp_type=0, key=None, value='This x100%', headers=[], checksum=None, serialized_key_size=-1, serialized_value_size=10, serialized_header_size=-1)
不成功的输出:
Traceback(最近一次调用最后一次): 文件“tmp/consumer-kafka.py”,第 21 行,在 主要的() 文件“tmp/consumer-kafka.py”,第 16 行,在 main c = create_kafka_consumer(主题,“测试者”,“192.168.0.51:9093”) 文件“tmp/consumer-kafka.py”,第 11 行,在 create_kafka_consumer value_deserializer=lambda x: x.decode('utf-8')) init 中的文件“/usr/local/lib/python3.6/site-packages/kafka/consumer/group.py”,第 355 行 self._client = KafkaClient(metrics=self._metrics, **self.config) init 中的文件“/usr/local/lib/python3.6/site-packages/kafka/client_async.py”,第 242 行 self.config['api_version'] = self.check_version(timeout=check_timeout) 文件“/usr/local/lib/python3.6/site-packages/kafka/client_async.py”,第 925 行,在 check_version 引发 Errors.NoBrokersAvailable() kafka.errors.NoBrokersAvailable: NoBrokersAvailable
【问题讨论】:
-
您能说明一下您使用的是什么操作系统吗?同样重申一下,您正在尝试将您的 python 脚本所在的 docker 容器连接到 VirtualBox kafka 集群;对吗?
-
除上述之外,查看命令运行和输出(包括错误)会很有帮助。另外,您能否显示
ss -ntl或netstat -ntl的输出,以便我们可以看到Kafka 监听套接字?通常,如果您正在运行 Docker for Mac 或 Docker for Windows,您可以从host.docker.internal的容器访问主机上的服务。 -
为什么不在容器中运行 Kafka?此外,根据主机操作系统,容器无论如何都会在自己的 VM 中运行
-
@khariSeeng - Mac OSx Mojave。是的,带有脚本的容器正在尝试连接到 Vbox Kafka 集群(kafka 也在 vbox 中的 docker swarm 上运行)。
-
@AndyShinn - 我将为此问题添加更多详细信息
标签: docker networking apache-kafka