Pozn. přek.: Tato praktická poznámka od tvůrce LayerCI je skvělou ilustrací takzvaných tipů a triků pro Kubernetes (a nejen to). Navrhované řešení je pouze jedním z mála a pravděpodobně není tím nejzjevnějším (pro některé případy může vyhovovat již zmíněné "nativní" řešení pro K8s. ). Nicméně to umožňuje alespoň podívat se na problém z hlediska aplikace klasických nástrojů a jejich dalšího kombinování — současně jednoduchých, flexibilních a mocných (viz "další nápady" na konci pro inspiraci).

Představte si typickou situaci: chcete, aby port na místním počítači kouzelně přesměrovával provoz do podu/kontejneru (nebo naopak).
Možné scénáře použití
- Zkontrolovat, co vrací HTTP endpoint
/healthzpodu v produkčním clusteru. - Připojit TCP debugger k podu na místním počítači.
- Získat přístup k produkční databázi z lokálních nástrojů pro práci s DB bez nutnosti zabývat se autentifikací (obvykle má localhost práva root).
- Spustit jednorázový migrační skript pro data v stagingovém clusteru bez nutnosti vytvářet pro něj kontejner.
- Připojit sezení VNC k podu s běžícím virtuálním pracovním stolem (viz XVFB).
Několik slov o nezbytných nástrojích
— Open Source nástroj, dostupný ve většině balíčkových repozitářů Linuxu. Umožňuje otevřít místní port a přesměrovat na něj provoz získaný prostřednictvím stdin/stdout od jakéhokoli zadaného příkazu:
colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OK
Content-Length: 19<body>Ahoj!</body>'&
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>Ahoj!</body>colin@colin-work:~$()
Netcat dělá opak. Umožňuje připojit se k otevřenému portu a předat získaný vstup/výstup na 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:~$()
V uvedeném příkladu netcat žádá o stránku pomocí HTTP. Příznak -C přiměje jej přidat CRLF na konec řádku.
Související s kubectl: poslouchejte na hostiteli a připojte se k podu
Pokud spojíme uvedené nástroje s kubectl, dostaneme příkaz jako tento:
tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080 Podobně, pro přístup k portu 80 uvnitř podu stačí udělat 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()

Schéma interakce utilit
Na opačné straně: poslouchejte v podu a připojte se k hostiteli
nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 catTento příkaz umožňuje podu přístup k portu 8000 na místním stroji.
Bash skript
Napsal jsem speciální skript pro Bash, který umožňuje spravovat produkční klastr Kubernetes , s použitím výše popsané metody:
kubetunnel() {
POD="$1"
DESTPORT="$2"
if [ -z "$POD" -o -z "$DESTPORT" ]; then
echo "Použití: kubetunnel [název podu] [cílový port]"
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 "Připojte se k 127.0.0.1:6666 pro přístup k $POD:$DESTPORT"
} Pokud přidáte tuto funkci do ~/ .bashrc, můžete snadno otevřít tunel v podu příkazem kubetunnel web-pod 8080 a provést curl localhost:6666.
- Pro tunel v Docker můžete nahradit hlavní řádek na:
tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT" - pro tunel v K3s — změňte ho na:
tcpserver 127.0.0.1 6666 k3s kubectl exec … - atd.
Další nápady
- Přesměrování UDP provozu lze provést příkazy
netcat -l -u -cmístotcpserveranetcat -umístonetcatodpovídajícím způsobem. - Zobrazení vstupu/výstupu přes pipe viewer:
nc 127.0.0.1 8000 | pv --progres | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat - Lze komprimovat a dekomprimovat provoz na obou koncích pomocí
. Verze ICU jsou – bezvýznamné.. - Připojte se přes SSH k jinému počítači se správným souborem
kubeconfig:tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80" - Lze propojit dva pody v různých klastrech pomocí
mkfifoa spustit dva samostatné příkazykubectl.
Možnosti jsou neomezené!
P.S. od překladatele
Přečtěte si také náš blog:
- «»;
- «»;
- «»;
- «».
Zdroj: habr.com
