【问题标题】:How to produce to kafka broker running inside container from outside the docker host?如何从 docker 主机外部生成在容器内运行的 kafka 代理?
【发布时间】:2018-12-10 16:51:30
【问题描述】:

我正在尝试生成一个在 kubernetes 启动的容器内运行的 kafka 代理。我在玩KAFKA_ADVERTISED_LISTENERESKAFKA_LISTERNERS

我尝试设置这两个环境变量 KAFKA_ADVERTISED_LISTENERES = PLAINTEXT://<host-ip>:9092KAFKA_LISTERNERS = PLAINTEXT://0.0.0.0:9092 并使用 docker-compose 运行。而且我能够从主机之外的应用程序中进行生产。

但是在 Kubernetes.yml 文件中设置这两个环境变量,我得到No broker list available 异常。

我在这里错过了什么?

更新:

kafka-pod.yaml:

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  namespace: casb-deployment
  name: kafkaservice
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: kafkaservice
    spec:
      hostname: kafkaservice
      #hostNetwork: true  # to access docker out side of host container
      containers:
      - name: kafkaservice
        imagePullPolicy: IfNotPresent
        image: wurstmeister/kafka:1.1.0
        env:  # for production 
         - name: KAFKA_ADVERTISED_LISTENERES
           value: "PLAINTEXT://<host-ip>:9092"
         - name: KAFKA_LISTERNERS
           value: "PLAINTEXT://0.0.0.0:9092"
         - name: KAFKA_CREATE_TOPICS
           value: "Topic1:1:1,Topic2:1:1"
         - name: KAFKA_MESSAGE_TIMESTAMP_TYPE
           value: "LogAppendTime"
         - name: KAFKA_LOG_MESSAGE_TIMESTAMP_TYPE
           value: "LogAppendTime"   
         - name: KAFKA_ZOOKEEPER_CONNECT
           value: "zookeeper:2181"
        ports: 
        - name: port9092
          containerPort: 9092

---

apiVersion: v1
kind: Service
metadata:
  namespace: casb-deployment
  name: kafkaservice 
  labels:
    app: kafkaservice
spec:
  selector:
    app: kafkaservice
  ports:
  - name: port9092
    port: 9092
    targetPort: 9092
    protocol: TCP

【问题讨论】:

    标签: docker apache-kafka kubernetes


    【解决方案1】:

    我假设您有一个 Kubernetes 服务,其选择器将入口流链接到您的 Kafka 代理,这将暴露 nodePort(而不是 clusterIP)。 https://kubernetes.io/docs/concepts/services-networking/service/

    所以 kubernetes pod 应该可以通过 localhost:&lt;nodePort&gt; 访问。

    您还可以在 Kubernetes 集群前面设置一个负载均衡器,然后您可以只公开 k8s pod,即允许外部入口。

    然后下一步就是利用一些 DNS 记录,这样基于 docker-compose 的容器产生的出站请求将进入 DNS,然后通过负载均衡器返回到 Kubernetes 集群。

    【讨论】:

    • 感谢您的回复。我已更新问题以包括kafka-pod.yml。请您看一下并指导我。我对 Kubernetes 真的很陌生。
    • TBH,整个使用 kubernetes 和 docker-compose 的混合设置有点尴尬。你 Kubernetes 化一切怎么样?
    • 其实我并没有同时使用kubernetes和docker-compose。我首先使用 docker-compose 进行测试,然后在 kubernetes 上进行测试。在我说ran using docker-compose. And I was able to produce from an application out of the host machine. 的问题中,我的意思是我单独尝试了 docker-compose 并且它有效。之后,当我在 Kubernetes 中运行容器时,我遇到了异常。
    • 好的,您的服务看起来还不错。除了 targetPort 仅限于 Kubernetes 虚拟网络(即,它不会暴露于来自集群外部的入站请求)——因此您应该将 targetPort: 9092 替换为 nodePort: 30000(这就是您想要的端口在测试您的 Kafka 连接性时命中)。另外,只是一个建议:不要使用一些docker-compose-based 测试来运行一些生产者,也许你可以尝试一些简单的东西,例如github.com/dpkp/kafka-python
    猜你喜欢
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-01
    • 1970-01-01
    相关资源
    最近更新 更多