kubectl 端口转发到远程 postgres 端口

问题描述 投票:0回答:2

尝试打开 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 服务器作为独立数据库服务器运行,只有 pod 可以访问该端口,我想从本地计算机访问 PostgreSQL 数据库端口。

kubernetes portforwarding
2个回答
7
投票

实现此目的最简单、最好的方法是在 Pod 中使用

socat

您可以使用

alpine/socat
容器镜像 来创建 pod。然后使用 port-forward 进入此 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. 运行本地端口转发:
kubectl port-forward my-postgresql-socat 5432:5432

您现在可以通过

localhost:5432

访问您的数据库
  1. 完成后,删除 Pod:
kubectl delete pod my-postgresql-socat

0
投票

试试这个:

kubectl port-forward -n <namespace-name> 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 ...

© www.soinside.com 2019 - 2024. All rights reserved.