将Kubernetes外部的Datastax连接到Kubernetes中的Cassandra集群

时间:2018-10-06 00:21:37

标签: cassandra kubernetes datastax-java-driver

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

有没有办法使datastax与该设置正确连接?是否需要更改容器内的cassandra.yaml(糟糕)?

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:2)

首先。您不能为此目的使用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)。

答案 2 :(得分:0)

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

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