如何在microk8s集群中访问本地安装的postgresql

如何在microk8s集群中访问本地安装的postgresql,postgresql,kubernetes,ubuntu-18.04,microk8s,Postgresql,Kubernetes,Ubuntu 18.04,Microk8s,我已经在Ubuntu18上安装了Postgresql和microk8s。 我的一个microk8s单节点集群内的microservice需要访问安装在同一虚拟机上的postgresql。 一些文章建议我应该像这样创建service.yml和endpoint.yml apiVersion: v1 metadata: name: postgresql spec: type: ClusterIP ports: - port: 5432 targetPort: 5432 --- kin

我已经在Ubuntu18上安装了Postgresql和microk8s。
我的一个microk8s单节点集群内的microservice需要访问安装在同一虚拟机上的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字段中输入什么?

首先,您需要配置您的Postgresql,以便不仅在vm的
本地主机上侦听。假设您有一个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.kubectl edit deployment your-app
microk8s.kubectl exec -ti pod-name -- /bin/bash
从部署在Microk8s集群中的
pod
中,您应该能够访问节点的IP地址,例如,您应该能够从
pod
中ping提到的
10.1.2.3

由于它不需要任何负载平衡,因此您可以直接从
pod
访问Postgresql,而无需配置额外的
服务
,从而将其公开给集群

如果您不想在应用程序中使用您的Postgresql实例的IP地址引用它,您可以编辑您的
Deployment
(它管理连接到您的postgres db的
Pods
)来修改
/etc/hosts
文件的默认内容

通过运行以下命令编辑应用程序部署:

sudo ss -ntlp | grep postgres
microk8s.kubectl edit deployment your-app
microk8s.kubectl exec -ti pod-name -- /bin/bash
并在
Pod
模板
spec
下添加以下部分:

  hostAliases: # it should be on the same indentation level as "containers:"
  - hostnames:
    - postgres
    - postgresql
    ip: 10.1.2.3
保存后,将根据新规范重新创建此
部署管理的所有
pod
。当您通过运行以下命令执行
Pod
时:

sudo ss -ntlp | grep postgres
microk8s.kubectl edit deployment your-app
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实例,它将解析为您的虚拟机的IP地址

我希望有帮助

更新: 我差点忘了,不久前我发布了一个非常类似的主题的答案。你可以找到它。它描述了不带选择器的服务的用法,这基本上就是您在问题中提到的。是的,它还可以用于配置对同一主机上运行的Postgresql实例的访问。由于这种
服务
根据其定义没有选择器,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
这基本上意味着您的文件缺少允许您的
Pod
访问Postgresql数据库所需的条目。身份验证是基于主机的,因此换句话说,只有具有特定IP或IP位于特定IP范围内的主机才允许进行身份验证

客户端身份验证由配置文件控制,配置文件 传统上命名为pg_hba.conf并存储在数据库中 群集的数据目录。(HBA代表基于主机的身份验证。)

因此,现在您可能想知道在
pg_hba.conf
中应该允许哪个网络。处理群集网络Microk8s使用。查看
/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
添加法兰绒子网应该足以确保所有
pod
都可以连接到Posgresql

您是如何部署Postgresql的?你可以分享你的
部署
或者
状态集
缺陷
yaml
?我使用apt get installAhh安装了Postgresql,对不起,我没有仔细阅读所有细节:)你实际上提到microk8s集群和postgres安装在同一个虚拟机上。至于你的问题,这很容易做到。我很快会发布我的答案。谢谢你的帮助,但是当我尝试这个时,我在pod
org.postgresql.util.psqleexception:FATAL:没有主机10.1.7.151的pg_hba.conf条目
中出错,如果我没有错,那么我不应该在pg_hba.conf中添加这个IP,因为如果创建新的pod,它可能会发生更改。
这就是为什么您需要将此配置作为pod的永久部分
您能详细说明一下吗你在说什么?算了吧。我的错误。我从
Pod的
角度看它,就好像它在Postgres日志中一样。让我们总结并澄清一下:Postgresql实例上设置了基于主机的身份验证配置,您已经告知Postgres实例不是kubernetes群集的一部分,但它是使用apt get在您的VM上安装的,与您运行microk8s群集的VM相同,对吗?但是当你试图从你的
Pod
连接到它时,你可以在它的日志中看到上面的错误,它不能被验证,因为它的IP在
pg_hba.conf
中没有条目。你是对的,
Pod
IP是短暂的,每次重新创建
Pod
时都会发生变化,因此,为单个IP添加静态条目是没有意义的