从 EKS 中运行的服务访问 MSK 集群

问题描述

如果我必须集成外部服务,我有 3 个选项可以使其从 Kubernetes 集群访问。

  1. 在 Kubernetes 服务对象中使用 ExternalName
  2. 在 Kubernetes 服务对象中使用 ExternalIP
  3. 设置端点对象并将端点映射到服务对象

第三个是根据 Kuberenetes 的最佳实践推荐的。如果有多个节点映射到一个服务,端点对象会提供一个选项来列出多个 IP 地址。但不幸的是,端点对象不接受主机名。

因此,在我的场景中,我需要从部署在 AWS-EKS 集群中的服务访问 MKS 集群。如果我将 MKS 视为外部服务,那么我只有一个选择(设置端点和服务),因为我的 MKS 集群有多个节点。但不幸的是 EndPoint 架构只能访问 IP 地址。而且我假设 MKS 集群下的 IP 地址是弹性 IP,我不应该将它们用于我的配置。

我的问题:

  1. 当我尝试在 AES-EKS 服务中部署我的应用程序时,是否需要将 MKS 视为外部服务?如果答案是肯定的,我有哪些选项可以解决这种情况?

  2. 如果 MKS 也部署在 EKS 之上,通过在 VPC 之间正确设置安全组以及 VPC 对等,我是否可以从部署在 EKS 上的服务访问 MSK?

解决方法

您可以创建一个指向 AWS 网络负载均衡器 Kafka 代理端口 9094 的 DNS 名称的 AWS EKS ExternalName 服务,该名称指向 MSK 在 Kafka 代理端口 9094 上提供的 Kafka 代理的 DNS 名称。 https://www.reddit.com/r/aws/comments/cge9nx/suggestions_dns_for_msk_endpoints/

因此,当在 AWS EKS Pod 内运行的 Kafka 客户端将调用 AWS EKS ExternalName 服务时,它将收到一个带有 AWS 网络负载均衡器 DNS 名称的 DNS 记录,它可以使用它来解析 AWS 的 IP 地址网络负载均衡器并向端口 9094 发送请求。

您还可以将在 AWS EKS Pod 内运行的 Kafka 客户端配置为使用 MSK 提供的 Kafka 代理的逗号分隔 DNS 名称和 Kafka 代理端口 9094。 https://docs.spring.io/spring-cloud-stream/docs/Brooklyn.RELEASE/reference/html/_apache_kafka_binder.html

编辑:

我使用 ExternalName + NLB 的第一个选择是更好的方法,因为如果 MSK Kafka Brokers 的 AWS DNS 名称发生变化,或者如果您想向 MSK 添加新的 Broker,或者您需要更改客户端配置,则无需更改客户端配置将 Kafka 客户端指向新的 MSK 代理列表或新的 MSK 集群。

我的第二个选择更容易实施但难以管理。

https://kubernetes.io/docs/concepts/services-networking/service/#externalname 您可以看到,如果您以后决定将 MSK 移到 EKS 中,您只需要将 ExternalName Service 更改为 ClusterIP Service。

此外,我还建议查看 https://aws.amazon.com/blogs/big-data/how-goldman-sachs-builds-cross-account-connectivity-to-their-amazon-msk-clusters-with-aws-privatelink/ 案例研究,其中解释了如何使用 AWS PrivateLink 从多个 AWS 账户/VPC 使用单个 MSK 集群。如果您的 AWS EKS 与 AWS MSK 位于同一 VPC 中,则您的 MSK 集群不需要它。但它允许您跨不同的 AWS EKS 共享单个 AWS MSK 集群,从而节省为每个 AWS EKS 使用一个 AWS MSK 的成本。