【问题标题】:How to set up secure cockroachdb on Kubernetes to be accessible from NodeJs如何在 Kubernetes 上设置可从 NodeJs 访问的安全 cockroachdb
【发布时间】:2025-12-03 04:45:01
【问题描述】:

我是 Kubernetes 和 CockroachDB 的新手。我有一个在 Kubernetes 集群上运行的安全多节点节点数据库,并且能够将其暴露在外部并使用 cockroach UI 对其进行监控。

现在我想使用 pg for Node 或 sequelize 从节点应用程序访问它。但是我得到连接超时。

我相信我必须创建一个客户端证书并使用它来建立连接,但我找不到关于如何执行此操作的 Kubernetes 特定文档。 如果有人成功了,你是如何创建证书的,你是如何在你的节点应用程序中使用它的?

【问题讨论】:

  • 你是如何部署蟑螂的?有一个舵图。您是否将节点应用部署到同一个集群中?
  • 您的应用需要在同一个 kubernetes 集群中运行才能获得客户端证书 (see docs),或者您可以使用 sslmode=require 运行(警告:该模式下不是 MITM 保护)。
  • 我使用了蟑螂记载的方法。 cockroachlabs.com/docs/stable/… 。一切都适用于本地内置客户端。现在我希望能够从外部应用程序访问它,而不是任何 kubernetes 环境的一部分。
  • 如果您想从外部 Kubernetes 访问安全部署,则需要降低 ssl 级别以跳过主机检查,甚至在没有 ca.crt 的情况下忽略 CA。

标签: kubernetes pg cockroachdb


【解决方案1】:

我已经弄清楚了如何通过获取我为本地 sql 客户端生成的证书并在我的节点应用程序中重新使用它们来做到这一点 - 就像这样

const pool = new Pool({
  host: 'xxxx',
  max: 20,
  idleTimeoutMillis: 30000,
  connectionTimeoutMillis: 2000,
  port:26257,
  user:"root",
  database:"xxxx",
  ssl : {
      rejectUnauthorized : false,
      ca   : fs.readFileSync("./ca/ca.crt").toString(),
      key  : fs.readFileSync("./ca/client.xxxx.key").toString(),
      cert : fs.readFileSync("./ca/client.xxxx.crt").toString()
  }

});

我像这样在 Kubernetes 中将公共 pod 作为服务公开

kubectl expose service cockroachdb-public --port=26257 --target-port=26257 --name=cp --type=LoadBalancer

并获取最终分配给服务的外部 IP 地址。

实际上非常简单,但是当您第一次接近它时会挠头。感谢那些花时间发表评论的人。

@samstride 刚刚注意到您的评论。使用 root 以外的用户可能会更好,但您可以像这样获得这些证书(可能也可以通过其他方式)。

ca(如果您仍在运行,请使用 cockroachdb-client-secure pod)

kubectl exec cockroachdb-client-secure -it -- cat /cockroach-certs/ca.crt  > ./ca.crt

kubectl get secret default.client.root -o jsonpath='{.data.key}' | base64 --decode > client.root.key 

证书

kubectl get secret default.client.root -o jsonpath='{.data.cert}' | base64 --decode > client.root.crt

【讨论】:

  • 这是真的最好的方法吗?您已将端口设为可公开访问。似乎它可以被滥用。我假设 nodeJS 在集群内运行,这意味着没有必要将端口暴露给互联网......
  • 是的,你说的很对。 api 和数据库在私有 kubernetes 集群中运行,并且可以在该环境中进行通信,api 通过 àn 入口服务公开,而 dB 根本不公开。这只是为了能够从外部开发环境或 dB 客户端(如 postico)获得与 dev dB 的 dB 连接。
  • 嗨,我处于类似情况 - 我使用 link 的文档在 GCP Kubernetes Engine 上设置了一个 DEV DB 集群 - 我已经运行了“kubectl expose service cockroachdb-public ... “创建一个负载均衡器并公开可用我在我的本地机器上有代码,我需要获取 3 个文件才能连接到数据库 - ca.crt、client.key、c​​lient.crt 你能分享一下你是怎么做的吗?这样做是“通过获取我为本地 sql 客户端生成的证书”。提前致谢。
  • @bruce 感谢分享如何获取密钥和证书。似乎 cockroach DB 托管服务现在正在做同样的事情,以便使用其托管服务的人可以从集群外部连接到数据库。很高兴知道他们是否真的在做您所做的事情,或者是否有不同/更好的方法来实现相同的最终结果。
  • @samstride 我已经用一组脚本记录了在 Kubernetes 上设置安全 cockroachdb 的整个过程。有关用户证书的所有信息,请参见步骤 9-16。 ramblings.mcpher.com/Home/excelquirks/cloudplatform/…