首先,您需要将Postgresql配置为不仅在您的 vm 上侦听localhost
. 假设您有一个 IP 地址为 的网络接口,该网络接口10.1.2.3
在您的节点上配置,在该节点上安装了Postgresql实例。
在您的 中添加以下条目/etc/postgresql/10/main/postgresql.conf
:
listen_addresses = 'localhost,10.1.2.3'
并重新启动您的 postgres 服务:
sudo systemctl restart postgresql
您可以通过运行检查它是否侦听所需的地址:
sudo ss -ntlp | grep postgres
从您Pods
部署在您的Microk8s 集群中,您应该能够访问节点的 IP 地址,例如,您应该能够10.1.2.3
从您的Pods
.
由于它不需要任何负载平衡,您可以直接从您的PostgresqlPods
访问,而无需配置额外的Service
,这会将其暴露给您的集群。
如果您不想在应用程序中使用其 IP 地址引用Postgresql实例,您可以编辑您的Deployment
(管理Pods
连接到您的 postgres 数据库的集合)以修改/etc/hosts
您的Pods
.
通过运行编辑您的应用部署:
microk8s.kubectl edit deployment your-app
Pod
并在模板下添加以下部分spec
:
hostAliases: # it should be on the same indentation level as "containers:"
- hostnames:
- postgres
- postgresql
ip: 10.1.2.3
保存后,您所Pods
管理的所有内容都Deployment
将根据新规范重新创建。当您Pod
通过运行执行时:
microk8s.kubectl exec -ti pod-name -- /bin/bash
您应该在 /etc/hosts 文件中看到附加部分:
# Entries added by HostAliases.
10.1.2.3 postgres postgresql
从现在开始,您可以通过名称在您的应用程序中引用您的Postgres实例,postgres:5432
或者postgresql:5432
它将被解析为您的 VM 的 IP 地址。
我希望它有所帮助。
更新:
我几乎忘记了前段时间我发布了一个非常相似的主题的答案。你可以在这里找到它。它描述了没有 selector的 Service 的用法,这基本上就是您在问题中提到的内容。是的,它还可以用于配置对在同一主机上运行的Postgresql实例的访问。由于这种Service
定义没有选择器,kubernetes不会自动创建端点,您需要自己创建一个。一旦你有了Postgres实例的 IP 地址(在我们的例子中是),你就可以在你的端点定义中使用它。10.1.2.3
一旦你在kubernetes上配置了所有东西,你可能仍然会遇到Postgres的问题。在您Pod
尝试连接到Postgres实例时,您可能会看到以下错误消息:
org.postgresql.util.PSQLException: FATAL: no pg_hba.conf entry for host 10.1.7.151
这基本上意味着您的pg_hba.conf文件缺少允许您Pod
访问Postgresql数据库所需的条目。身份验证是基于主机的,换句话说,只有具有特定 IP 或具有特定 IP 范围内的 IP 的主机才被允许进行身份验证。
客户端身份验证由配置文件控制,该文件传统上命名为 pg_hba.conf 并存储在数据库集群的数据目录中。(HBA 代表基于主机的身份验证。)
所以现在您可能想知道您的pg_hba.conf
. 为了处理集群网络,Microk8s使用flannel。看看你的/var/snap/microk8s/common/run/flannel/subnet.env
文件的内容。我的看起来如下:
FLANNEL_NETWORK=10.1.0.0/16
FLANNEL_SUBNET=10.1.53.1/24
FLANNEL_MTU=1410
FLANNEL_IPMASQ=false
添加到您pg_hba.conf
唯一的法兰绒子网应该足以确保您Pods
可以连接到Posgresql。