【问题标题】:Expose Cassandra running on Kubernetes公开在 Kubernetes 上运行的 Cassandra
【发布时间】:2017-08-24 18:27:21
【问题描述】:

我在 Kubernetes(3 个实例)上运行 Cassandra,并且想将其公开给外部,我的应用程序尚未在 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.' }

我的第一个想法是我也需要公开其他端口,所以我做了(intra-node、tls-intra-node、jmx),但这是同样的错误。

Kubernetes 允许您访问代理,我尝试使用为 pod 构建的 URL 从我的机器进行代理,以测试我是否可以访问,但我无法使用 cqlsh 连接:

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

我没有想法,剩下要尝试的一件事是公开每个实例(为每个实例创建一个服务),这很丑陋,但它会让我从外部连接到节点,直到我迁移应用程序到 Kubernetes。

有没有人知道如何将 Cassandra 节点公开到 Internet 并使 Datastax 驱动程序知道所有节点?感谢您的宝贵时间。

【问题讨论】:

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


    【解决方案1】:

    经过更多阅读,我发现复制策略是导致问题的原因,NetworkStrategy 适用于多集群,我有一个,所以我将复制更改为简单的节点数,现在一切按预期工作。

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

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

    【讨论】:

    • 没有得到这一行“我将复制更改为简单的节点数”。您使副本与节点数相同?
    • 是的。我最终制作了用于登台和 QA 的集群,阅读了为什么我认为将 Cassandra 放入 Kube 不是一个好的解决方案
    【解决方案2】:

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

    你的服务应该是这样的:

    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 的重启/重新调度。

    【讨论】:

    • 不要急着写,请看我说的!我有一个集群正在运行,我什至包含了服务配置 YAML ...
    猜你喜欢
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2018-08-19
    • 2018-08-15
    • 1970-01-01
    • 2021-07-08
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多