Napomena za prijevod.: Ova praktična bilješka od kreatora LayerCI predstavlja izvrsnu ilustraciju takozvanih savjeta i trikova za Kubernetes (i ne samo). Predloženo rješenje ovdje je samo jedno od nekoliko, i možda nije naj očiglednije (u nekim slučajevima mogao bi odgovarati već spomenuti „nativni“ za K8s. ). Međutim, omogućava barem da se na problem gleda iz perspektive primjene 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čunalu magično preusmjeri promet u pod/kontejner (ili obrnuto).
Mogući scenariji korištenja
- Provjeriti što vraća HTTP endpoint
/healthzpod-a u produkcijskom klasteru. - Povezati TCP debager s pod-om na lokalnom računalu.
- Pristupiti produkcijskoj bazi iz lokalnih alata za rad s Baza podataka bez potrebe za rješavanjem autentifikacije (obično localhost ima root privilegije).
- Pokrenuti jednokratni skript za migraciju podataka u staging klasteru bez potrebe za stvaranjem kontejnera za to.
- Povezati VNC sesiju s pod-om koji ima pokrenutu virtualnu radnu površinu (vidi XVFB).
Nekoliko riječi o potrebnim alatima
— Open Source alat dostupan u većini Linux repozitorija. Omogućava otvaranje lokalnog porta i preusmjeravanje prometa primljenog kroz stdin/stdout s 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ćuje povezivanje na otvoreni port i prenosi dobiveni ulaz/izlaz 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 primjeru netcat traži stranicu putem HTTP-a. Opcija -C zastrašuje da dodaje CRLF na kraj linije.
Povezivanje s kubectl: slušajte na hostu i povežite se s pod-om
Ako kombiniramo predstavljene alate s kubectl, dobit ćemo komandu poput ove:
tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080 Analogno tome, za pristup portu 80 unutar pod-a bit će dovoljno učiniti 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
Čitanje paketa... Gotovo
Izgradnja stabla zavisnosti
Čitanje informacija o stanju... Gotovo
netcat-openbsd je već najnovija verzija (1.195-2).
0 nadograđeno, 0 novo instalirano, 0 za uklanjanje i 10 neotvorenih.
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 interakcije alata
U obrnutom smjeru: slušajte unutar pod-a i spojite se na host
nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 catOva komanda omogućava pod-u pristup portu 8000 na lokalnoj mašini.
Bash skripta
Napisao sam posebnu Bash skriptu koja omogućava upravljanje produkcijskim Kubernetes klasterom. , koristeći gorenavedenu metodu:
kubetunnel() {
POD="$1"
DESTPORT="$2"
if [ -z "$POD" -o -z "$DESTPORT" ]; then
echo "Korištenje: kubetunnel [ime poda] [odredišni 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 pristup $POD:$DESTPORT"
} Ako dodate ovu funkciju u ~/bashrc, lako možete otvoriti tunel u pod-u komandnom kubetunnel web-pod 8080 i uraditi curl localhost:6666.
- Za tunel u Docker možete zamijeniti glavnu liniju sa:
tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT" - za tunel u K3s — promijenite je na:
tcpserver 127.0.0.1 6666 k3s kubectl exec … - itd.
Druge ideje
- Preusmjerite UDP promet komandom
netcat -l -u -cumjestotcpserverinetcat -uumjestonetcatodgovarajuće. - Pogledajte ulaz/izlaz preko pipe viewer-a:
nc 127.0.0.1 8000 | pv --progress | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat - Možete komprimirati i raspakirati promet na oba kraja pomoću
gzip. - Povežite se putem SSH na drugo računalo s odgovarajućim datotekom
kubeconfig:tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80" - Možete povezati dva poda u različitim klasterima pomoću
mkfifoi pokrenuti dvije odvojene komandekubectl.
Mogućnosti su beskrajne!
P.S. od prevodioca
Pročitajte i na našem blogu:
- «»;
- «»;
- «»;
- «».
Izvor: habr.com
