Kafka on kubernetes 集群与 Istio

gko*_*cur 6 apache-kafka kubernetes istio

我有带有 Istio v1.6.4 的 k8s 集群。默认情况下禁用边车注入。我在安装了 strimzi kafka 操作员的 k8s 上运行了 Kafka 集群。当 kafka 和客户端 pod 没有注入 Istio-proxy 时,Kafka 集群可以正常工作。我的问题:当我使用 kafka 客户端创建一个 pod 并注入 Istio-proxy 时,我无法连接到 Kafka 集群。客户端的日志:

java.io.IOException: Connection reset by peer
Run Code Online (Sandbox Code Playgroud)

在服务器端: org.apache.kafka.common.network.InvalidReceiveException: Invalid receive (size = 369295616 larger than 104857600)

在谷歌搜索并检查 Istio-proxy 日志后,发现问题在于 Istio-proxy 使用 TLS 连接到 kafka 明文端点。我可以通过设置默认的 PeerAuthentication 来解决这个问题,mtls.mode: DISABLED但我不想为它设置全局设置。

如果我创建一个简单的 k8s 服务并在运行 kafka 服务器的 pod 上运行 netcat“服务器”,并在运行 kafka 客户端的 pod 上运行 netcat“客户端”,那么有什么奇怪的 - 一切正常。

我有两个问题:

  1. 为什么 kafka Istio-proxy 在连接到 Kafka 集群时的行为与其他 TCP 连接(如使用 nc)不同?
  2. 如何仅为一台主机禁用 mtls?我正在玩 PeerAuthentication 但没有运气...

gko*_*cur 5

jt97的帮助下,我能够解决这个问题。

正如我写的那样,我正在使用Strimzi Operator在 k8s 上安装 kafka 集群。它创建了 2 个服务:

  • kafka-bootstrap - 这是一个带有 ClusterIP 的常规服务
  • kafka-brokers - 无头服务。

在我的例子中,服务的全名分别是kafka-kafka-operated-kafka-bootstrapkafka-kafka-operated-kafka-brokers

我创建了一个 DestinationRule:

apiVersion: networking.istio.io/v1beta1
kind: DestinationRule
metadata:
  name: kafka-no-tls
spec:
  host: "kafka-kafka-operated-kafka-brokers"
  trafficPolicy:
    tls:
      mode: DISABLE
Run Code Online (Sandbox Code Playgroud)

并在连接到 kafka 时使用了无头服务:

kafka-topics --bootstrap-server kafka-kafka-operated-kafka-brokers:9092 --list
__consumer_offsets
_schemas
Run Code Online (Sandbox Code Playgroud)

它按预期工作。

顺便说一句,设置tls.modeSIMPLE没有帮助。

老实说,我仍然不明白为什么在这种特殊情况下,默认情况下 Istio-proxy(没有 DestinationRule)尝试与 TLS 连接 - 根据文档

默认情况下,Istio 会跟踪迁移到 Istio 代理的服务器工作负载,并配置客户端代理以自动向这些工作负载发送双向 TLS 流量,并将纯文本流量发送到没有 sidecar 的工作负载。