我已经在Ubuntu 18上安装了Postgresql和microk8s。
我在microk8s单节点集群中的一个微服务需要访问安装在同一VM上的postgresql。
一些文章建议我应该像这样创建service.yml和endpoint.yml。
apiVersion: v1
metadata:
name: postgresql
spec:
type: ClusterIP
ports:
- port: 5432
targetPort: 5432
---
kind: Endpoints
apiVersion: v1
metadata:
name: postgresql
subsets:
- addresses:
- ip: ?????
ports:
- port: 5432
现在,我没有在 subsets.addresses.ip 字段中输入什么内容?
答案 0 :(得分:2)
首先,您需要将 Postgresql 配置为不仅监听您的虚拟机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
通过部署在 Microk8s集群中的Pods
,您应该能够访问节点的IP地址,例如您应该可以从您的10.1.2.3
ping提到的Pods
。
由于不需要任何负载平衡,因此您可以直接从Pods
到达 Postgresql ,而无需配置其他Service
,从而将其公开给您的集群
如果您不想使用IP地址在应用程序中引用 Postgresql 实例,则可以编辑Deployment
(管理Pods
的集合)连接到您的postgres db)以修改/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:5432
或postgresql:5432
来引用应用程序中的 Postgres 实例,它将被解析为VM的IP地址。
我希望这会有所帮助。
我几乎忘记了前一段时间,我在一个非常相似的主题上发布了答案。您可以找到它here。它描述了不带选择器的服务的用法,基本上就是您在问题中提到的内容。是的,它还可以用于配置对在同一主机上运行的 Postgresql 实例的访问。由于这种Service
的定义没有选择器,因此 kubernetes 会自动创建无端点,您需要自己创建一个。拥有 Postgres 实例的IP地址(在我们的示例中为10.1.2.3
)后,就可以在端点定义中使用它。
在 kubernetes 侧配置所有内容后, Postgres 仍然可能会遇到问题。在尝试连接到 Postgres 实例的Pod
中,您可能会看到以下错误消息:
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 。