在不同的 AWS 账户中通过网络负载均衡器AWS访问 Cassandra

问题描述

我已经在 aws 帐户中的 kubernetes 上安装了 cassandra(三个节点)。

我想通过 aws 端点(通过 NLB)打开同一个 cassandra 到不同的 aws 帐户,以便我可以访问这个 cassandra 进行读/写。

我正在使用 spark(在不同的 AWS 帐户中)在 cassandra 中加载数据,但我在加载数据时收到此警告。

WARN ChannelPool: [s0|/10.0.246.140:32034] Error while opening new channel (ConnectionInitException: [s0|connecting...] Protocol initialization request,step 1 (STARTUP {CQL_VERSION=3.0.0,DRIVER_NAME=DataStax Java driver for Apache Cassandra(R),DRIVER_VERSION=4.7.2,CLIENT_ID=b52c9022-561a-48d3-bd98-893c6c17f0c3,APPLICATION_NAME=spark-cassandra-connector-application_1606197155514_0510}): Failed to send request (java.nio.channels.NotYetConnectedException))

有人通过 NLB 打开 Cassandra,我是否需要为 NLB 中的 cassandra 中的每个节点制作单独的路由?如果是,该怎么做?

解决方法

您需要定义 K8s 服务并通过 Ingress controller(例如 Traefik)公开它,以便客户端(例如您的 Spark 应用程序)可以从 Kubernetes 集群外部连接到您的 Cassandra 集群。

如果您使用 DataStax Cassandra Operator (cass-operator),它会更容易,因为它预先配置了您可以使用的服务。请参阅我们在 Connecting to Cassandra from outside the Kubernetes cluster 中包含的 Ingress 示例。

如果您还不知道,请查看开源 K8ssandra。它是一个现成的平台,可在 Kubernetes 中使用 DataStax Cassandra Operator 运行 Apache Cassandra,但所有工具都捆绑在一起:

  • Reaper 用于自动修复
  • Medusa 用于备份和恢复
  • Metrics Collector 用于使用 Prometheus + Grafana 进行监控
  • 用于 k8s 集群入口的 Traefik 模板

由于所有这些组件都是开源的,因此它们都可以免费使用,不需要许可证或付费订阅,但仍具有强大的社区支持。干杯!