Nota del traduttore.: Questa nota pratica dell'autore di LayerCI è una grande illustrazione di quelli che vengono definiti tips & tricks per Kubernetes (e non solo). La soluzione proposta qui è solo una delle poche e, probabilmente, non la più ovvia (in alcuni casi può adatto quello 'nativo' per K8s già menzionato nei commenti. ). Tuttavia, consente almeno di guardare al problema da una prospettiva che applica strumenti classici e la loro successiva combinazione — simultaneamente semplice, flessibile e potente (vedi 'altre idee' alla fine per ispirazione).

Immaginate una situazione tipica: volete che una porta sul computer locale reindirizzi magicamente il traffico a un pod/contenitore (o viceversa).
Possibili scenari d'uso
- Controllare cosa restituisce l'endpoint HTTP
/healthzdel pod nel cluster di produzione. - Collegare un debugger TCP al pod sulla macchina locale.
- Accedere al database di produzione dagli strumenti locali per la gestione del DB senza dover gestire l'autenticazione (di solito localhost ha diritti di root).
- Eseguire uno script di migrazione una tantum per i dati nel cluster di staging senza dover creare un contenitore per esso.
- Collegare una sessione VNC al pod con un desktop virtuale avviato (vedi XVFB).
Qualche parola sugli strumenti necessari
— Un'utilità open source disponibile nella maggior parte dei repository di pacchetti Linux. Permette di aprire una porta locale e reindirizzare il traffico ad essa, ricevuto tramite stdin/stdout da qualsiasi comando specificato:
colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OK
Content-Length: 19<body>ciao!</body>'&
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>ciao!</body>colin@colin-work:~$()
Netcat fa l'opposto. Permette di connettersi a una porta aperta e di passare l'input/output ottenuto 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:~$()
Nell'esempio sopra, netcat richiede una pagina via HTTP. L'opzione -C fa sì che aggiunga CRLF alla fine della riga.
Integrazione con kubectl: ascolta sull'host e connettiti al pod
Combinando gli strumenti sopra con kubectl, otteniamo un comando come questo:
tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080 Allo stesso modo, per accedere alla porta 80 all'interno del pod è sufficiente fare 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
Reading package lists... Done
Building dependency tree
Reading state information... Done
netcat-openbsd is already the newest version (1.195-2).
0 upgraded, 0 newly installed, 0 to remove and 10 not upgraded.
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()

Schema di interazione degli strumenti
Nella direzione opposta: ascolta nel pod e connettiti all'host
nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 catQuesto comando consente al pod di accedere alla porta 8000 sulla macchina locale.
Script per Bash
Ho scritto uno script specifico per Bash che consente di gestire il cluster Kubernetes in produzione , utilizzando il metodo descritto sopra:
kubetunnel() {
POD="$1"
DESTPORT="$2"
if [ -z "$POD" -o -z "$DESTPORT" ]; then
echo "Uso: kubetunnel [nome del pod] [porta di destinazione]"
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 "Connettiti a 127.0.0.1:6666 per accedere a $POD:$DESTPORT"
} Se aggiungi questa funzione a ~/.bashrc, puoi facilmente aprire un tunnel nel pod con il comando kubetunnel web-pod 8080 e fare curl localhost:6666.
- Per il tunnel in Docker puoi sostituire la riga principale con:
tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT" - per il tunnel in K3s — sostituiscila con:
tcpserver 127.0.0.1 6666 k3s kubectl exec … - ecc.
Altre idee
- È possibile reindirizzare il traffico UDP utilizzando i comandi
netcat -l -u -cinvece ditcpserverenetcat -uinvece dinetcatrispettivamente. - Visualizzare input/output tramite pipe viewer:
nc 127.0.0.1 8000 | pv --progress | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat - È possibile comprimere e decomprimere il traffico su entrambe le estremità utilizzando
gzip. - Collegarsi via SSH a un altro computer con il file appropriato
kubeconfig:tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80" - È possibile connettere due pod in diversi cluster utilizzando
mkfifoe avviare due comandi separatikubectl.
Le possibilità sono infinite!
P.S. dal traduttore
Leggete anche nel nostro blog:
- «»;
- «»;
- «»;
- «».
Fonte: habr.com
