Как сделать так, чтобы кафка-брокер работал внутри контейнера снаружи хоста докера?
Я пытаюсь представить брокеру кафки, который работает внутри контейнера, запущенного 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 через балансировщик нагрузки.