Nota de traducción.: Esta nota práctica del creador de LayerCI es una excelente ilustración de los llamados tips & tricks para Kubernetes (y más). La solución propuesta aquí es solo una de las pocas y, quizás, no la más obvia (para algunos casos, puede servir la opción ‘nativa’ para K8s ya mencionada en los comentarios. ). Sin embargo, al menos permite ver el problema desde la perspectiva de aplicar herramientas clásicas y su posterior combinación — al mismo tiempo simple, flexible y potente (ver ‘otras ideas’ al final para inspiración).

Imagina una situación típica: quieres que un puerto en tu computadora local redirija mágicamente el tráfico a un pod/contenedor (o viceversa).
Posibles escenarios de uso
- Verificar qué devuelve el endpoint HTTP
/healthzpod en el clúster de producción. - Conectar un depurador TCP al pod en la máquina local.
- Acceder a la base de datos de producción desde herramientas locales para trabajar con la base de datos sin necesidad de lidiar con la autenticación (generalmente, localhost tiene privilegios de root).
- Ejecutar un script de migración de datos único en el clúster de staging sin necesidad de crear un contenedor para ello.
- Conectar una sesión VNC al pod con un escritorio virtual en ejecución (ver XVFB).
Algunas palabras sobre las herramientas necesarias
— Una herramienta de código abierto, disponible en la mayoría de los repositorios de paquetes de Linux. Permite abrir un puerto local y redirigir el tráfico recibido a través de stdin/stdout desde cualquier comando especificado:
colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OKrnContent-Length: 19rnrn<body>¡Hola!</body>'&
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>¡Hola!</body>colin@colin-work:~$()
Netcat hace lo contrario. Permite conectarse a un puerto abierto y pasar la entrada/salida recibida a stdin/stdout:
colin@colin-work:~$ nc -C httpstat.us 80
GET /200 HTTP/1.0
Host: httpstat.us
HTTP/1.1 200 OK
Cache-Control: private
Server: Microsoft-IIS/10.0
X-AspNetMvc-Version: 5.1
Access-Control-Allow-Origin: *
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET
Set-Cookie: ARRAffinity=93fdbab9d364704de8ef77182b4d13811344b7dd1ec45d3a9682bbd6fa154ead;Path=/;HttpOnly;Domain=httpstat.us
Date: Fri, 01 Nov 2019 17:53:04 GMT
Connection: close
Content-Length: 0
^C
colin@colin-work:~$()
En el ejemplo anterior, netcat solicita la página por HTTP. La bandera -C hace que añada CRLF al final de la línea.
Combinando con kubectl: escucha en el host y conéctate al pod
Si combinamos las herramientas anteriores con kubectl, obtendremos un comando como este:
tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080 De manera similar, para acceder al puerto 80 dentro del pod, solo necesita hacer curl "127.0.0.1:80":
colin@colin-work:~$ sanic kubectl exec -it web-54dfb667b6-28n85 bash
root@web-54dfb667b6-28n85:\/web# apt-get -y install netcat-openbsd
Leyendo listas de paquetes... Hecho
Construyendo árbol de dependencias
Leyendo la información del estado... Hecho
netcat-openbsd ya es la versión más reciente (1.195-2).
0 actualizado, 0 recién instalado, 0 para eliminar y 10 no actualizado.
root@web-54dfb667b6-28n85:\/web# exit
colin@colin-work:~$ tcpserver 127.0.0.1 8000 sanic kubectl exec -i web-54dfb667b6-28n85 nc 127.0.0.1 8080&
[1] 3232
colin@colin-work:~$ curl localhost:8000\/healthz
{"status":"ok"}colin@colin-work:~$ exit()

Esquema de interacción de utilidades
En la dirección opuesta: escuche en el pod y conéctese al host
nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 catEste comando permite que el pod acceda al puerto 8000 en la máquina local.
Script para Bash
Escribí un script especial para Bash que permite gestionar un clúster de producción de Kubernetes , usando el método descrito arriba:
kubetunnel() {
POD="$1"
DESTPORT="$2"
if [ -z "$POD" -o -z "$DESTPORT" ]; then
echo "Uso: kubetunnel [nombre del pod] [puerto de destino]"
return 1
fi
pkill -f 'tcpserver 127.0.0.1 6666'
tcpserver 127.0.0.1 6666 kubectl exec -i "$POD" nc 127.0.0.1 "$DESTPORT"&
echo "Conéctese a 127.0.0.1:6666 para acceder a $POD:$DESTPORT"
} Si añade esta función a ~~/.bashrc, puede abrir fácilmente un túnel en el pod con el comando kubetunnel web-pod 8080 y hacer curl localhost:6666.
- Para el túnel en Docker puede reemplazar la línea principal por:
tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT" - para el túnel en K3s — cámbielo por:
tcpserver 127.0.0.1 6666 k3s kubectl exec … - etc.
Otras ideas
- Puede redirigir el tráfico UDP con los comandos
netcat -l -u -cen lugar detcpserverynetcat -uen lugar denetcatcorrespondientemente. - Ver la entrada/salida a través de pipe viewer:
nc 127.0.0.1 8000 | pv --progress | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat - Puede comprimir y descomprimir el tráfico en ambos extremos usando
gzip. - Conéctese por SSH a otra computadora con el archivo correspondiente
kubeconfig:tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80" - Se pueden conectar dos pods en diferentes clústeres usando
mkfifoy ejecutar dos comandos separadoskubectl.
¡Las posibilidades son infinitas!
P.D. del traductor
También puedes leer en nuestro blog:
- «»;
- «»;
- «»;
- «».
Fuente: habr.com
