【问题标题】:Kafka Producer deployed on Kubernetes not able to produce to Kafka cluster running on local machine部署在 Kubernetes 上的 Kafka Producer 无法生产到在本地机器上运行的 Kafka 集群
【发布时间】:2018-10-05 20:15:00
【问题描述】:

我在本地机器上运行了一个 Kafka 集群,默认设置在我的 minikube 设置之外。我在其中一个 Web 服务中创建了一个生产者,并将其部署在 minikube 上。

对于连接到 Kafka 的生产者,我使用了 10.0.2.2 IP,我也使用它来连接 minikube 之外的 Cassandra 和 DGraph,因为它工作正常。

但是 Kafka 生产者不工作,甚至在发送数据时没有抛出错误说 Broker may not be available 或任何其他错误。但我在消费者方面没有收到任何东西。

当我在 Kubernetes 之外运行此 Web 服务时,一切正常。

如果你们知道这里可能出了什么问题,请。

下面是我正在使用的Kubernetes yaml 文件。

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: servicename
  labels:
    app: servicename
    metrics: kamon
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: servicename
        metrics: kamon
    spec:
      containers:
      - image: "image:app"
        imagePullPolicy: IfNotPresent
        name: servicename
        env:
        - name: CIRCUIT_BREAKER_MAX_FAILURES
          value: "10"
        - name: CIRCUIT_BREAKER_RESET_TIMEOUT
          value: 30s
        - name: CIRCUIT_BREAKER_CALL_TIMEOUT
          value: 30s
        - name: CONTACT_POINT_ONE
          value: "10.0.2.2"
        - name: DGRAPH_HOSTS
          value: "10.0.2.2"
        - name: DGRAPH_PORT
          value: "9080"
        - name: KAFKA_BOOTSTRAP_SERVERS
          value: "10.0.2.2:9092"
        - name: KAFKA_PRODUCER_NOTIFICATION_CLIENT_ID
          value: "notificationProducer"
        - name: KAFKA_NOTIFICATION_TOPIC
          value: "notification"
        - name: LAGOM_PERSISTENCE_READ_SIDE_OFFSET_TIMEOUT
          value: 5s
        - name: LAGOM_PERSISTENCE_READ_SIDE_FAILURE_EXPONENTIAL_BACKOFF_MIN
          value: 3s
        - name: LAGOM_PERSISTENCE_READ_SIDE_FAILURE_EXPONENTIAL_BACKOFF_MAX
          value: 30s
        - name: LAGOM_PERSISTENCE_READ_SIDE_FAILURE_EXPONENTIAL_BACKOFF_RANDOM_FACTOR
          value: "0.2"
        - name: LAGOM_PERSISTENCE_READ_SIDE_GLOBAL_PREPARE_TIMEOUT
          value: 30s
        - name: LAGOM_PERSISTENCE_READ_SIDE_RUN_ON_ROLE
          value: ""
        - name: LAGOM_PERSISTENCE_READ_SIDE_USE_DISPATCHER
          value: lagom.persistence.dispatcher
        - name: AKKA_TIMEOUT
          value: 30s
        - name: NUMBER_OF_DGRAPH_REPOSITORY_ACTORS
          value: "2"
        - name: DGRAPH_ACTOR_TIMEOUT_MILLIS
          value: "20000"
        - name: AKKA_ACTOR_PROVIDER
          value: "cluster"
        - name: AKKA_CLUSTER_SHUTDOWN_AFTER_UNSUCCESSFUL_JOIN_SEED_NODES
          value: 40s
        - name: AKKA_DISCOVERY_METHOD
          value: "kubernetes-api"
        - name: AKKA_IO_DNS_RESOLVER
          value: "async-dns"
        - name: AKKA_IO_DNS_ASYNC_DNS_PROVIDER_OBJECT
          value: "com.lightbend.rp.asyncdns.AsyncDnsProvider"
        - name: AKKA_IO_DNS_ASYNC_DNS_RESOLVE_SRV
          value: "true"
        - name: AKKA_IO_DNS_ASYNC_DNS_RESOLV_CONF
          value: "on"
        - name: AKKA_MANAGEMENT_HTTP_PORT
          value: "10002"
        - name: AKKA_MANAGEMENT_HTTP_BIND_HOSTNAME
          value: "0.0.0.0"
        - name: AKKA_MANAGEMENT_HTTP_BIND_PORT
          value: "10002"
        - name: AKKA_MANAGEMENT_CLUSTER_BOOTSTRAP_CONTACT_POINT_DISCOVERY_REQUIRED_CONTACT_POINT_NR
          value: "1"
        - name: AKKA_REMOTE_NETTY_TCP_PORT
          value: "10001"
        - name: AKKA_REMOTE_NETTY_TCP_BIND_HOSTNAME
          value: "0.0.0.0"
        - name: AKKA_REMOTE_NETTY_TCP_BIND_HOSTNAME
          value: "0.0.0.0"
        - name: AKKA_REMOTE_NETTY_TCP_BIND_PORT
          value: "10001"
        - name: LAGOM_CLUSTER_EXIT_JVM_WHEN_SYSTEM_TERMINATED
          value: "on"
        - name: PLAY_SERVER_HTTP_ADDRESS
          value: "0.0.0.0"
        - name: PLAY_SERVER_HTTP_PORT
          value: "9000"
        ports:
        - containerPort: 9000
        - containerPort: 9095
        - containerPort: 10001
        - containerPort: 9092
          name: "akka-remote"
        - containerPort: 10002
          name: "akka-mgmt-http"
---
apiVersion: v1
kind: Service
metadata:
  name: servicename
  labels:
    app: servicename
spec:
  ports:
    - name: "http"
      port: 9000
      nodePort: 31001
      targetPort: 9000
    - name: "akka-remote"
      port: 10001
      protocol: TCP
      targetPort: 10001
    - name: "akka-mgmt-http"
      port: 10002
      protocol: TCP
      targetPort: 10002
  selector:
    app: servicename
  type: NodePort

【问题讨论】:

  • 请出示您的服务文件。 Kafka 需要将通告的侦听器配置暴露给 k8s 集群外部作为入口地址
  • @cricket_007 我的 Kafka 集群在 K8 之外。但是,生产者在 K8 中。
  • 你能分享 Kubernetes 端应用程序的配置吗?这是部署和服务。
  • @ArtemGolenyaev 我已经为 K8 添加了 yaml 文件详细信息。
  • @ArtemGolenyaev 感谢 Artem。但通过调整 advertised.listeners 的 Kafka 配置解决了这个问题。明天会在这里回答,现在刚喝了些啤酒:)。

标签: kubernetes apache-kafka kafka-producer-api minikube


【解决方案1】:

我已经连接到与 Kafka 在同一台机器上运行的 Cassandra 和 Dgraph

嗯,这些服务不会通过 Zookeeper 公布他们的网络地址。

我的 Kafka 集群在 K8 之外。但是,生产者在 K8 中。

为了让 k8s 之外的服务知道 Kafka 的位置,advertised.listeners 需要设置为外部 IP 或 DNS 地址,k8s 环境中的所有生产者/消费者服务都将被识别,这就是您的服务的地址将连接到。例如PLAINTEXT://10.0.2.2:9092

换句话说,如果你没有设置监听器,它只是在 localhost 上监听,仅仅因为 Kafka 端口是对外暴露的,这意味着虽然你可以访问一个代理,但你返回的地址作为协议的一部分,不能保证与您的客户端配置相同,这就是广告的侦听器地址发挥作用的地方。

【讨论】:

猜你喜欢
  • 2022-10-24
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多