Как сделать так, чтобы кафка-брокер работал внутри контейнера снаружи хоста докера?

Я пытаюсь представить брокеру кафки, который работает внутри контейнера, запущенного kubernetes. Я играю с KAFKA_ADVERTISED_LISTENERES а также KAFKA_LISTERNERS,

Я попытался установить эти две переменные env KAFKA_ADVERTISED_LISTENERES знак равно PLAINTEXT://<host-ip>:9092 а также KAFKA_LISTERNERS знак равно PLAINTEXT://0.0.0.0:9092 и побежал, используя docker-compose. И я смог произвести из приложения вне хост-машины.

Но установив эти две env-переменные в файле 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

1 ответ

Я предполагаю, что у вас есть сервис Kubernetes, чей селектор связывает входной поток с вашим брокером Kafka, который выставляет nodePort (в отличие от clusterIP). https://kubernetes.io/docs/concepts/services-networking/service/

Таким образом, стручок kubernetes должен быть доступен через localhost:<nodePort>,

Вы также можете установить балансировщик нагрузки перед вашим кластером Kubernetes, тогда вы можете просто выставить модули k8s, то есть разрешить внешний вход.

Затем следующий шаг - просто использовать некоторые записи DNS, чтобы исходящий запрос, генерируемый вашими контейнерами на основе docker, направлялся в DNS и затем возвращался в ваш кластер Kubernetes через балансировщик нагрузки.

Другие вопросы по тегам