【问题标题】:SSL handshake failed in Kafka brokerKafka 代理中的 SSL 握手失败
【发布时间】:2021-07-03 21:25:42
【问题描述】:

我在 Kubernetes 中有一个使用 Strimzi 创建的 Kafka 集群。

apiVersion: kafka.strimzi.io/v1beta1
kind: Kafka
metadata:
  name: {{ .Values.cluster.kafka.name }}
spec:
  kafka:
    version: 2.7.0
    replicas: 3
    storage:
      deleteClaim: true
      size: {{ .Values.cluster.kafka.storagesize }}
      type: persistent-claim
    rack: 
      topologyKey: failure-domain.beta.kubernetes.io/zone
    template:
      pod:
        metadata:
          annotations:
            prometheus.io/scrape: 'true'
            prometheus.io/port: '9404'                                           
    listeners:
      - name: plain
        port: 9092
        type: internal
        tls: false
      - name: tls
        port: 9093
        type: internal
        tls: true
        authentication:
          type: tls
      - name: external
        port: 9094
        type: loadbalancer
        tls: true
        authentication:
          type: tls
        configuration:  
          bootstrap:
            loadBalancerIP: {{ .Values.cluster.kafka.bootstrapipaddress }}
          brokers:  
          {{- range  $key, $value := (split "," .Values.cluster.kafka.brokersipaddress) }}  
            - broker: {{ (split "=" .)._0 }}
              loadBalancerIP: {{ (split "=" .)._1 | quote }}
          {{- end }}
    authorization:
      type: simple

集群已创建并启动,我能够创建主题并从主题生成/消费。 问题是,如果我执行到 Kafka 代理 pod 之一,我会看到间歇性错误

INFO [SocketServer brokerId=0] Failed authentication with /10.240.0.35 (SSL handshake failed) (org.apache.kafka.common.network.Selector) [data-plane-kafka-network-thread-0-ListenerName(EXTERNAL-9094)-SSL-9]

INFO [SocketServer brokerId=0] Failed authentication with /10.240.0.159 (SSL handshake failed) (org.apache.kafka.common.network.Selector) [data-plane-kafka-network-thread-0-ListenerName(EXTERNAL-9094)-SSL-11]

INFO [SocketServer brokerId=0] Failed authentication with /10.240.0.4 (SSL handshake failed) (org.apache.kafka.common.network.Selector) [data-plane-kafka-network-thread-0-ListenerName(EXTERNAL-9094)-SSL-10]

INFO [SocketServer brokerId=0] Failed authentication with /10.240.0.128 (SSL handshake failed) (org.apache.kafka.common.network.Selector) [data-plane-kafka-network-thread-0-ListenerName(EXTERNAL-9094)-SSL-1]

在检查了这些 IP [10.240.0.35, 10.240.0.159, 10.240.0.4,10.240.0.128] 之后,我发现它们与 kube-system 命名空间中的 pod 相关,这些命名空间是作为 Kafka 集群部署的一部分隐式创建的。

知道有什么问题吗?

【问题讨论】:

    标签: kubernetes apache-kafka strimzi


    【解决方案1】:

    我认为这不一定是错误的。您似乎有一些应用程序在没有正确配置 TLS 的情况下尝试连接到代理。但是随着连接被转发,IP 可能会被屏蔽 - 所以它不再显示真正的外部 IP。这些可能是各种各样的事情,从错误配置的客户端到尝试打开 TCP 连接的一些健康检查(例如,根据您的环境,负载均衡器可以做到这一点)。

    不幸的是,要找出它们的真正来源有点困难。您可以尝试通过 whoeevr 的日志来跟踪它,它拥有它来自的 IP 地址,因为它是从其他人转发的等等。您还可以尝试使用 Java 系统属性在 Kafka 中启用 TLS 调试 javax.net.debug=ssl。但这可能仅在某些情况下对错误配置的客户端有所帮助,而不是对某些 TPC 探测有帮助,而且它还会使在日志中找到正确的位置变得困难,因为它还会转储使用 TLS 的复制流量等。

    【讨论】:

    • 感谢 Jakub 的回复。为了隔离问题,我确保没有应用程序正在运行并尝试连接到 Kafka 集群。连接到 Kafka 时出现 SSL 问题的 IP 来自 kube-system 命名空间 pod(用于实现集群功能的内部 pod)。因此,即使没有尝试连接到 Kafka 的外部应用程序,我仍然会在 Kafka 代理 pod 中观察到这些错误。
    • IP 地址具体指向哪些 pod?到kube-proxy 豆荚?或者是其他东西? kube-system 中的一些 pod 负责将连接路由到 Kafka pod。另外,正如我所说......请记住,这不一定是 Kafka 应用程序本身。它可能是来自负载均衡器或其他一些组件的一些健康检查探针。它可能是一些监控工具等。基本上任何尝试连接到 Kafka SSL 侦听器并且不进行 TLS 握手的东西都会产生这样的错误。
    • 是的,它主要是 kube-proxy pod。这些 pod 是内部的,不应使用外部端口,对吗?如果是这样,为什么在错误中显示“data-plane-kafka-network-thread-0-ListenerName(EXTERNAL-9094)-SSL-1”
    • 我不确定你用什么作为外部监听器。但我的理解是,至少在某些情况下,与节点端口或负载均衡器的连接会到达您的一个工作节点,并从那里通过kube-proxy 传递到代理 pod。这在某种程度上可以是外部流量策略(strimzi.io/docs/operators/latest/full/…)的控制器。但总的来说,预计kube-proxy 会在中间。这可以掩盖原始IP地址。至少这是我的理解。
    • 感谢您的意见,我们会进一步调查。
    猜你喜欢
    • 1970-01-01
    • 2022-11-18
    • 1970-01-01
    • 2019-05-05
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-11-17
    • 2018-07-28
    相关资源
    最近更新 更多