microk8s集群中如何访问本地安装的postgresql
How to access locally installed postgresql in microk8s cluster
我已经在 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 字段中输入什么?
首先你需要配置你的 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
从 Pods
部署在 Microk8s 集群 中,您应该能够访问节点的 IP 地址,例如你应该能够从你的 Pods
.
ping 提到 10.1.2.3
因为它不需要任何负载平衡,您可以直接从您的 Pods
访问您的 Postgresql,而无需配置额外的 Service
,即将其暴露给您的集群。
如果您不想在您的应用程序中使用它的 IP 地址引用您的 Postgresql 实例,您可以编辑您的 Deployment
(它管理Pods
连接到您的 postgres 数据库)以修改您的 Pods
.
使用的 /etc/hosts
文件的默认内容
通过运行编辑您的应用程序部署:
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
保存后,将根据新规范重新创建此 Deployment
管理的所有 Pods
。当你通过 运行:
进入你的 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 地址.
希望对您有所帮助。
更新:
我差点忘了前段时间我发布了一个非常相似的主题的答案。你可以找到它。它描述了不带选择器的服务的用法,这基本上就是您在问题中提到的内容。是的,它还可以用于配置对同一主机上的 Postgresql 实例 运行 的访问。由于这种 Service
根据其定义没有选择器,no endpoint 是由 kubernetes 自动创建的,您需要创建自己一个人。获得 Postgres 实例的 IP 地址后(在我们的示例中为 10.1.2.3
),您可以在 endpoint 定义中使用它.
一旦你在 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 范围内的主机才允许进行身份验证。
Client authentication is controlled by a configuration file, which
traditionally is named pg_hba.conf and is stored in the database
cluster's data directory. (HBA stands for host-based authentication.)
所以现在您可能想知道在 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
flannel 子网 应该足以确保您的所有 Pods
可以连接到 Posgresql.
我已经在 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 字段中输入什么?
首先你需要配置你的 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
从 Pods
部署在 Microk8s 集群 中,您应该能够访问节点的 IP 地址,例如你应该能够从你的 Pods
.
10.1.2.3
因为它不需要任何负载平衡,您可以直接从您的 Pods
访问您的 Postgresql,而无需配置额外的 Service
,即将其暴露给您的集群。
如果您不想在您的应用程序中使用它的 IP 地址引用您的 Postgresql 实例,您可以编辑您的 Deployment
(它管理Pods
连接到您的 postgres 数据库)以修改您的 Pods
.
/etc/hosts
文件的默认内容
通过运行编辑您的应用程序部署:
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
保存后,将根据新规范重新创建此 Deployment
管理的所有 Pods
。当你通过 运行:
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 地址.
希望对您有所帮助。
更新:
我差点忘了前段时间我发布了一个非常相似的主题的答案。你可以找到它Service
根据其定义没有选择器,no endpoint 是由 kubernetes 自动创建的,您需要创建自己一个人。获得 Postgres 实例的 IP 地址后(在我们的示例中为 10.1.2.3
),您可以在 endpoint 定义中使用它.
一旦你在 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 范围内的主机才允许进行身份验证。
Client authentication is controlled by a configuration file, which traditionally is named pg_hba.conf and is stored in the database cluster's data directory. (HBA stands for host-based authentication.)
所以现在您可能想知道在 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
flannel 子网 应该足以确保您的所有 Pods
可以连接到 Posgresql.