首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从k8s内部的另一个命名空间连接到kafka

从k8s内部的另一个命名空间连接到kafka
EN

Stack Overflow用户
提问于 2020-05-18 01:48:37
回答 2查看 723关注 0票数 2

我的minikube中有我的kafka和zookeeper的以下配置:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: kafka-service
  namespace: kafka
spec:
  selector:
    app: kafka
  ports:
    - protocol: TCP
      port: 9092
      name: kafka-port
    - protocol: TCP
      port: 9094
      name: kafka-port-out
    - protocol: TCP
      port: 2181
      name: kafka-zk
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka-deployment
  namespace: kafka
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafka
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        app: kafka
        k8s-app: kube-dns
    spec:
      containers:
        - name: kafka-container
          image: bitnami/kafka:latest
          env:
          - name: 'ALLOW_PLAINTEXT_LISTENER'
            value: 'yes'
          - name: 'KAFKA_CFG_ZOOKEEPER_CONNECT'
            value: 'zookeeper-service:2181'
          - name: 'KAFKA_CFG_LISTENERS'
            value: 'PLAINTEXT://:9092'
          - name: 'KAFKA_CFG_ADVERTISED_LISTENERS' # if I comment this and the next line it works only locally
            value: 'PLAINTEXT://kafka-service.kafka:9092'
          ports:
            - containerPort: 9092
              name: kafka-port
            - containerPort: 9094
              name: kafka-port-out
            - containerPort: 5555
              name: kafka-port-jmx
            - containerPort: 2181
              name: kafka-zk

这是我的zookeeper的配置:

代码语言:javascript
复制
apiVersion: v1
kind: Service
metadata:
  name: zookeeper-service
  namespace: kafka
spec:
  selector:
    app: zookeeper
  ports:
    - protocol: TCP
      port: 2181
      name: zookeeper-port
    - protocol: TCP
      port: 2888
      name: zookeeper-peer
    - protocol: TCP
      port: 3888
      name: leader-election
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: zookeeper-deployment
  namespace: kafka
spec:
  replicas: 1
  selector:
    matchLabels:
      app: zookeeper
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        app: zookeeper
        k8s-app: kube-dns
    spec:
      containers:
        - name: zookeeper-container
          image: bitnami/zookeeper:latest
          env:
            - name: 'ALLOW_ANONYMOUS_LOGIN'
              value: 'yes'
            - name: 'ZOOKEEPER_ID'
              value: '1'
          ports:
            - containerPort: 2181
              name: zookeeper-port
            - containerPort: 2888
              name: zookeeper-peer
            - containerPort: 3888
              name: leader-election

我还有另一个部署:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafkacat-deployment
#  namespace: debug # I was using it from another namespace, but it was not working so I've tried to use the same
  namespace: kafka
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafkacat
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        app: kafkacat
        k8s-app: kube-dns
    spec:
      containers:
      - name: kafkacat-container
        image: edenhill/kafkacat:1.5.0

然后我尝试远程登录它,它工作了。

代码语言:javascript
复制
telnet kafka-service.kafka 9092
Trying 10.101.87.127...
Connected to kafka-service.kafka.svc.cluster.local.
Escape character is '^]'.

这是nslookup

代码语言:javascript
复制
nslookup kafka-service.kafka
Server:     10.96.0.10
Address:    10.96.0.10#53

Name:   kafka-service.kafka.svc.cluster.local
Address: 10.101.87.127

但当我试图达到它时,我得到的是:

代码语言:javascript
复制
kafkacat -b kafka-service.kafka:9092 -L
% ERROR: Failed to acquire metadata: Local: Timed out

所以我猜问题出在Kafka配置中:如果我注释env var KAFKA_CFG_ADVERTISED_LISTENERS,它是这样工作的:

