Tcpserver və netcat ilə Kubernetes pod və ya konteynerində tuneli necə açmaq olar

Qeyd. tərcümə.: LayerCI yaradıcısının bu praktik qeydi Kubernetes (və daha çox) üçün sözdə məsləhətlər və fəndlərin əla təsviridir. Burada təklif olunan həll yalnız bir neçə və bəlkə də ən bariz deyil (bəzi hallarda şərhlərdə artıq qeyd olunan K8-lər üçün "doğma" uyğun ola bilər. kubectl port-forward). Bununla belə, bu, ən azı problemə klassik kommunallardan istifadə və onları daha da birləşdirmək nöqteyi-nəzərindən baxmağa imkan verir - eyni zamanda sadə, çevik və güclü (ilham üçün sonda "digər fikirlərə" baxın).

Tcpserver və netcat ilə Kubernetes pod və ya konteynerində tuneli necə açmaq olar

Tipik bir vəziyyəti təsəvvür edin: yerli maşınınızdakı bir portun trafiki sehirli şəkildə pod/konteynerə (və ya əksinə) yönləndirməsini istəyirsiniz.

Mümkün istifadə halları

  1. HTTP son nöqtəsinin nə qaytardığını yoxlayın /healthz istehsal klasterində pod.
  2. TCP sazlayıcısını yerli maşındakı poda qoşun.
  3. Doğrulama ilə narahat olmadan yerli verilənlər bazası alətlərindən istehsal verilənlər bazasına giriş əldə edin (adətən localhost kök hüquqlarına malikdir).
  4. Onun üçün konteyner yaratmadan, bir quruluş klasterində məlumat üçün birdəfəlik miqrasiya skriptini işə salın.
  5. VNC seansını virtual iş masası ilə işləyən poda qoşun (bax: XVFB).

Lazımi alətlər haqqında bir neçə kəlmə

Tcpserver — Əksər Linux paket anbarlarında mövcud olan Açıq Mənbəli yardım proqramı. Bu, yerli portu açmağa və stdin/stdout vasitəsilə alınan hər hansı müəyyən edilmiş komandadan trafiki yönləndirməyə imkan verir:

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 bunun əksini edir. O, açıq porta qoşulmağa və ondan alınan I/O-nu stdin/stdout-a ötürməyə imkan verir:

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)

Yuxarıdakı misalda netcat səhifəni HTTP üzərindən tələb edir. Bayraq -C CRLF-ni xəttin sonuna əlavə etməyə səbəb olur.

Kubectl ilə əlaqə: hostu dinləyin və pod-a qoşulun

Yuxarıdakı alətləri kubectl ilə birləşdirsək, belə bir əmr alırıq:

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

Analoji olaraq, pod daxilində 80 portuna daxil olmaq üçün bunu etmək kifayətdir 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)

Tcpserver və netcat ilə Kubernetes pod və ya konteynerində tuneli necə açmaq olar
Kommunal qarşılıqlı əlaqə diaqramı

Əks istiqamətdə: podda qulaq asın və ev sahibi ilə əlaqə saxlayın

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

Bu əmr poda yerli maşında 8000 portuna daxil olmağa imkan verir.

Bash skripti

Bash üçün Kubernetes istehsal klasterini idarə etməyə imkan verən xüsusi skript yazdım LayerCIyuxarıda təsvir olunan üsuldan istifadə edərək:

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

Bu funksiyanı əlavə etsəniz ~/.bashrc, əmri ilə podda tuneli asanlıqla aça bilərsiniz kubetunnel web-pod 8080 və edin curl localhost:6666.

  • İçəridəki tunel üçün yükvuran əsas xətti aşağıdakılarla əvəz edə bilərsiniz:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • tunel üçün K3 - onu dəyişdirin:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • və s.

Digər fikirlər

  • Əmrlərdən istifadə edərək UDP trafikini yönləndirə bilərsiniz netcat -l -u -c əvəzinə tcpserver и netcat -u əvəzinə netcat müvafiq.
  • Boru görüntüləyicisi vasitəsilə I/O-ya baxın:

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

  • İstifadə edərək hər iki tərəfdən trafiki sıxışdıra və dekompressiya edə bilərsiniz gzip.
  • SSH vasitəsilə müvafiq faylı olan başqa bir kompüterə qoşulun kubeconfig:

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

  • Istifadə edərək müxtəlif klasterlərdə iki podu birləşdirə bilərsiniz mkfifo və iki ayrı əmri yerinə yetirin kubectl.

Ətraflı məlumat!

Tərcüməçidən PS

Bloqumuzda da oxuyun:

Mənbə: www.habr.com

Добавить комментарий