【问题标题】:Accessing kafka from spring boot application running on kubernetes从运行在 kubernetes 上的 Spring Boot 应用程序访问 kafka
【发布时间】:2019-08-01 12:34:01
【问题描述】:

我在 kubernetes 集群中运行了一个 kafka 安装。我有一个运行 Spring Boot 应用程序的 Pod,它使用默认的 bootstrap.servers (localhost:9092) 配置,而不是传入的配置 (bootstrap.kafka.svc.cluster.local:9092)。然后 pod 无法启动,因为 kafka 没有在 localhost 上运行。

这是我的 Spring Boot 配置

spring:
  kafka:
    consumer:
      group-id: spring-template
      auto-offset-reset: earliest
      bootstrap-servers: "bootstrap.kafka.svc.cluster.local:9092"
    producer:
      bootstrap-servers: "bootstrap.kafka.svc.cluster.local:9092"
    bootstrap-servers: "bootstrap.kafka.svc.cluster.local:9092"

在启动时设置消费者时,组 id 和 auto-offset-reset 正在从上述配置中正确传递。但是引导服务器配置不是,应用程序实际上使用 localhost:9092 根据下面的日志

2019-03-11 07:34:36.826  INFO 1 --- [  restartedMain] o.a.k.clients.consumer.ConsumerConfig    : ConsumerConfig values:
        auto.commit.interval.ms = 5000
        auto.offset.reset = earliest
        bootstrap.servers = [localhost:9092]
        check.crcs = true
        client.id =
        connections.max.idle.ms = 540000
        default.api.timeout.ms = 60000
        enable.auto.commit = true
        exclude.internal.topics = true
        fetch.max.bytes = 52428800
        fetch.max.wait.ms = 500
        fetch.min.bytes = 1
        group.id = spring-template
        heartbeat.interval.ms = 3000
        interceptor.classes = []
        internal.leave.group.on.close = true
        isolation.level = read_uncommitted
        key.deserializer = class org.apache.kafka.common.serialization.StringDeserializer
        max.partition.fetch.bytes = 1048576
        max.poll.interval.ms = 300000
        max.poll.records = 500
        metadata.max.age.ms = 300000
        metric.reporters = []
        metrics.num.samples = 2
        metrics.recording.level = INFO
        metrics.sample.window.ms = 30000
        partition.assignment.strategy = [class org.apache.kafka.clients.consumer.RangeAssignor]
        receive.buffer.bytes = 65536
        reconnect.backoff.max.ms = 1000
        reconnect.backoff.ms = 50
        request.timeout.ms = 30000
        retry.backoff.ms = 100
        sasl.client.callback.handler.class = null
        sasl.jaas.config = null
        sasl.kerberos.kinit.cmd = /usr/bin/kinit
        sasl.kerberos.min.time.before.relogin = 60000
        sasl.kerberos.service.name = null
        sasl.kerberos.ticket.renew.jitter = 0.05
        sasl.kerberos.ticket.renew.window.factor = 0.8
        sasl.login.callback.handler.class = null
        sasl.login.class = null
        sasl.login.refresh.buffer.seconds = 300
        sasl.login.refresh.min.period.seconds = 60
        sasl.login.refresh.window.factor = 0.8
        sasl.login.refresh.window.jitter = 0.05
        sasl.mechanism = GSSAPI
        security.protocol = PLAINTEXT
        send.buffer.bytes = 131072
        session.timeout.ms = 10000
        ssl.cipher.suites = null
        ssl.enabled.protocols = [TLSv1.2, TLSv1.1, TLSv1]
        ssl.endpoint.identification.algorithm = https
        ssl.key.password = null
        ssl.keymanager.algorithm = SunX509
        ssl.keystore.location = null
        ssl.keystore.password = null
        ssl.keystore.type = JKS
        ssl.protocol = TLS
        ssl.provider = null
        ssl.secure.random.implementation = null
        ssl.trustmanager.algorithm = PKIX
        ssl.truststore.location = null
        ssl.truststore.password = null
        ssl.truststore.type = JKS
        value.deserializer = class org.apache.kafka.common.serialization.StringDeserializer

2019-03-11 07:34:36.942  INFO 1 --- [  restartedMain] o.a.kafka.common.utils.AppInfoParser     : Kafka version : 2.0.1
2019-03-11 07:34:36.945  INFO 1 --- [  restartedMain] o.a.kafka.common.utils.AppInfoParser     : Kafka commitId : fa14705e51bd2ce5
2019-03-11 07:34:37.149  WARN 1 --- [  restartedMain] org.apache.kafka.clients.NetworkClient   : [Consumer clientId=consumer-1, groupId=spring-template] Connection to node -1 could not be established. Broker may not be available.

我有一个名为 bootstrap 的 kubernetes 服务,在 kubernetes 集群的命名空间 kafka 中运行。这是日志文件的sn-p。为什么 spring boot 应用程序没有拾取配置好的 bootstrap.servers 配置

【问题讨论】:

    标签: kubernetes apache-kafka spring-kafka


    【解决方案1】:

    bootstrap-servers 属性需要一个 Kafka 服务器地址列表。通过在值周围加上引号,您表示该值是一个字符串,因此会产生类型冲突。

    要解决此问题,您应该删除引号或将值明确放在列表形式中。例如:

    spring:
      kafka:
        consumer:
          bootstrap-servers: ["bootstrap.kafka.svc.cluster.local:9092"]
    

    【讨论】:

    • 感谢 Lukas,您在查看服务器列表时为我指明了正确的方向。我没有包括上面的完整弹簧配置,它是基于配置文件的。仔细查看上述日志后,我意识到它正在尝试连接到 localhost:9092 而不是 bootstrap.kafka.svc.cluster.local:9092。使用正确的配置文件后,即使在上述情况下也可以正常工作。
    【解决方案2】:

    有时,实际上是您的 Kafka Kubernetes 部署出了问题。

    我可以看看你的 Kafka 部署 YAML/JSON 文件吗?

    应该是这样的:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: api-kafka
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: kafka
          id: "0"
      template:
        metadata:
          labels:
            app: kafka
            id: "0"
        spec:
          containers:
            - name: kafka
              image: wurstmeister/kafka:latest
              ports:
                - containerPort: 30035
              env:
                - name: KAFKA_ADVERTISED_HOST_NAME
                  valueFrom:
                    fieldRef:
                      fieldPath: status.podIP
    
                - name: KAFKA_ADVERTISED_PORT
                  value: "9092"
    
                - name: KAFKA_HEAP_OPTS
                  value: -Xms320m
    
                - name: KAFKA_ZOOKEEPER_CONNECT
                  value: "zookeeper:2181"
    
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: api-kafka
      namespace: default
      labels:
        name: kafka
    spec:
      ports:
        - port: 9092
          name: kafka-port
          protocol: TCP
      selector:
        app: kafka
        id: "0"
    
      type: NodePort
    
    

    强调:

    - name: KAFKA_ADVERTISED_HOST_NAME
      valueFrom:
          fieldRef:
              fieldPath: status.podIP
    

    确保您的配置文件正确,这将解决您在 Kubernetes 部署中与连接和广告主机名有关的所有问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-25
      • 2021-09-08
      • 2015-05-27
      • 1970-01-01
      • 2021-12-15
      • 1970-01-01
      • 2021-06-22
      • 2020-08-10
      相关资源
      最近更新 更多