2

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

4

1 回答 1

2

首先,您需要将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

于 2020-03-11T20:38:24.820 回答