×

OpenShift Container Platform支持对Pod进行端口转发。

了解端口转发

您可以使用CLI将一个或多个本地端口转发到Pod。这允许您在本地监听给定或随机端口,并将数据转发到Pod中的给定端口。

CLI内置了对端口转发的支持

$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]

CLI侦听用户指定的每个本地端口,使用下面描述的协议进行转发。

可以使用以下格式指定端口

5000

客户端在本地监听端口5000,并转发到Pod中的5000。

6000:5000

客户端在本地监听端口6000,并转发到Pod中的5000。

:50000:5000

客户端选择一个空闲的本地端口并转发到Pod中的5000。

OpenShift Container Platform处理来自客户端的端口转发请求。收到请求后,OpenShift Container Platform升级响应并等待客户端创建端口转发流。当OpenShift Container Platform收到新的流时,它会在流和Pod的端口之间复制数据。

从架构上讲,有多种向Pod端口进行转发的选项。受支持的OpenShift Container Platform实现直接在节点主机上调用nsenter以进入Pod的网络命名空间,然后调用socat以在流和Pod的端口之间复制数据。但是,自定义实现可以包括运行一个*辅助* Pod,然后运行nsentersocat,这样就不需要在主机上安装这些二进制文件。

使用端口转发

您可以使用 CLI 将一个或多个本地端口转发到 Pod。

步骤

使用以下命令监听 Pod 中指定的端口

$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]

例如

  • 使用以下命令在本地监听端口 `5000` 和 `6000`,并将数据转发到 Pod 中的 `5000` 和 `6000` 端口。

    $ oc port-forward <pod> 5000 6000
    示例输出
    Forwarding from 127.0.0.1:5000 -> 5000
    Forwarding from [::1]:5000 -> 5000
    Forwarding from 127.0.0.1:6000 -> 6000
    Forwarding from [::1]:6000 -> 6000
  • 使用以下命令在本地监听端口 `8888`,并转发到 Pod 中的 `5000` 端口。

    $ oc port-forward <pod> 8888:5000
    示例输出
    Forwarding from 127.0.0.1:8888 -> 5000
    Forwarding from [::1]:8888 -> 5000
  • 使用以下命令在本地监听一个空闲端口,并转发到 Pod 中的 `5000` 端口。

    $ oc port-forward <pod> :5000
    示例输出
    Forwarding from 127.0.0.1:42390 -> 5000
    Forwarding from [::1]:42390 -> 5000

    或者

    $ oc port-forward <pod> 0:5000

客户端发起端口转发的协议

客户端通过向 Kubernetes API 服务器发出请求来启动到 Pod 的端口转发。

/proxy/nodes/<node_name>/portForward/<namespace>/<pod>

在上文 URL 中

  • `<node_name>` 是节点的 FQDN(完全限定域名)。

  • `<namespace>` 是目标 Pod 的命名空间。

  • `<pod>` 是目标 Pod 的名称。

例如

/proxy/nodes/node123.openshift.com/portForward/myns/mypod

向 API 服务器发送端口转发请求后,客户端会将连接升级到支持多路复用流的连接;当前实现使用的是 超文本传输协议版本 2 (HTTP/2)

客户端创建一个包含目标 Pod 端口的 `port` 头的流。写入流的所有数据都通过 kubelet 传递到目标 Pod 和端口。类似地,从 Pod 发送到该转发连接的所有数据都传递回客户端的同一流。

客户端在完成端口转发请求后,会关闭所有流、升级的连接和底层连接。