首页 > 解决方案 > 连接到在 K8s 中运行的 Postgres 数据库(Docker 桌面)

问题描述

连接到 K8s 服务后面的 Postgres 容器时是否需要主机?

我能够通过 sql 驱动程序仅使用用户名、密码和 dbname 进行连接。当使用带有 GORM 的 postgres 驱动程序时,如果 url 中没有主机,它会失败。

问题是路由到 Postgres 容器的服务 IP 地址只有在创建服务并将其应用到集群时才知道。运行代码以连接到 Postgres 容器的容器无权访问此主机变量,无需硬编码或将主机添加到机密并重新应用机密文件。

从另一个容器通过 K8s 服务动态连接 Postgres 容器的正确方法是什么?

标签: postgresqldockerkubernetes

解决方案


实现这一点的惯用方法是使用service nameashostnameportthe serviceis 暴露。

在同一个地方namespace,一个service name人就足够了。IE

my-service-name:8080

在不同的命名空间中,您可以将命名空间附加到服务名称,作为容器完全限定域名的一部分。IE

my-service.my-namespace:8080

此外,许多工具甚至浏览器都在使用default ports. 因此,如果您要公开您的serviceon并希望使用 letport 80来达到它,您可以省略默认情况下使用的since 。HTTPcurlportcurlport 80

curl my-service

请注意,在这种情况下,甚至协议都被省略了,默认情况下curl使用HTTP。如果您想连接HTTPSport 8080a service,那么您需要同时提供protocolport

curl https://my-service:8080

这是因为,Kubernetes 运行自己的DNS resolver. 要了解有关此的更多信息,您可以查看此问题。

为什么 dig 不通过 dns 名称解析 K8s 服务,而 nslookup 没有问题?

environment variables此外,将容器设置URI为连接到其他是一种常见的模式services。这样做的好处是能够在service任何地方部署您的服务,而不必知道如何预先访问其他服务。container否则,如果外部的某些东西(例如service nameport已更改),您可能需要重建.


推荐阅读