AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 1065922
Accepted
Chayan Ghosh
Chayan Ghosh
Asked: 2021-06-07 21:55:14 +0800 CST2021-06-07 21:55:14 +0800 CST 2021-06-07 21:55:14 +0800 CST

双端口转发kubernetes + docker

  • 772

概括:

我有一个运行 kubectl port-forward 的 docker 容器,它将作为 k8s 服务运行的 postgres 服务的端口(5432)转发到本地端口(2223)。在 Dockerfile 中,我已经暴露了相关的 2223 端口。然后我通过发布所述端口 ( -p 2223:2223)来运行容器

现在,当我尝试通过 访问 postgrespsql -h localhost -p 2223时,出现以下错误:

psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.

但是,当我docker exec -ti对上述容器执行上述操作并运行上述 psql 命令时,我可以连接到 postgres。

Dockerfile 命令:

EXPOSE 2223
CMD ["bash", "-c", "kubectl -n namespace_test port-forward service/postgres-11-2 2223:5432"]

Docker 运行命令:

docker run -it --name=k8s-conn-12 -p 2223:2223 my_image_name:latest

docker run 命令的输出:

Forwarding from 127.0.0.1:2223 -> 5432

所以端口转发成功,我可以从 docker 容器内部连接到 postgres 实例。我不能做的是从容器外部连接到暴露和发布的端口

port-forwarding docker kubernetes kubectl psql
  • 1 1 个回答
  • 1188 Views

1 个回答

  • Voted
  1. Best Answer
    matt_j
    2021-06-08T06:23:24+08:002021-06-08T06:23:24+08:00

    我认为有两种可能的解决方案可能对您的情况有所帮助:

    1. 您可以使用运行此命令的容器的 IP 地址将--address参数添加到kubectl port-forward命令中。默认情况下,kubectl仅绑定到 localhost,因此它不会按您的预期工作(请参阅:Kubectl 参考文档)。
    2. bridge除非另有说明,否则所有新启动的容器都连接到默认网络。要解决您的问题,您可以使用host网络而不是bridge网络。可以在Docker 主机网络文档中找到:

    如果您对容器使用主机网络模式,则该容器的网络堆栈不会与 Docker 主机隔离(容器共享主机的网络命名空间),并且容器不会获得自己的 IP 地址分配。

    我将简要介绍这两种解决方案,向您展示它是如何工作的。


    首先,我准备了postgres:

    # kubectl get pod,svc
    NAME           READY   STATUS    RESTARTS   AGE
    pod/postgres   1/1     Running   0          155m
    
    NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
    service/postgres     ClusterIP   10.110.151.73   <none>        5432/TCP   2s
    

    广告 1。

    这种方法与您的方法非常相似,我只是添加了--address参数:
    注意:我使用了一个kubectl已经安装的容器。我只是想让你注意kubectl port-forward --address $(hostname -i),localhost service/postgres 2223:5432命令。

    root@kworker:~# docker run -it --name=k8s-conn-12 -p 2223:2223 -v /config:/config mattjcontainerregistry/forward:latest bash
    root@31b05af956ab:/# kubectl port-forward --address $(hostname -i),localhost service/postgres 2223:5432 --kubeconfig=config
    Forwarding from 127.0.0.1:2223 -> 5432
    Forwarding from 172.17.0.2:2223 -> 5432
    

    从另一个终端选项卡我们可以检查它是否有效:

    root@kworker:~# docker exec -it k8s-conn-12 bash
    root@31b05af956ab:/# psql -U postgres -h localhost -p 2223
    psql (12.7 (Ubuntu 12.7-0ubuntu0.20.04.1), server 13.3 (Debian 13.3-1.pgdg100+1))
    WARNING: psql major version 12, server major version 13.
             Some psql features might not work.
    Type "help" for help.
    
    postgres=# 
    

    此外,我们可以在主机上执行相同的操作(从具有公开和发布端口的容器外部):

    root@kworker:~# psql -U postgres -h localhost -p 2223
    psql (11.12 (Debian 11.12-0+deb10u1), server 13.3 (Debian 13.3-1.pgdg100+1))
    WARNING: psql major version 11, server major version 13.
             Some psql features might not work.
    Type "help" for help.
    
    postgres=# 
    

    广告 2。

    这种方法需要使用主机网络:

    host:对于独立容器,去掉容器和Docker主机之间的网络隔离,直接使用主机的网络。

    注意:我只是想让您注意--network=host选项(我使用与以前相同的容器):

    root@kworker:~# docker run -it --name=k8s-conn-12 --network=host  -v /config:/config mattjcontainerregistry/forward:latest bash
    root@kworker:/# kubectl port-forward service/postgres 2223:5432 --kubeconfig=config
    Forwarding from 127.0.0.1:2223 -> 5432
    Forwarding from [::1]:2223 -> 5432
    

    同样,我们可以检查它是否在容器外部按预期工作:

    root@kworker:~# psql -U postgres -h localhost -p 2223
    psql (11.12 (Debian 11.12-0+deb10u1), server 13.3 (Debian 13.3-1.pgdg100+1))
    WARNING: psql major version 11, server major version 13.
             Some psql features might not work.
    Type "help" for help.
    
    postgres=# 
    

    此外,如果您真的需要 docker 容器进行端口转发,则值得考虑。也许kubectl port-forward在后台运行会更好(请参阅:在后台执行 kubectl port-forward)。

    • 3

相关问题

  • 为 Cisco ASA 5510 上的端口 443/80 创建 NAT 规则和安全策略

  • 慢速路由问题

  • 通过其子网内的公共 IP 连接到默认主机是否会导致任何问题?

  • 端口镜像作为 Windows 服务

  • 使用 iptables 和 dhcpd 进行端口转发

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve