如何在microk8s集群中访问本地安装的postgresql
我已经在Ubuntu18上安装了Postgresql和microk8s。如何在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
我的一个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安装在同一个虚拟机上。至于你的问题,这很容易做到。我很快会发布我的答案。谢谢你的帮助,但是当我尝试这个时,我在podorg.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添加静态条目是没有意义的