如何在Microk8s集群中访问本地安装的Postgresql

时间:2020-03-10 21:30:48

标签: postgresql kubernetes ubuntu-18.04 microk8s

我已经在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 字段中输入什么内容?

1 个答案:

答案 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:5432postgresql: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

相关问题