postgresql - 连接到在 K8s 中运行的 Postgres 数据库(Docker 桌面)
问题描述
连接到 K8s 服务后面的 Postgres 容器时是否需要主机?
我能够通过 sql 驱动程序仅使用用户名、密码和 dbname 进行连接。当使用带有 GORM 的 postgres 驱动程序时,如果 url 中没有主机,它会失败。
问题是路由到 Postgres 容器的服务 IP 地址只有在创建服务并将其应用到集群时才知道。运行代码以连接到 Postgres 容器的容器无权访问此主机变量,无需硬编码或将主机添加到机密并重新应用机密文件。
从另一个容器通过 K8s 服务动态连接 Postgres 容器的正确方法是什么?
解决方案
实现这一点的惯用方法是使用service name
ashostname
和port
the service
is 暴露。
在同一个地方namespace
,一个service name
人就足够了。IE
my-service-name:8080
在不同的命名空间中,您可以将命名空间附加到服务名称,作为容器完全限定域名的一部分。IE
my-service.my-namespace:8080
此外,许多工具甚至浏览器都在使用default ports
. 因此,如果您要公开您的service
on并希望使用 letport 80
来达到它,您可以省略默认情况下使用的since 。HTTP
curl
port
curl
port 80
curl my-service
请注意,在这种情况下,甚至协议都被省略了,默认情况下curl
使用HTTP
。如果您想连接HTTPS
到port 8080
a service
,那么您需要同时提供protocol
和port
。
curl https://my-service:8080
这是因为,Kubernetes 运行自己的DNS resolver
. 要了解有关此的更多信息,您可以查看此问题。
为什么 dig 不通过 dns 名称解析 K8s 服务,而 nslookup 没有问题?
environment variables
此外,将容器设置URI
为连接到其他是一种常见的模式services
。这样做的好处是能够在service
任何地方部署您的服务,而不必知道如何预先访问其他服务。container
否则,如果外部的某些东西(例如service name
或port
已更改),您可能需要重建.
推荐阅读
- javascript - 在 Javascript 中重新格式化字符串
- laravel - 为什么获取数据在刀片中不起作用但在 dd 时起作用?
- angular - 改变了角材料的进口
- if-statement - 我想在序列号中排除空白
- python - 如何使用 spaCy 检查文档中是否存在令牌?
- typescript - 如何使用带有 TS 的玩笑来模拟 EventSource(尝试了大部分模拟策略)
- app.yaml - 如何为静态目录索引设置 app.yaml
- python - 如何在python中获得嵌套的href?
- authentication - 找不到 Watson Assistant 登录信息
- r - 函数中的列表应返回多个结果,其中包括一个数据框