Kubectl 端口在 shell 脚本中可靠转发

Kubectl port forward reliably in a shell script

我在 shell 脚本中使用 kubectl port-forward,但我发现它不可靠,或者没有及时出现:

kubectl port-forward ${VOLT_NODE} ${VOLT_CLUSTER_ADMIN_PORT}:${VOLT_CLUSTER_ADMIN_PORT} -n ${NAMESPACE} &
if [ $? -ne 0 ]; then
    echo "Unable to start port forwarding to node ${VOLT_NODE} on port ${VOLT_CLUSTER_ADMIN_PORT}"
    exit 1
fi
PORT_FORWARD_PID=$!

sleep 10

经常睡10秒后,端口没有打开或者转发没有发生。有什么办法可以等待它准备好。 kubectl wait 之类的东西是理想的,但也可以选择 shell。

我接受了@AkinOzer 的评论并将其变成了这个示例,在该示例中我转发了一个 postgresql 数据库的端口,因此我可以对数据库进行 pg_dump

#!/bin/bash

set -e

localport=54320
typename=service/pvm-devel-kcpostgresql
remoteport=5432

# This would show that the port is closed
# nmap -sT -p $localport localhost || true

kubectl port-forward $typename $localport:$remoteport > /dev/null 2>&1 &

pid=$!
# echo pid: $pid

# kill the port-forward regardless of how this script exits
trap '{
    # echo killing $pid
    kill $pid
}' EXIT

# wait for $localport to become available
while ! nc -vz localhost $localport > /dev/null 2>&1 ; do
    # echo sleeping
    sleep 0.1
done

# This would show that the port is open
# nmap -sT -p $localport localhost

# Actually use that port for something useful - here making a backup of the
# keycloak database
PGPASSWORD=keycloak pg_dump --host=localhost --port=54320 --username=keycloak -Fc --file keycloak.dump keycloak

# the 'trap ... EXIT' above will take care of kill $pid