<p>I am using <code>kubectl port-forward</code> in a shell script but I find it is not reliable, or doesn't come up in time:</p>
<pre><code>kubectl port-forward ${VOLT_NODE} ${VOLT_CLUSTER_ADMIN_PORT}:${VOLT_CLUSTER_ADMIN_PORT} -n ${NAMESPACE} &amp;
if [ $? -ne 0 ]; then
    echo &quot;Unable to start port forwarding to node ${VOLT_NODE} on port ${VOLT_CLUSTER_ADMIN_PORT}&quot;
    exit 1
fi
PORT_FORWARD_PID=$!

sleep 10
</code></pre>
<p>Often after I sleep for 10 seconds, the port isn't open or forwarding hasn't happened. Is there any way to wait for this to be ready. Something like <code>kubectl wait</code> would be ideal, but open to shell options also.</p>

<p>I took @AkinOzer's comment and turned it into this example where I port-forward a postgresql database's port so I can make a <code>pg_dump</code> of the database:</p>
<pre><code>#!/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 &gt; /dev/null 2&gt;&amp;1 &amp;

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 &gt; /dev/null 2&gt;&amp;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
</code></pre>
