揭露Cassandra在Kubernetes上运行

时间:2017-03-30 17:20:45

标签: node.js cassandra kubernetes cqlsh datastax-node-driver

我在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)进行连接,但是当我尝试使用节点的数据存储驱动程序向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-intra-node,jmx),但它是同样的错误。

Kubernetes让你可以访问代理,我试图使用构建的pod来从我的机器代理,以测试我是否有访问但我无法使用cqlsh进行连接:

http://127.0.0.1:8001/api/v1/namespaces/qq/pods/cassandra-0:cql/proxy

我没有想法,剩下要尝试的是暴露每个实例(为每个实例提供服务)这是非常难看的,但它会让我从外部连接到节点,直到我迁移应用程序到Kubernetes。

是否有人有想法如何将Cassandra节点暴露给互联网并让Datastax驱动程序知道所有节点?谢谢你的时间。

2 个答案:

答案 0 :(得分:1)

经过多次阅读后我发现复制策略是导致问题的那个,NetworkStrategy适用于多集群,我有一个,所以我把复制更改为简单的我拥有的节点数,现在每件事按预期工作。

编辑1: 将数据库放在Kube上并不是一个好的解决方案,我最终建立了一个独立的集群,将其添加到与kube相同的网络中,并且能够从kube pod访问它。

Kube用于管理应用程序并使它们具有“弹性”,我认为人们不需要像应用程序那样快速扩展数据库,此外,数据库的扩展与无状态应用程序的操作不同。 / p>

答案 1 :(得分:-1)

您需要为您创建的复制控制器使用无头服务。

您的服务应该是:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: cassandra
  name: cassandra
spec:
  clusterIP: None
  ports:
    - port: 9042
  selector:
    app: cassandra

此外,您可以参考以下链接并调出cassandra群集。 https://github.com/kubernetes/kubernetes/tree/master/examples/storage/cassandra

我建议通过复制控制器或statefulset或daemonset运行cassandra pod,因为kubernetes会在需要时管理pod的重启/重新安排。