【问题标题】:kubectl port forwarding to remote postgres portkubectl 端口转发到远程 postgres 端口
【发布时间】:2022-01-18 21:29:33
【问题描述】:

尝试打开 Postgres 端口 5432,以便可以从我的本地计算机访问它。该端口仅从 kubernetes pod 开放。

127.0.0.1:5432 <====> kubernetes-pod <=====> Postgres Server

基本上我想通过我的本地机器访问端口 5432,该端口只能从 kubernetes-pod 访问。我该怎么做。

我试过了,我认为如果 postgres 服务器在同一个 pod 上运行,我认为这会起作用:

kubectl port-forward pod-5bf5c7df9b-xcjsf 5433:5432

注意:PostgreSQL 服务器作为独立的 db 服务器运行,只有 pod 可以访问该端口,我想从我的本地机器访问 PostgreSQL db 端口。

【问题讨论】:

  • port-forward 应该开箱即用,这里有什么问题?
  • 您是否有理由需要一个“中介”Pod?为什么不直接将端口转发到 Postgresql Pod?

标签: kubernetes portforwarding


【解决方案1】:

实现此目的的最简单和最好的方法是在 pod 中使用 socat

您可以使用 alpine/socat container image 创建 pod。然后在这个 pod 中使用端口转发,它将连接转发到目标数据库。

步骤如下:

  1. 创建文件my-postgresql-socat.yaml:
apiVersion: v1
kind: Pod
metadata:
  name: my-postgresql-socat
  labels:
    name: my-postgresql-socat
spec:
  containers:
  - name: my-postgresql-socat
    image: alpine/socat
    command: ["socat", "-dd", "tcp4-listen:5432,fork,reuseaddr", "tcp4:my-postgresql-host:5432"]
    resources:
      limits:
        memory: "64Mi"
        cpu: "50m"
    ports:
      - containerPort: 5432
  1. 使用
  2. 创建一个 pod
kubectl apply -f my-postgresql-socat.yaml
  1. 运行本地端口转发:
oc port-forward my-postgresql-socat 5432:5432

您现在可以通过localhost:5432访问您的数据库

  1. 完成后,删除 pod:
kubectl delete pod my-postgresql-socat

【讨论】:

  • 谢谢 derkoe,这很有魅力!
  • 很高兴听到这个消息:)
【解决方案2】:

试试这个: kubectl port-forward -n &lt;namespace-name&gt; pod/pod-5bf5c7df9b-xcjsf 5432:5432

注意区别:

  1. 如果不是default,则需要指定命名空间
  2. 我通常在 pod 名称前加上 pod/
  3. 本地5432端口连接k8s集群5432端口

此外,最好将端口转发到服务而不是 pod。例如:kubectl port-forward -n namespace svc/service-name 5432:5432,因为 pod 名称会更改,但服务名称不会。而且,请记住,服务端口通常是 5432,但 pod 可能不会在该端口上侦听。

我希望这会有所帮助。我为 CodeZero 工作,我们允许您通过我们的传送功能轻松连接集群资源。查看https://codezero.io

您也可以使用 CodeZero CLI (czctl) 传送到集群中,然后您可以在本地访问 kubernetes 资源:

czctl start
czctl namespace teleport <namespace-name>

然后,只要您在集群中有一个指向 Postgres 的服务,您就可以访问该服务,就好像它在您的计算机上本地运行一样。例如:

创建一个名为 my-postgres-db 的服务,它指向您的 Postgress Pod/Deployment/ReplicaSet pod。然后你可以使用连接

psql -h my-postgres-db ...

【讨论】:

  • 感谢@grant B,但您引用的命令假定 postgres 服务器在同一个 pod 上运行,但事实并非如此。 postgres 服务器作为独立的 db 服务器运行,只有 pod 可以访问该端口。
  • 您是否尝试过在集群中创建一个指向此 Postgres DB 服务器的 k8s 服务,然后您可以运行 czctl namespace teleport &lt;namespace-name 以连接到 Postgres DB?
猜你喜欢
  • 2020-07-30
  • 1970-01-01
  • 2015-03-16
  • 2018-11-11
  • 2018-12-30
  • 1970-01-01
  • 1970-01-01
  • 2022-11-22
  • 2021-05-02
相关资源
最近更新 更多