我一直在尝试使用这些命令转发多个端口:
kubectl port-forward deployment/service1 8080:8080 && kubectl port-forward deployment/service2 8081:8081
和
kubectl port-forward deployment/service1 8080:8080 || kubectl port-forward deployment/service2 8081:8081
看起来它只转发带有此输出的第一个:
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
如何让它在后台监听并运行第二个命令?
kubectl port-foward
命令后,进程会阻塞,第二个命令只会在第一个命令终止后才开始(很可能不会)。
对于多个服务
kubectl port-forward
,您需要将每个命令放入后台:
kubectl port-forward deployment/service1 8080:8080 & \
kubectl port-forward deployment/service2 8081:8081 &
注意
是在后台(在子 shell 中)运行命令的 bash 指令。我已经使用&
在多行上漂亮地打印命令,但您可以在单行上编写多个命令(用\
分隔),例如&
echo "First" & echo "Second" & echo "Third" &
这是我的两分钱的 shell 脚本示例:
# Push commands in the background, when the script exits, the commands will exit too
kubectl --context "$SELECTED_CONTEXT" --namespace "$SELECTED_NS" port-forward service/service1 1433:1433 & \
kubectl --context "$SELECTED_CONTEXT" --namespace "$SELECTED_NS" port-forward service/service2 80:80 & \
echo "Press CTRL-C to stop port forwarding and exit the script"
wait
您可以使用该服务来转发端口 假设您正在使用 helm 来发布新版本。
在这种情况下,我们将把两个服务转发到本地环境:
helm upgrade --install -f values-file.yaml <release-name> /path/to/helm/templates/ -n <namespace> --create-namespace
kubectl -- --namespace <namespace> port-forward service/<release-name>-minio 9000 & \
kubectl -- --namespace <namespace> port-forward service/<release-name> 5432
将端口转发作为单独的进程运行至关重要,否则当前进程将被阻塞,直到阻塞进程终止。您可以使用命令末尾的
&
来完成此操作。
为了确保您再次可靠地停止端口转发,您需要在例如之后再次终止进程。按
Ctrl + C
后。为此,您可以获取使用 $!
BASH 变量启动的最后一个进程的进程 ID。然后,您可以使用 kill
命令来终止多个进程。
最后一部分是 trap
,它监听信号(参见 Wikipedia - Signal (IPC))并允许在接收到信号后执行指定的命令。
trap "<commands to execute once signal is received>" <signal to listen to>
如果您希望在点击
SIGINT
后停止端口转发,您需要监听 Ctrl + C
信号。
function port_forward_services(){
# start port forwarding for services in as separate processes
kubectl port-forward svc/service1 20001:5001 &
# get process ID of started process
local service1_pid=$!
kubectl port-forward svc/service2 20002:5002 &
local service2_pid=$!
kubectl port-forward svc/service3 20003:5003 &
local service3_pid=$!
echo "Port forwarding started. Press Ctrl+C to stop."
# Listen on SIGINT signal (sent to a process when you press Ctrl+C)
# then once the signal is received kill all the started processes effectively stopping the port forwarding
trap "echo 'Stopping port forwarding...'; kill $service1_pid $service2_pid $service3_pid" SIGINT
}
您可以像这样简单地传递多个端口作为参数
kubectl 端口转发部署/服务1 8080:8080 8081:8081
或者如果您想转发到服务
kubectl 端口转发 svc/serviceName 8080:8080 8081:8081
根据手册。