在使用Kubernetes/minikube进行本地开发时,我应该如何连接运行在本地主机上的PostgreSQL数据库?

17

我已经在Google Kubernetes Engine和Google Cloud SQL上搭建了一个应用程序堆栈。在本地开发时,我希望我的应用程序连接到运行在集群外部的postgres数据库服务器,以模拟生产环境。

看来要做到这一点,需要按照这里描述的方式定义一个外部端点:Minikube expose MySQL running on localhost as service

不幸的是,我不能将"127.0.0.1"指定为端点IP地址:

kubectl apply -f kubernetes/local/postgres-service.yaml
service "postgres-db" unchanged
The Endpoints "postgres-db" is invalid: subsets[0].addresses[0].ip: 
Invalid value: "127.0.0.1": may not be in the loopback range (127.0.0.0/8)

所以我被迫将Postgres绑定到我的实际机器地址。

似乎一定有一种方法可以将本地主机的端口映射到本地kubernetes集群中,但到目前为止我找不到方法。

有人知道窍门吗?或者,是否有人可以建议一种不涉及在集群内运行postgres的替代方案?

5个回答

20

可能不是Minikube的答案,但我来分享一下我在Docker for Mac上为Kubernetes所做的。

对于PostgreSQL,我添加了这样的服务:

kind: Service
apiVersion: v1
metadata:
  name: postgres
  namespace: default
spec:
  type: ExternalName
  # https://docs.docker.com/docker-for-mac/networking/#use-cases-and-workarounds
  externalName: host.docker.internal
  ports:
    - name: port
      port: 5432

使用这个设置,我的应用程序能够连接到本地运行的postgres服务器,并使用域名postgres。 Postgres服务器可以使用此设置侦听127.0.0.1


谢谢!这真的很有帮助。 - digitaldreamer
谢谢!这真的很有帮助。 - F___
这很棒,它完美地运行了,但是您是否知道是否有一些资源可以准确地解释它是如何工作的?https://kubernetes.io/docs/concepts/services-networking/service/#externalname - zaf187
我只需要记得将它放在正确的命名空间中,然后它就像魔法般地工作了。 - Kent Bull
2
我只是将 jdbc:postgresql://host.docker.internal:5432/postgres 作为环境变量传递给我的 DB_URL,它就成功连接了。无需创建额外的服务。 - orpheus

3

有一个称为 Telepresence 的潜在解决方案,它允许将本地工作负载代理到群集中,就好像它实际上是在 kube 群集内运行的一样。


谢谢,Telepresence 看起来非常有趣。 - lasersox

1

K8s本地化方法

我曾经在Kubernetes中直接开发云原生软件时遇到了类似的问题。我们也尝试过Telepresence和Skaffold等工具,但它们很难配置且非常耗时。

这就是为什么我和一位同事一起构建了DevSpace CLI: https://github.com/covexo/devspace。请随意查看并尝试使用。通过它,您可以轻松地在Kubernetes中直接运行所有工作负载,同时仍然能够使用桌面工具(本地终端,IDE,git等)进行编程,从而解决您的问题。

备选方案:Minikube网络

由于您正在使用minikube,因此应查看此问题的答案:将内部Kubernetes IP地址路由到主机系统

备选方案:Tunneling

您还可以使用像ngrok这样的本地隧道工具进行本地隧道连接:https://ngrok.com/ (只需在本地启动它,并从任何地方连接到您的ngrok地址即可)


0
在 Mac 上遇到了类似的情况。我的 Postgres 数据库正在本地运行。我所做的是将数据库的凭据作为环境变量传递。特别注意 HOST 变量,它构成连接到数据库的字符串。


apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp
  labels:
    app: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      containers:
      - name: app-container
        image: <YOUR_IMAGE>
        ports:
        - containerPort: 8080
        env:
        - name: POSTGRES_USER
          value: <YOUR_USER>
        - name: POSTGRES_PASSWORD
          value: <YOUR_PASSWORD>
        - name: HOST
          value: docker.for.mac.host.internal
        - name: POSTGRES_DB
          value: <YOUR_DB_NAME>


-1
MySQL服务器应该连接到私有IP,该私有IP可以在应用程序中使用。
首选的方法是创建Kubernetes服务+端点,指向MySQL服务器IP。

我认为你建议的与我链接的另一个答案是相同的。不幸的是,Kubernetes 不允许我将端点指向回环地址上的 PostgreSQL 服务器 IP。我能够让它工作的唯一方法是在我的主要网络接口上公开 PostgreSQL,但我并不真正想这样做。 - lasersox

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接