代码语言:javascript
复制
# kafkacat -b kafka-service.kafka:9092 -L
Metadata for all topics (from broker -1: kafka-service.kafka:9092/bootstrap):
 1 brokers:
  broker 1001 at kafka-deployment-858c5c7f98-tt7sr:9092
 2 topics:
  topic "my_topic" with 1 partitions:
    partition 0, leader 1001, replicas: 1001, isrs: 1001
  topic "__consumer_offsets" with 50 partitions:
    partition 0, leader 1001, replicas: 1001, isrs: 1001

如果我尝试生成一条消息:

代码语言:javascript
复制
kafkacat -b kafka-service.kafka:9092 -P -t my_topic
oi
% ERROR: Local: Host resolution failure: kafka-deployment-858c5c7f98-w2dm5:9092/1001: Failed to resolve 'kafka-deployment-858c5c7f98-w2dm5:9092': Temporary failure in name resolution (after 15382734ms in state INIT)

然后,如果我尝试消费:

代码语言:javascript
复制
kafkacat -b kafka-service.kafka:9092 -C -t my_topic
% ERROR: Local: Host resolution failure: kafka-deployment-858c5c7f98-w2dm5:9092/1001: Failed to resolve 'kafka-deployment-858c5c7f98-w2dm5:9092': Temporary failure in name resolution (after 15406287ms in state INIT)

我已经尝试配置KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://kafka-service.kafka.svc.cluster.local:9092,但当我尝试使用kafkacat获取信息时仍然超时。

这就是为什么通告的侦听器是无法从本地计算机访问的主机名的原因。如何修复集群中的Kafka配置?

EN

回答 2

Stack Overflow用户

发布于 2020-05-18 13:33:51

我应用了与您提供的完全相同的清单,只是在kafka-deployment pod上的/dev/null中添加了一个跟随尾部,并且能够生成和使用主题。

我在k3d中运行k3s集群:

代码语言:javascript
复制
└[~]> kubectl get nodes                                                    
NAME               STATUS   ROLES    AGE   VERSION
k3d-dev-server     Ready    master   31m   v1.17.3+k3s1
k3d-dev-worker-1   Ready    <none>   31m   v1.17.3+k3s1

kafka-部署清单:

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafkacat-deployment
  #  namespace: debug # I was using it from another namespace, but it was not working so I've tried to use the same
  namespace: kafka
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafkacat
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        app: kafkacat
        k8s-app: kube-dns
    spec:
      containers:
        - name: kafkacat-container
          image: edenhill/kafkacat:1.5.0
          resources: {}
          command:
            - sh
            - -c
            - "exec tail -f /dev/null"

来自Kafka的终端日志-Kafka命名空间中的部署pod:

代码语言:javascript
复制
/ # kafkacat -b kafka-service.kafka:9092 -L
Metadata for all topics (from broker 1001: kafka-service.kafka:9092/1001):
 1 brokers:
  broker 1001 at kafka-service.kafka:9092 (controller)
 0 topics:
/ # kafkacat -b kafka-service.kafka:9092 -P -t my_topic
hi from kafkacat

/ # kafkacat -b kafka-service.kafka:9092 -C -t my_topic
hi from kafkacat
% Reached end of topic my_topic [0] at offset 1

/ # kafkacat -b kafka-service:9092 -L
Metadata for all topics (from broker -1: kafka-service:9092/bootstrap):
 1 brokers:
  broker 1001 at kafka-service.kafka:9092 (controller)
 1 topics:
  topic "my_topic" with 1 partitions:
    partition 0, leader 1001, replicas: 1001, isrs: 1001
/ # kafkacat -b kafka-service:9092 -P -t my_topic
hi from kafka2

/ # kafkacat -b kafka-service:9092 -C -t my_topic
hi from kafkacat
hi from kafka2
% Reached end of topic my_topic [0] at offset 2

kafka终端日志- debug命名空间部署:

