【问题标题】:Connecting Datastax outside Kubernetes to a Cassandra cluster in Kubernetes将 Kubernetes 外部的 Datastax 连接到 Kubernetes 中的 Cassandra 集群
【发布时间】:2019-03-11 11:54:21
【问题描述】:

我有一个 Cassandra 集群在 AWS 上的 Kubernetes 中运行(使用孵化器 Helm 图表)。当我使用负载均衡器公开节点时,Datastax 无法以它想要的方式直接连接到节点,因为它尝试使用 Kubernetes 网络内部的 IP。但它仍然可以通过负载均衡器成功读写。 This is not recommended however 所以我正在寻找合适的解决方案。

有没有办法让 datastax 与此设置正确连接?是否需要更改容器内的cassandra.yaml(恶心)?

【问题讨论】:

  • 如果您发布您的 cassandra.yml,我也会有所帮助
  • 我刚刚在官方 helm repo 上使用了 Cassandra helm chart。除了我添加了一个针对 Cassandra pod 的负载均衡器

标签: cassandra kubernetes datastax-java-driver


【解决方案1】:

首先。您不能为此目的使用 LoadBalancer。

像这样设置服务:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: cassandra
  name: cassandra
spec:
  type: NodePort
  ports:
  - port: 9042
    nodePort: 30042
  selector:
    app: cassandra

nodePort 将在 Kubernetes 集群之外可用。 nodePort 必须在 30000-32767 之间。

从 datastax 驱动程序连接到 K8S_NODE_IP:NODEPORT(不是 pod ip)。

【讨论】:

  • Datastax 尝试连接节点时仍然出现错误,因为节点不会将自身(或其对等节点)视为K8S_NODE_IPs。如果我也修改cassandra.yamls,听起来这样可以工作,但我希望避免这种情况。
  • 你得到什么错误?我自己测试过,效果很好。这是我的代码:pastebin.com/A5kHGQGM
【解决方案2】:

一种选择是在驱动程序中使用地址转换器:

https://docs.datastax.com/en/developer/java-driver/3.5/manual/address_resolution/

但是请注意,您将失去驱动程序方面的功能,例如令牌感知负载平衡等。

最好的方法是提供从您的应用到所有 C* 节点的直接连接,以便它可以建立到每个节点的连接。

【讨论】:

    【解决方案3】:

    您可以创建一个Kubernetes service 来公开您的 Deployment 或 StatefulSet 中的 pod。该服务可以是NodePortLoadBalancer 端口,以便您可以进行外部访问。

    您还必须在您的服务和 Deployment/StatefulSet 上添加 Selector,以便您的服务可以附加正确的 Endpoints

    【讨论】:

    • 我更新了我的问题,以便更清楚地了解我的设置。我已经尝试过 LoadBalancer,但它并不理想
    • 是否需要使用内部IP? Cassandra 可以发布另一个 IP 吗?如果它可以发布hostIP,那么您可以使用NodePort
    • 我相信这需要我在 pod 内修改 cassandra.yaml,这会消除这里使用 Kubernetes 的一些吸引力
    • 那么您需要修改部署或 statefulset 定义,但 helm chart 部署它。
    • Cassandra 有监听和广播地址,所以你的设置需要正确配置它们
    猜你喜欢
    • 1970-01-01
    • 2017-11-08
    • 2020-06-24
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    • 2020-06-10
    • 2020-12-14
    • 2021-12-16
    相关资源
    最近更新 更多