Notă. transl.: Această notă practică a creatorului LayerCI este o ilustrare excelentă a așa-numitelor sfaturi și trucuri pentru Kubernetes (și nu numai). Soluția propusă aici este doar una dintre puținele și, poate, nu cea mai evidentă (în unele cazuri, cea „nativă” pentru K8-uri deja menționată în comentarii poate fi potrivită ). Cu toate acestea, vă permite să priviți cel puțin problema din perspectiva utilizării utilităților clasice și a combinării lor în continuare - în același timp simplu, flexibil și puternic (vezi „alte idei” la sfârșit pentru inspirație).

Imaginați-vă o situație tipică: doriți ca un port pe mașina dvs. locală să redirecționeze magic traficul către un pod/container (sau invers).
Posibile cazuri de utilizare
- Verificați ce returnează punctul final HTTP
/healthzpod în clusterul de producție. - Conectați un depanator TCP la podul de pe mașina locală.
- Obțineți acces la baza de date de producție din instrumentele de bază de date locale fără a fi nevoiți să vă deranjați cu autentificarea (de obicei localhost are drepturi de root).
- Rulați un script de migrare unică pentru date dintr-un cluster de procesare fără a fi nevoie să creați un container pentru acesta.
- Conectați o sesiune VNC la un pod care rulează un desktop virtual (consultați XVFB).
Câteva cuvinte despre instrumentele necesare
— Un utilitar open source disponibil în majoritatea repozitoriilor de pachete. LinuxÎți permite să deschizi un port local și să redirecționezi traficul primit prin stdin/stdout de la orice comandă specificată către acesta:
colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OKrnContent-Length: 19rnrn<body>hello!</body>'&
[1] 17377
colin@colin-work:~$ curl localhost:8080
<body>hello!</body>colin@colin-work:~$()
Netcat face opusul. Vă permite să vă conectați la un port deschis și să transmiteți I/O primite de la acesta la 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:~$()
În exemplul de mai sus, netcat solicită pagina prin HTTP. Steag -C determină să atașeze CRLF la sfârșitul liniei.
Conexiune cu kubectl: ascultați pe gazdă și conectați-vă la pod
Dacă combinăm instrumentele de mai sus cu kubectl, obținem o comandă ca aceasta:
tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080 Prin analogie, pentru a accesa portul 80 din interiorul podului, va fi suficient 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()

Diagrama de interacțiune cu utilitatea
În direcția opusă: ascultați în pod și conectați-vă la gazdă
nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 catAceastă comandă permite podului să acceseze portul 8000 de pe computerul local.
Script Bash
Am scris un script special pentru Bash care vă permite să gestionați un cluster de producție Kubernetes folosind metoda descrisă mai sus:
kubetunnel() {
POD="$1"
DESTPORT="$2"
if [ -z "$POD" -o -z "$DESTPORT" ]; then
echo "Usage: kubetunnel [pod name] [destination 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 "Connect to 127.0.0.1:6666 to access $POD:$DESTPORT"
} Dacă adăugați această funcție la ~/.bashrc, puteți deschide cu ușurință un tunel într-un pod cu comanda kubetunnel web-pod 8080 si fa curl localhost:6666.
- Pentru tunelul înăuntru Docher puteți înlocui linia principală cu:
tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT" - pentru tunel în K3s - schimba-l in:
tcpserver 127.0.0.1 6666 k3s kubectl exec … - etc
Mai multe idei
- Puteți redirecționa traficul UDP folosind comenzile
netcat -l -u -cîn loc detcpserverиnetcat -uîn loc denetcatrespectiv. - Vizualizați I/O prin vizualizatorul conductelor:
nc 127.0.0.1 8000 | pv --progress | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat - Puteți comprima și decomprima traficul la ambele capete folosind
gzip. - Conectați-vă prin SSH la un alt computer cu fișierul corespunzător
kubeconfig:tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80" - Puteți conecta două pod-uri în grupuri diferite folosind
mkfifoși rulați două comenzi separatekubectl.
Posibilitățile sunt nesfârșite!
PS de la traducator
Citește și pe blogul nostru:
- «»;
- «»;
- «»;
- «".
Sursa: www.habr.com