代码语言:javascript
复制
└[~]> kubectl exec -it kafkacat-deployment-76f9c9db6d-8fth4 -n debug -- ash
/ # kafkacat -b kafka-service.kafka:9092 -L
Metadata for all topics (from broker 1001: kafka-service.kafka:9092/1001):
 1 brokers:
  broker 1001 at kafka-service.kafka:9092 (controller)
 1 topics:
  topic "my_topic" with 1 partitions:
    partition 0, leader 1001, replicas: 1001, isrs: 1001
/ # kafkacat -b kafka-service.kafka:9092 -P -t my_topic
hi from debug namespace

/ # kafkacat -b kafka-service.kafka:9092 -C -t my_topic
hi from kafkacat
hi from kafka2
hi from debug namespace
% Reached end of topic my_topic [0] at offset 3

在为minikube中的一个bug应用了一个变通方法后,我也让它在minikube中工作了:

代码语言:javascript
复制
minikube ssh
sudo ip link set docker0 promisc on

删除了正在运行的kafka-deployment pod,它在两个命名空间中都有效:

代码语言:javascript
复制
(⎈ |minikube:default)➜  ~ kubectl delete pod -n kafka kafka-deployment-5c4f64599f-kn9xt
pod "kafka-deployment-5c4f64599f-kn9xt" deleted
(⎈ |minikube:default)➜  ~ kubectl exec -n kafka -it kafkacat-deployment-b595d9ccd-4bht7 -- ash
/ # kafkacat -b kafka-service.kafka:9092 -L
Metadata for all topics (from broker 1003: kafka-service.kafka:9092/1003):
 1 brokers:
  broker 1003 at kafka-service.kafka:9092 (controller)
 0 topics:
/ # 
(⎈ |minikube:default)➜  ~ kubectl exec -n debug -it kafkacat-deployment-b595d9ccd-pgzv6 -- ash
/ # kafkacat -b kafka-service.kafka:9092 -L
Metadata for all topics (from broker 1003: kafka-service.kafka:9092/1003):
 1 brokers:
  broker 1003 at kafka-service.kafka:9092 (controller)
 0 topics:
/ #
票数 3
EN

Stack Overflow用户

发布于 2021-09-06 10:48:06

免责声明

这是使用confluent docker镜像进行测试的,它在我本地的minikube环境中工作。

要从不同的名称空间访问kafka,可以使用如下代码

代码语言:javascript
复制
apiVersion: apps/v1
kind: Deployment
metadata:
  name: kafka-deployment
  namespace: kafka
spec:
  replicas: 1
  selector:
    matchLabels:
      app: kafka
      k8s-app: kube-dns
  template:
    metadata:
      labels:
        app: kafka
        k8s-app: kube-dns
    spec:
      containers:
        - name: kafka-container
          image: confluentinc/cp-kafka:latest
          env:
            - name: KAFKA_POD_IP
              valueFrom:
                fieldRef:
                  fieldPath: status.podIP
            - name: KAFKA_ADVERTISED_LISTENERS
              value: PLAINTEXT://${KAFKA_POD_IP}:9092
            - name: KAFKA_INTER_BROKER_LISTENER_NAME
              value: PLAINTEXT
            - name: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
              value: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT
            - name: KAFKA_ZOOKEEPER_CONNECT
              value: zookeeper-service:2181
          command: [ "sh","-c" ]
          args:
              - 'KAFKA_ADVERTISED_LISTENERS="PLAINTEXT://${KAFKA_POD_IP}:9092" && /etc/confluent/docker/run'
          ports:
            - containerPort: 9092
              name: kafka-port
            - containerPort: 9094
              name: kafka-port-out
            - containerPort: 5555
              name: kafka-port-jmx
            - containerPort: 2181
              name: kafka-zk

请注意,尽管这是一种变通方法。

首选的解决方案是为您的kafka服务器创建状态集。您将能够通过fqdn引用pod ...

pod-name.stateful-setname.servicename

这也将为您提供一个更稳定的环境,如果服务器宕机,有状态集将以相同的名称重新启动。这意味着你的听众不会倒下。

https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61856204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档