我有一个在AWS上的Kubernetes中运行的Cassandra集群(使用孵化器Helm图表)。当我使用负载均衡器公开节点时,Datastax无法以所需的方式直接连接到节点,因为它尝试使用Kubernetes网络内部的IP。但是它仍然可以通过负载均衡器成功读取和写入。 This is not recommended however,所以我正在寻找合适的解决方案。
有没有办法使datastax与该设置正确连接?是否需要更改容器内的cassandra.yaml
(糟糕)?
答案 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中公开容器。该服务可以是NodePort
或LoadBalancer
端口,以便您可以进行外部访问。
您还必须在服务和Deployment / StatefulSet上都添加一个Selector
,以便您的服务可以附加正确的Endpoints