将 Kubernetes 上的 CockroachDB 暴露给 public IP

exposing CockroachDB on Kubernetes to public IP

我在 Google Kubernetes Engine 上的 Kubernetes 集群中有一个 CockroachDB 实例 运行。我正在尝试公开端口 26257,以便我可以从本地计算机连接到它。

所述,端口转发到 pod 将不起作用。

我有一个 nginx-ingress 控制器,用于从我的域名路径映射到服务,所以我尝试使用它:

我将我的 db-cockroachdb-public 服务从 ClusterIP 更改为 NodePort:

type: NodePort

我将这些行添加到我的 nginx-controller YAML 中:

-name: postgresql

nodePort: 30472

port: 26257

protocol: TCP

targetPort: 26257

这些行到我的入口 YAML:

- host: db.mydomain.com
  http:
    paths:
    - path: /
      backend:
        serviceName: db-cockroachdb-public
        servicePort: 26257

但是,我无法连接到数据库 - 连接被拒绝。我也尝试在 nginx 控制器中禁用 SSL 重定向,但它仍然不起作用。

我也尝试了 ConfigMap,但它没有做任何事情:

https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/exposing-tcp-udp-services.md

我不知道从技术上讲它是否应该可以通过 nginx 实例代理 CockroachDB,但您的设置因其他原因而失败。当在规则部分指定一个 servicePort 时,你告诉 k8s 哪个端口暴露给服务。映射本身默认发生在端口 80/443,而不是您想要的端口。因此,您应该尝试只询问您的情况的端口 80。

有几种方法可以解决这个问题。大多数与更改入口配置或连接服务的方式有关,我不打算讨论这些。另一种选择是使端口转发工作以消除对入口机制的需求。

您可以通过稍微修改 CockroachDB 配置文件来使端口转发工作。将 the invocation of the Cockroach binary 中的 --host 标志的名称更改为 --advertise-host。这样,进程除了监听其主机名外,还将监听本地主机,这将使端口转发工作。

编辑:为了跟进这一点,我将 CockroachDB 存储库中的默认配置切换为使用 --advertise-host 而不是 --host,因此端口转发现在默认工作。