从集群外的应用程序访问 kubernetes 中的 postgres

san*_*osh 7 postgresql kubernetes

我正在尝试从另一个运行在另一个 centos vm 上的应用程序访问部署在 centos vms 上的 kubernetes(kubeadm) 中的 postgres db。我已将 postgres 服务部署为“NodePort”类型。我的理解是我们只能在 AWS/Azure 等云提供商上而不是在裸机虚拟机上将其部署为 LoadBalancer 类型。所以现在我正在尝试使用 NodePort 类型的服务配置“入口”。但是除了在 kubernetes master 上使用 kubectl exec $Pod-Name 之外,我仍然无法访问我的数据库。

我的 ingress.yaml 是

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: postgres-ingress
spec:
  backend:
    serviceName: postgres
    servicePort: 5432
Run Code Online (Sandbox Code Playgroud)

它没有显示任何地址,如下所示

NAME                    HOSTS   ADDRESS    PORTS   AGE
postgres-ingress        *                  80      4m19s
Run Code Online (Sandbox Code Playgroud)

我什至无法从我本地 mac 上的 pgadmin 访问它。我错过了什么吗?

任何帮助都受到高度赞赏。

Dir*_*aio 10

Ingress 不会工作,它只是为 HTTP 流量设计的,Postgres 协议不是 HTTP。您需要仅处理原始 TCP 流量的解决方案:

  • 仅 NodePort 服务就足够了。这可能是最简单的解决方案。通过kubectl describe在服务上执行来找出端口,然后将您的 Postgres 客户端连接到该端口上的节点 VM(不是 pod 或服务)的 IP。
  • 您可以使用 port-forwarding: kubectl port-forward pod/your-postgres-pod 5432:5432,然后将您的 Postgres 客户端连接到localhost:5432. 这是我从本地机器访问数据库的首选方式(它非常方便和安全),但我不会将它用于生产工作负载(kubectl 必须始终运行,因此它有点脆弱,您无法获得最佳性能) .
  • 如果进行特殊的网络配置,则可以直接从集群外部访问服务或 pod 的 IP。您必须将 pod 和服务 CIDR 范围的流量路由到 k8s 节点,这可能涉及配置您的虚拟机管理程序、路由器和防火墙,并且高度依赖于您为 Kubernetes 集群使用的网络 (CNI) 插件。