在 Kubernetes 上公开 Cassandra 运行
Expose Cassandra running on Kubernetes
我是 运行 Kubernetes 上的 Cassandra(3 个实例),想将其暴露给外部,我的应用程序还没有在 Kubernetes 中。所以我创建了一个负载平衡服务,如下所示:
apiVersion: v1
kind: Service
metadata:
namespace: getquanty
labels:
app: cassandra
name: cassandra
annotations:
kubernetes.io/tls-acme: "true"
spec:
clusterIP:
ports:
- port: 9042
name: cql
nodePort: 30001
- port: 7000
name: intra-node
nodePort: 30002
- port: 7001
name: tls-intra-node
nodePort: 30003
- port: 7199
name: jmx
nodePort: 30004
selector:
app: cassandra
type: LoadBalancer
这是结果是:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cassandra 10.55.249.88 GIVEN_IP_GCE_LB 9042:30001/TCP,7000:30002/TCP,7001:30003/TCP,7199:30004/TCP 26m
我可以使用 sh (cqlsh GIVEN_IP_GCE_LB ) 进行连接,但是当我尝试使用节点的 datastax 驱动程序将数据添加到 Cassandra 时,我得到了这个:
message: 'Cannot achieve consistency level SERIAL',
info: 'Represents an error message from the server',
code: 4096,
consistencies: 8,
required: 1,
alive: 0,
coordinator: '35.187.166.68:9042' },
'10.52.4.32:9042': 'Host considered as DOWN',
'10.52.2.15:9042': 'Host considered as DOWN' },
info: 'Represents an error when a query cannot be performed because no host is available or could be reached by the driver.',
message: 'All host(s) tried for query failed. First host tried, 35.187.166.68:9042: ResponseError: Cannot achieve consistency level SERIAL. See innerErrors.' }
我的第一个想法是我也需要公开其他端口,所以我做了(节点内、tls-节点内、jmx),但它是同样的错误。
Kubernetes 允许您访问代理,我尝试使用构建的 URL 从我的机器代理以测试我是否有访问权限,但我无法使用 cqlsh 连接:
http://127.0.0.1:8001/api/v1/namespaces/qq/pods/cassandra-0:cql/proxy
我没有想法,剩下要做的一件事就是公开每个实例(为每个实例创建一个服务),这非常丑陋,但它会让我从外部连接到节点,直到我迁移应用程序到 Kubernetes。
有没有人知道如何将 Cassandra 节点公开到 Internet 并使 Datastax 驱动程序知道所有节点?谢谢你的时间。
经过更多阅读,我发现复制策略是导致问题的原因,NetworkStrategy 适用于多集群,我有一个,所以我将复制更改为简单的节点数,现在一切都按预期工作。
编辑 1:
将数据库放在 Kube 上不是一个好的解决方案,我最终制作了一个独立的集群,将其添加到与 kube 相同的网络中,并且能够从 kube pods.
访问它
Kube 是用来管理应用程序并使它们成为它们的'elastic',我不认为人们真的需要像应用程序一样快速扩展数据库,此外,数据库的扩展与操作不同无状态应用程序。
您需要为您创建的复制控制器使用无头服务。
您的服务应该是这样的:
apiVersion: v1
kind: Service
metadata:
labels:
app: cassandra
name: cassandra
spec:
clusterIP: None
ports:
- port: 9042
selector:
app: cassandra
此外,您可以参考下面link并调出一个cassandra集群。
https://github.com/kubernetes/kubernetes/tree/master/examples/storage/cassandra
我会推荐 运行 通过复制控制器或 statefulset 或 daemonset 的 cassandra pod,因为 kubernetes 会在需要时管理 restart/rescheduling pod。
我是 运行 Kubernetes 上的 Cassandra(3 个实例),想将其暴露给外部,我的应用程序还没有在 Kubernetes 中。所以我创建了一个负载平衡服务,如下所示:
apiVersion: v1
kind: Service
metadata:
namespace: getquanty
labels:
app: cassandra
name: cassandra
annotations:
kubernetes.io/tls-acme: "true"
spec:
clusterIP:
ports:
- port: 9042
name: cql
nodePort: 30001
- port: 7000
name: intra-node
nodePort: 30002
- port: 7001
name: tls-intra-node
nodePort: 30003
- port: 7199
name: jmx
nodePort: 30004
selector:
app: cassandra
type: LoadBalancer
这是结果是:
NAME CLUSTER-IP EXTERNAL-IP PORT(S) AGE
cassandra 10.55.249.88 GIVEN_IP_GCE_LB 9042:30001/TCP,7000:30002/TCP,7001:30003/TCP,7199:30004/TCP 26m
我可以使用 sh (cqlsh GIVEN_IP_GCE_LB ) 进行连接,但是当我尝试使用节点的 datastax 驱动程序将数据添加到 Cassandra 时,我得到了这个:
message: 'Cannot achieve consistency level SERIAL',
info: 'Represents an error message from the server',
code: 4096,
consistencies: 8,
required: 1,
alive: 0,
coordinator: '35.187.166.68:9042' },
'10.52.4.32:9042': 'Host considered as DOWN',
'10.52.2.15:9042': 'Host considered as DOWN' },
info: 'Represents an error when a query cannot be performed because no host is available or could be reached by the driver.',
message: 'All host(s) tried for query failed. First host tried, 35.187.166.68:9042: ResponseError: Cannot achieve consistency level SERIAL. See innerErrors.' }
我的第一个想法是我也需要公开其他端口,所以我做了(节点内、tls-节点内、jmx),但它是同样的错误。
Kubernetes 允许您访问代理,我尝试使用构建的 URL 从我的机器代理以测试我是否有访问权限,但我无法使用 cqlsh 连接:
http://127.0.0.1:8001/api/v1/namespaces/qq/pods/cassandra-0:cql/proxy
我没有想法,剩下要做的一件事就是公开每个实例(为每个实例创建一个服务),这非常丑陋,但它会让我从外部连接到节点,直到我迁移应用程序到 Kubernetes。
有没有人知道如何将 Cassandra 节点公开到 Internet 并使 Datastax 驱动程序知道所有节点?谢谢你的时间。
经过更多阅读,我发现复制策略是导致问题的原因,NetworkStrategy 适用于多集群,我有一个,所以我将复制更改为简单的节点数,现在一切都按预期工作。
编辑 1: 将数据库放在 Kube 上不是一个好的解决方案,我最终制作了一个独立的集群,将其添加到与 kube 相同的网络中,并且能够从 kube pods.
访问它Kube 是用来管理应用程序并使它们成为它们的'elastic',我不认为人们真的需要像应用程序一样快速扩展数据库,此外,数据库的扩展与操作不同无状态应用程序。
您需要为您创建的复制控制器使用无头服务。
您的服务应该是这样的:
apiVersion: v1
kind: Service
metadata:
labels:
app: cassandra
name: cassandra
spec:
clusterIP: None
ports:
- port: 9042
selector:
app: cassandra
此外,您可以参考下面link并调出一个cassandra集群。 https://github.com/kubernetes/kubernetes/tree/master/examples/storage/cassandra
我会推荐 运行 通过复制控制器或 statefulset 或 daemonset 的 cassandra pod,因为 kubernetes 会在需要时管理 restart/rescheduling pod。