首页 > 解决方案 > 从 EKS 中运行的服务访问 MSK 集群

问题描述

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

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

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

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

我的问题:

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

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

标签: amazon-web-serviceskubernetesamazon-eksaws-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 代理端口 9094 提供的 Kafka 代理的逗号分隔 DNS 名称。 https://docs.spring.io/spring-cloud-stream/docs/ Brooklyn.RELEASE/reference/html/_apache_kafka_binder.html

编辑 :

我使用 ExternalName + NLB 的第一个选项是更好的方法,因为如果 MSK Kafka 代理的 AWS DNS 名称发生更改,或者如果您想将新代理添加到 MSK,或者如果您需要指向 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 的成本。


推荐阅读