首页 > 解决方案 > 如何从 docker 主机外部生成在容器内运行的 kafka 代理?

问题描述

我正在尝试向 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异常。

我在这里想念什么?

更新:

卡夫卡-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

标签: dockerapache-kafkakubernetes

解决方案


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

所以 kubernetes pod 应该可以通过localhost:<nodePort>.

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

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


推荐阅读