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

Catatan. terjemahan: Catatan praktis dari pembuat LayerCI ini merupakan ilustrasi luar biasa tentang apa yang disebut tips & trik untuk Kubernetes (dan masih banyak lagi). Solusi yang diusulkan di sini hanyalah satu dari sedikit dan, mungkin, bukan yang paling jelas (untuk beberapa kasus, solusi β€œasli” untuk K8 yang telah disebutkan dalam komentar mungkin cocok. kubectl port-forward). Namun, ini memungkinkan Anda untuk setidaknya melihat masalah dari sudut pandang penggunaan utilitas klasik dan menggabungkannya lebih lanjut - sekaligus sederhana, fleksibel, dan kuat (lihat β€œide lain” di bagian akhir untuk mendapatkan inspirasi).

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

Bayangkan situasi yang umum: Anda ingin port pada mesin lokal Anda meneruskan lalu lintas secara ajaib ke pod/container (atau sebaliknya).

Kemungkinan kasus penggunaan

  1. Periksa apa yang dikembalikan oleh titik akhir HTTP /healthz pod di cluster produksi.
  2. Hubungkan debugger TCP ke pod di mesin lokal.
  3. Dapatkan akses ke database produksi dari alat database lokal tanpa harus repot dengan otentikasi (biasanya localhost memiliki hak root).
  4. Jalankan skrip migrasi satu kali untuk data dalam klaster penahapan tanpa harus membuat kontainer untuknya.
  5. Hubungkan sesi VNC ke pod yang menjalankan desktop virtual (lihat XVFB).

Beberapa kata tentang alat yang diperlukan

server tcp β€” Utilitas Sumber Terbuka 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 tertentu ke sana:

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 yang sebaliknya. Ini memungkinkan Anda untuk terhubung ke port terbuka dan meneruskan I/O yang diterima darinya 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 menyebabkannya menambahkan CRLF ke akhir baris.

Koneksi dengan kubectl: dengarkan host dan sambungkan ke pod

Jika kita menggabungkan alat-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

Dengan analogi, untuk mengakses port 80 di dalam pod itu sudah cukup 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 terowongan di pod atau container Kubernetes dengan tcpserver dan netcat
Diagram interaksi utilitas

Sebaliknya: 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.

Skrip pesta

Saya menulis skrip khusus untuk Bash yang memungkinkan Anda mengelola kluster produksi Kubernetes LapisanCImenggunakan 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 lakukan curl localhost:6666.

  • Untuk terowongan masuk Buruh pelabuhan Anda dapat mengganti jalur utama dengan:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • untuk terowongan masuk K3 - ubah menjadi:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • dan lain-lain

Ide lain

  • Anda dapat mengarahkan lalu lintas UDP menggunakan perintah netcat -l -u -c daripada tcpserver ΠΈ netcat -u daripada netcat masing.
  • 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 mengompresi dan mendekompresi lalu lintas di kedua ujungnya menggunakan gzip.
  • Hubungkan melalui SSH ke komputer lain dengan file yang sesuai kubeconfig:

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

  • Anda dapat menghubungkan dua pod di cluster yang berbeda menggunakan mkfifo dan jalankan dua perintah terpisah kubectl.

Kemungkinannya tidak terbatas!

PS dari penerjemah

Baca juga di blog kami:

Sumber: www.habr.com

Tambah komentar