Cara membuka terowong dalam pod atau bekas Kubernetes dengan tcpserver dan netcat

Catatan. terjemah: Nota praktikal daripada pencipta LayerCI ini ialah ilustrasi yang sangat baik tentang apa yang dipanggil petua & helah untuk Kubernetes (dan banyak lagi). Penyelesaian yang dicadangkan di sini hanyalah salah satu daripada beberapa dan, mungkin, bukan yang paling jelas (untuk sesetengah kes, penyelesaian "asli" untuk K8 yang telah disebutkan dalam ulasan mungkin sesuai kubectl port-forward). Walau bagaimanapun, ia membolehkan anda sekurang-kurangnya melihat masalah dari perspektif menggunakan utiliti klasik dan menggabungkannya lagi - pada masa yang sama mudah, fleksibel dan berkuasa (lihat "idea lain" di penghujung untuk mendapatkan inspirasi).

Cara membuka terowong dalam pod atau bekas Kubernetes dengan tcpserver dan netcat

Bayangkan situasi biasa: anda mahukan port pada mesin tempatan anda untuk memajukan trafik secara ajaib ke pod/bekas (atau sebaliknya).

Kemungkinan kes penggunaan

  1. Semak perkara yang dikembalikan oleh titik akhir HTTP /healthz pod dalam kelompok pengeluaran.
  2. Sambungkan penyahpepijat TCP ke pod pada mesin tempatan.
  3. Dapatkan akses kepada pangkalan data pengeluaran daripada alat pangkalan data tempatan tanpa perlu bersusah payah dengan pengesahan (biasanya localhost mempunyai hak root).
  4. Jalankan skrip migrasi satu kali untuk data dalam kelompok pementasan tanpa perlu membuat bekas untuknya.
  5. Sambungkan sesi VNC ke pod yang menjalankan desktop maya (lihat XVFB).

Beberapa perkataan tentang alat yang diperlukan

Tcpserver β€” Utiliti Sumber Terbuka tersedia dalam kebanyakan repositori pakej Linux. Ia membolehkan anda membuka port tempatan dan mengubah hala lalu lintas yang diterima melalui stdin/stdout daripada sebarang arahan yang ditentukan kepadanya:

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:~$

(asciinema.org)

Netcat melakukan sebaliknya. Ia membolehkan anda menyambung ke port terbuka dan menghantar I/O yang diterima daripadanya 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)

Dalam contoh di atas, netcat meminta halaman melalui HTTP. Bendera -C menyebabkan ia menambahkan CRLF ke hujung baris.

Sambungan dengan kubectl: dengar pada hos dan sambungkan ke pod

Jika kita menggabungkan alat di atas dengan kubectl, kita mendapat arahan seperti ini:

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

Dengan analogi, untuk mengakses port 80 di dalam pod itu sudah cukup untuk dilakukan 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)

Cara membuka terowong dalam pod atau bekas Kubernetes dengan tcpserver dan netcat
Gambar rajah interaksi utiliti

Dalam arah yang bertentangan: dengar dalam pod dan sambungkan kepada hos

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

Perintah ini membenarkan pod mengakses port 8000 pada mesin tempatan.

Skrip Bash

Saya menulis skrip khas untuk Bash yang membolehkan anda mengurus kelompok pengeluaran Kubernetes LayerCImenggunakan kaedah yang diterangkan 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 menambah fungsi ini kepada ~/.bashrc, anda boleh membuka terowong dalam pod dengan mudah dengan arahan kubetunnel web-pod 8080 dan buat curl localhost:6666.

  • Untuk terowong masuk buruh pelabuhan anda boleh menggantikan baris utama dengan:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • untuk terowong masuk K3s - tukar kepada:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • dan lain-lain

Idea lain

  • Anda boleh mengubah hala lalu lintas UDP menggunakan arahan netcat -l -u -c bukannya tcpserver ΠΈ netcat -u bukannya netcat masing-masing.
  • Lihat I/O melalui pemapar paip:

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

  • Anda boleh memampatkan dan menyahmampat trafik pada kedua-dua hujung menggunakan gzip.
  • Sambung melalui SSH ke komputer lain dengan fail yang sepadan kubeconfig:

    tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80"

  • Anda boleh menyambungkan dua pod dalam kelompok berbeza menggunakan mkfifo dan jalankan dua arahan berasingan kubectl.

Kemungkinannya tidak berkesudahan!

PS daripada penterjemah

Baca juga di blog kami:

Sumber: www.habr.com

Tambah komen