如何从minikube上的容器内到达kafka?

时间:2019-08-17 16:21:25

标签: python docker apache-kafka minikube kafka-python

我正在设置一个python应用程序,我想为kafka生成一条消息。 kafka服务器在我的计算机上本地运行(不在minikube中),而app.py在minikube中的容器中运行。

app.py的代码是这样:

try:
    producer = KafkaProducer(bootstrap_servers=['addr:9092'])
    producer.send('flask.logs', json.dumps("HELLO").encode('utf-8'))
    producer.flush()
    print(f"[P-KAFKA] kafka log posted")
except Exception as e:
    print(f"[P-KAFKA] kafka bad posted")
    raise e

我试图做一些事情,例如:

  1. 使用localhost代替addr,我将localhost的端口9092与minikube的端口9092桥接在一起,但是此解决方案不起作用。

  2. 使用192.168.1.3(我的PC计算机的IP)代替addr仍然无法正常工作。

我不知道该怎么办。

-解决方案- 我使用ngrok,基本上ngrok在公共地址中转发您可以选择的本地端口的流量。 很酷。 否则,这几乎是相同的问题: Calling an external service from within Minikube

2 个答案:

答案 0 :(得分:0)

为此,我们可以使用Ngrok

有一篇不错的博客文章,解释了如何Expose Kubernetes services over HTTPS with Ngrok

  

您是否曾经想公开过Internet上Minikube上运行的Kubernetes服务并为其提供一个临时HTTPS地址?如果是这样,那么Ngrok非常适合无需任何防火墙,NAT或DNS配置的情况。如果您正在开发可与Webhooks或oauth回调一起使用的应用程序,则Ngrok可以在Kubernetes服务与其云平台之间创建一条隧道,并为您提供一个唯一的HTTPS URL,可用于测试和调试服务。

Expose Kubernetes services with ngrok媒体上也有一篇文章。

  

很多时候,有必要将在[minikube](https://kubernetes.io/docs/setup/minikube/)中运行的Kubernetes应用暴露给公共互联网。这篇文章只是使用[**ngrok**](https://ngrok.com/)为此提供了一个手动但又快速又肮脏的技巧(它可能以前已经做过,但还是可以做到)

     

我们将使用一个简单的[nginx](https://www.nginx.com/)应用进行测试,即,将nginx服务器(作为单个副本Kubernetes Deployment运行)作为可公开访问的URL。

答案 1 :(得分:0)

  

kafka服务器在我的计算机上本地运行(不在minikube中),而app.py在minikube中的容器中运行。

然后,您不需要ngrok。

Minikube将请求路由到主机。您的主机包含一个正在运行的代理。永远不需要外部服务,尤其是无需通过Internet路由。

您只需要在Python代码中使用主机IP或DNS名称,最好使用一个环境变量,例如KAFKA_BOOTSTRAP

您需要将与server.properties地址相同的地址添加到advertised.listeners