Op. prev.: Ova praktična beleška od kreatora LayerCI - odlična je ilustracija takozvanih praktičnih saveta i trikova za Kubernetes (i ne samo). Predloženo rešenje ovde je samo jedno od nekoliko, i možda ne i naj očiglednije (za neke slučajeve može se koristiti kao što je pomenuto u komentarima "nativno" rešenje za K8s ). Ipak, omogućava vam da bar sagledate problem iz perspektive korišćenja klasičnih alata i njihove daljnje kombinacije - istovremeno jednostavno, fleksibilno i moćno (vidi "druge ideje" na kraju za inspiraciju).

Zamislite tipičnu situaciju: želite da port na lokalnom računaru magično preusmeri saobraćaj u pod/kontejner (ili obrnuto).
Mogući scenariji upotrebe
- Proverite šta vraća HTTP endpoint
/healthzpoda u produkcijskom klasteru. - Povezivanje TCP debagera sa podom na lokalnom računaru.
- Pristupiti produkcijskoj bazi iz lokalnih alata za rad sa bazama podataka bez potrebe da se mučite sa autentifikacijom (obično localhost ima root privilegije).
- Pokrenuti jednokratni migracijski skript za podatke u staging klasteru bez potrebe za kreiranjem kontejnera.
- Povezati VNC sesiju sa podom na kojem je pokrenuta virtuelna radna površina (vidi XVFB).
Nekoliko reči o potrebnim alatima
— Open Source alat dostupan u većini Linux repozitorijuma. Omogućava otvaranje lokalnog porta i preusmeravanje saobraćaja na njega dobijenog preko stdin/stdout iz bilo koje navedene komande:
colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OKrnContent-Length: 19rnrn<body>pozdrav!</body>'&
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>pozdrav!</body>colin@colin-work:~$()
Netcat radi obrnuto. Omogućava povezivanje na otvoren port i prenos dobijenog unosa/izlaza 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:~$()
U gornjem primeru netcat traži stranicu putem HTTP-a. Flag -C naterava ga da dodaje CRLF na kraj reda.
Kombinacija sa kubectl: slušajte na hostu i povežite se sa podom
Ako spojimo prethodno predstavljene alate sa kubectl, dobijamo komandu poput ove:
tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080 Slično, za pristup portu 80 unutar poda, dovoljno je uraditi 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()

Shema sodelovanja orodij
V nasprotni smeri: poslušajte v podu in se povezujte na gostitelja
nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 catTa ukaz omogoča podu dostop do porta 8000 na lokalnem računalniku.
Bash skript
Napisal sem posebno Bash skripto, ki omogoča upravljanje produkcijskih grozdov Kubernetes , z uporabo zgoraj omenjene metode:
kubetunnel() {
POD="$1"
DESTPORT="$2"
if [ -z "$POD" -o -z "$DESTPORT" ]; then
echo "Uporaba: kubetunnel [ime poda] [ciljni 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 "Povežite se na 127.0.0.1:6666 za dostop do $POD:$DESTPORT"
} Če to funkcijo dodate v ~/.bashrc, lahko zlahka odprete tunel v pod z ukazom kubetunnel web-pod 8080 in izvedete curl localhost:6666.
- Za tunel v Docker lahko glavno vrstico zamenjate z:
tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT" - za tunel v K3s — spremenite jo v:
tcpserver 127.0.0.1 6666 k3s kubectl exec … - itd.
Druge ideje
- Preusmerjanje UDP prometa je mogoče z ukazi
netcat -l -u -cnamestotcpserverinnetcat -unamestonetcatustrezno. - Poglejte vhod/izhod prek pipe viewerja:
nc 127.0.0.1 8000 | pv --progress | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat - Lahko stisnete in razpakirate promet na obeh koncih s pomočjo
gzip. - Povežite se preko SSH do drugega računalnika s pripadajočo datoteko
kubeconfig:tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80" - Lahko povežete dva poda v različnih grozdih s pomočjo
mkfifoin zaženeš dve ločeni ukazikubectl.
Možnosti so neomejene!
P.S. od prevajalca
Preberite tudi na našem blogu:
- «»;
- «»;
- «»;
- «».
Izvor: habr.com
