繁体   English   中英

kubernetes 集群上的 Kafka 与 Istio

[英]Kafka on kubernetes cluster with Istio

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

java.io.IOException: Connection reset by peer

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

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

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

我有两个问题:

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

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

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

kafka-topics --bootstrap-server kafka-kafka-operated-kafka-brokers:9092 --list
__consumer_offsets
_schemas

它按预期工作。

顺便说一句,将tls.mode设置为SIMPLE并没有帮助。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM