Cara membuka terowongan di Kubernetes pod atau wadah dengan tcpserver dan netcat

Catatan perev. : Catatan praktis dari pencipta LayerCI ini adalah ilustrasi hebat tentang apa yang disebut kiat & trik untuk Kubernetes (dan tidak hanya). Solusi yang diusulkan di sini hanya satu dari sedikit dan, mungkin, bukan yang paling jelas (untuk beberapa kasus, " kubectl port-forward " asli K8 yang disebutkan dalam komentar mungkin cocok). Namun, ini memungkinkan Anda untuk setidaknya melihat masalah dari perspektif menggunakan utilitas klasik dan kombinasi lebih lanjut - keduanya sederhana, fleksibel dan kuat (lihat "ide lain" di bagian akhir untuk inspirasi).



Bayangkan situasi yang khas: Anda ingin port di komputer lokal untuk ajaib mengarahkan lalu lintas ke pod / wadah (atau sebaliknya).

Kemungkinan menggunakan case


  1. Periksa apakah HTTP endpoint /healthz di cluster produksi.
  2. Hubungkan TCP debugger ke pod di mesin lokal.
  3. Dapatkan akses ke basis data produksi dari alat-alat lokal untuk bekerja dengan database tanpa harus repot dengan otentikasi (biasanya localhost memiliki hak akses root).
  4. Jalankan skrip migrasi satu kali untuk data di cluster staging tanpa harus membuat wadah untuk itu.
  5. Hubungkan sesi VNC ke pod yang menjalankan desktop virtual (lihat XVFB).

Beberapa kata tentang alat yang diperlukan


Tcpserver adalah utilitas Open Source yang tersedia di sebagian besar repositori paket Linux. Ini memungkinkan Anda untuk membuka port lokal dan mengarahkan lalu lintas yang diterima melalui stdin / stdout dari perintah apa pun yang ditentukan untuknya:

 colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OK\r\nContent-Length: 19\r\n\r\n<body>hello!</body>'& [1] 17377 colin@colin-work:~$ curl localhost:8080 <body>hello!</body>colin@colin-work:~$ 

( asciinema.org )

Netcat melakukan yang sebaliknya. Ini memungkinkan Anda untuk terhubung ke port terbuka dan mentransfer input / output yang diterima dari itu ke 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:~$ 

( asciinema.org )

Pada contoh di atas, netcat meminta halaman melalui HTTP. Bendera -C menyebabkannya menambahkan CRLF ke akhir baris.

Tautan dengan kubectl: dengarkan tuan rumah dan hubungkan ke pod


Jika kita menggabungkan alat di atas dengan kubectl, kita mendapatkan perintah seperti ini:

 tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080 

Secara analogi, untuk mengakses port 80 di dalam pod, cukup membuat 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 

( asciinema.org )


Skema Interaksi Utilitas

Di arah yang berlawanan: dengarkan di pod dan sambungkan ke host


 nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat 

Perintah ini memungkinkan pod untuk mengakses port 8000 pada mesin lokal.

Script untuk Bash


Saya menulis skrip khusus untuk Bash yang memungkinkan Anda mengelola kluster produksi Kubernetes LayerCI menggunakan metode yang dijelaskan di atas:

 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" } 

Jika Anda menambahkan fungsi ini ke ~/.bashrc , Anda dapat dengan mudah membuka terowongan di pod dengan perintah kubetunnel web-pod 8080 dan melakukan curl localhost:6666 .

  • Untuk terowongan di Docker, Anda dapat mengganti jalur utama dengan:

     tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT" 
  • untuk terowongan di K3 - ubah ke:

     tcpserver 127.0.0.1 6666 k3s kubectl exec 
  • dll.

Ide lain


  • Anda dapat mengarahkan lalu lintas UDP menggunakan netcat -l -u -c alih-alih tcpserver dan netcat -u alih-alih netcat .
  • Lihat I / O melalui penampil pipa:

    nc 127.0.0.1 8000 | pv --progress | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat
  • Anda dapat mengompres dan mendekompres traffic di kedua ujungnya menggunakan gzip .
  • Terhubung melalui SSH ke komputer lain dengan file kubeconfig sesuai:

    tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80"
  • Anda dapat menghubungkan dua pod dalam kelompok berbeda menggunakan mkfifo dan menjalankan dua kubectl terpisah.

Kemungkinannya tidak terbatas!

PS dari penerjemah


Baca juga di blog kami:

Source: https://habr.com/ru/post/id479910/


All Articles