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
/healthz
di 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 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 -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: