5.8. 使用端口转发访问容器中的应用程序

OpenShift Container Platform 支持向 pod 转发端口。

5.8.1. 了解端口转发

您可以使用 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 端口之间复制数据。不过,自定义实施中可能会包括运行一个 helper pod,然后运行 nsentersocat,从而不需要在主机上安装这些二进制代码。

5.8.2. 使用端口转发

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

流程

使用以下命令侦听 pod 中的指定端口:

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

例如:

  • 使用以下命令,侦听本地的 50006000 端口,并与 pod 中的 50006000 端口来回转发数据:

    $ 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

5.8.3. 用于从客户端发起端口转发的协议

客户端通过向 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 服务器发送端口转发请求后,客户端会将连接升级到支持多路复用的流;当前使用 SPDY

客户端创建 port 标头中包含 pod 中目标端口的流。写入流的所有数据都通过 Kubelet 传送到目标 pod 和端口。同样,针对被转发连接从 pod 发送的所有数据都会被传回客户端上的同一流。

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