我按照此网站 How To Deploy Apache Kafka With Kubernetes (DZone) 的指令部署了 Kafka 代理及其 Zookeeper。 (我只更改了命名空间名称)。
apiVersion: v1
kind: Service
metadata:
labels:
app: zookeeper-service
name: zookeeper-service
namespace: ecoemploi
spec:
type: NodePort
ports:
- name: zookeeper-port
port: 2181
nodePort: 30181
targetPort: 2181
selector:
app: zookeeper
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: zookeeper
name: zookeeper
namespace: ecoemploi
spec:
replicas: 1
selector:
matchLabels:
app: zookeeper
template:
metadata:
labels:
app: zookeeper
spec:
containers:
- image: bitnami/zookeeper:latest
imagePullPolicy: IfNotPresent
name: zookeeper
ports:
- containerPort: 2181
但为了使其正常工作,该解决方案的作者确实等待集群第一次启动,
然后复制zookeeper-service
的IP地址
kubectl get services -n kafka
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
zookeeper-service NodePort 10.100.69.243 <none> 2181:30181/TCP 3m4s
并将其粘贴到 kafka-broker
部署文件中:
[...]
spec:
hostname: kafka-broker
containers:
- env:
- name: KAFKA_BROKER_ID
value: "1"
- name: KAFKA_ZOOKEEPER_CONNECT
value: 10.100.69.243:2181
- name: KAFKA_LISTENERS
value: PLAINTEXT://:9092
- name: KAFKA_ADVERTISED_LISTENERS
value: PLAINTEXT://kafka-broker:9092
[...]
然后重新应用 kafka-broker
即可使其正常工作。
我正在使用这个解决方案,但在 Vagrant 框中它并不方便:每次我重新创建我的 vagrant 时,IP 都会改变......
是否有解决方案可以获取 zookeeper-service
的集群 IP 并自动为 KAFKA_ZOOKEEPER_CONNECT
准备正确的 kafka-broker
环境变量?
最佳答案
您可以指定服务名称,每次 K8s DNS 处理时该名称都是相同的。
- name: KAFKA_ZOOKEEPER_CONNECT
value: zookeeper-service
K8s以这种方式工作,内部通信通过服务名称进行,如果需要,请使用IP,否则ClusterIP本质上可能会随着服务的新部署或任何变化而改变IP。
DNS 解析将由 Kubernetes(coredns、kubedns)负责,因此我们只需提及服务名称。
这里是引用示例:https://kubernetes.io/docs/tutorials/stateful-application/mysql-wordpress-persistent-volume/
Wordpess 使用MySQL服务名称wordpress-mysql变量WORDPRESS_DB_HOST连接到MySQL数据库
关于kubernetes - 在这个例子中,如何捕获zookeeper-service的IP地址,并将其正确设置到需要它的kafka-broker中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76262537/