7.8. 使用端口转发访问容器中的应用程序
OpenShift Dedicated 支持向 pod 转发端口转发。
7.8.1. 了解端口转发
您可以使用 CLI 将一个或多个本地端口转发到 pod。这样,您可以在本地侦听一个指定或随机端口,并且与 pod 中的指定端口来回转发数据。
CLI 中内置了端口转发支持:
$ oc port-forward <pod> [<local_port>:]<remote_port> [...[<local_port_n>:]<remote_port_n>]
CLI 侦听用户指定的本地端口,并通过以下协议进行转发。
可使用以下格式来指定端口:
| 客户端在本地侦听端口 5000,并转发到 pod 中的 5000。 |
| 客户端在本地侦听端口 6000,并转发到 pod 中的 5000。 |
| 客户端选择本地的一个空闲端口,并转发到 pod 中的 5000 。 |
OpenShift Dedicated 处理来自客户端的端口转发请求。在收到请求后,OpenShift Dedicated 会升级响应并等待客户端创建端口转发流。当 OpenShift Dedicated 收到新流时,它会在流和 pod 端口之间复制数据。
从架构上看,有不同的选项可用于转发到 pod 端口。支持的 OpenShift Dedicated 实施会直接调用节点主机上的 nsenter
来进入 pod 的网络命名空间,然后调用 socat
在流和 pod 端口之间复制数据。不过,自定义实施中可能会包括运行一个 helper pod,然后运行 nsenter
和 socat
,从而不需要在主机上安装这些二进制代码。
7.8.2. 使用端口转发
您可以使用 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
7.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 服务器发送端口转发请求后,客户端会将连接升级到支持多路复用流;当前使用 Hyptertext Transfer Protocol Version 2 (HTTP/2)。
客户端创建 port
标头中包含 pod 中目标端口的流。写入流的所有数据都通过 Kubelet 传送到目标 pod 和端口。同样,针对被转发连接从 pod 发送的所有数据都会被传回客户端上的同一流。
在完成端口转发请求后,客户端关闭所有流、升级的连接和底层连接。