×

AWS 上的 Red Hat OpenShift 服务支持端口转发到 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。

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

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

使用端口转发

您可以使用 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 发送到该转发连接的所有数据都传递回客户端的同一流。

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