如何从docker主机外部生产运行在容器内的kafka代理?

时间:2018-07-02 12:42:25

标签: docker apache-kafka kubernetes

我正在尝试制作一个在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

1 个答案:

答案 0 :(得分:1)

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

因此,应该可以通过localhost:<nodePort>来访问kubernetes pod。

您还可以在Kubernetes集群之前设置负载均衡器,然后只需暴露k8s吊舱即可,即允许外部进入。

然后下一步是仅利用一些DNS记录,以便基于docker-compose的容器产生的出站请求将转到DNS,然后通过负载平衡器返回到Kubernetes集群。