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
- Periksa apakah HTTP endpoint /healthzdi cluster produksi.
- Hubungkan TCP debugger ke pod di mesin lokal.
- 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).
- Jalankan skrip migrasi satu kali untuk data di cluster staging tanpa harus membuat wadah untuk itu.
- 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 
( asciinema.org ) Skema Interaksi Utilitas
Skema Interaksi UtilitasDi 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 .
Ide lain
- Anda dapat mengarahkan lalu lintas UDP menggunakan netcat -l -u -calih-alihtcpserverdannetcat -ualih-alihnetcat.
- 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 kubeconfigsesuai:
 
 tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80"
- Anda dapat menghubungkan dua pod dalam kelompok berbeda menggunakan mkfifodan menjalankan duakubectlterpisah.
Kemungkinannya tidak terbatas!
PS dari penerjemah
Baca juga di blog kami: