tcpserver және netcat көмегімен Kubernetes pod немесе контейнерде туннельді қалай ашуға болады

Ескерту. аударма: LayerCI жасаушысының бұл практикалық жазбасы Kubernetes (және т.б.) үшін кеңестер мен амалдар деп аталатын тамаша иллюстрация болып табылады. Мұнда ұсынылған шешім аз ғана шешімдердің бірі және, мүмкін, ең айқын емес (кейбір жағдайларда, түсініктемелерде айтылған K8 үшін «туған» шешім қолайлы болуы мүмкін. kubectl port-forward). Дегенмен, бұл мәселені кем дегенде классикалық утилиталарды пайдалану және оларды одан әрі біріктіру тұрғысынан қарауға мүмкіндік береді - сонымен бірге қарапайым, икемді және күшті (шабыт алу үшін соңында «басқа идеяларды» қараңыз).

tcpserver және netcat көмегімен Kubernetes pod немесе контейнерде туннельді қалай ашуға болады

Әдеттегі жағдайды елестетіп көріңіз: жергілікті құрылғыңыздағы порт трафикті сиқырлы түрде подводқа/контейнерге (немесе керісінше) жібергіңіз келеді.

Ықтимал пайдалану жағдайлары

  1. HTTP соңғы нүктесі нені қайтаратынын тексеріңіз /healthz өндірістік кластердегі подвод.
  2. TCP отладкасын жергілікті құрылғыдағы подводқа қосыңыз.
  3. Түпнұсқалық растамамен алаңдамай-ақ жергілікті дерекқор құралдарынан өндірістік дерекқорға қол жеткізіңіз (әдетте localhost түбірлік құқықтары бар).
  4. Кезеңдік кластердегі деректер үшін контейнер жасамай-ақ, бір реттік тасымалдау сценарийін іске қосыңыз.
  5. VNC сеансын виртуалды жұмыс үстелі жұмыс істейтін подводқа қосыңыз (XVFB қараңыз).

Қажетті құралдар туралы бірнеше сөз

Tcpserver — Linux пакетінің репозитарийлерінің көпшілігінде қолжетімді ашық бастапқы қызметтік бағдарлама. Ол жергілікті портты ашуға және оған кез келген көрсетілген пәрменнен stdin/stdout арқылы алынған трафикті қайта бағыттауға мүмкіндік береді:

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 керісінше жасайды. Ол ашық портқа қосылуға және одан алынған енгізу/шығаруды 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)

Жоғарыдағы мысалда netcat HTTP арқылы бетті сұрайды. Жалау -C жолдың соңына CRLF қосуға әкеледі.

kubectl арқылы қосылу: хостты тыңдап, подклюскаға қосылыңыз

Жоғарыдағы құралдарды kubectl-мен біріктіретін болсақ, біз келесідей пәрмен аламыз:

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

Аналогия бойынша, подкаст ішіндегі 80 портқа кіру үшін мұны істеу жеткілікті 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 және netcat көмегімен Kubernetes pod немесе контейнерде туннельді қалай ашуға болады
Утилитаның өзара әрекеттесу диаграммасы

Қарама-қарсы бағытта: қосқышта тыңдаңыз және хостқа қосылыңыз

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

Бұл пәрмен подводқа жергілікті құрылғыдағы 8000 портына кіруге мүмкіндік береді.

Bash сценарийі

Мен Kubernetes өндірістік кластерін басқаруға мүмкіндік беретін Bash үшін арнайы сценарий жаздым LayerCIжоғарыда сипатталған әдісті қолдану:

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

Егер сіз осы функцияны қоссаңыз ~/.bashrc, пәрменімен подкасттағы туннельді оңай ашуға болады kubetunnel web-pod 8080 және жасаңыз curl localhost:6666.

  • Туннель үшін Докер негізгі жолды келесімен ауыстыруға болады:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • туннель үшін Қ3 - оны келесіге өзгертіңіз:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • және т.б.

Басқа идеялар

  • Пәрмендерді пайдаланып UDP трафигін қайта бағыттауға болады netcat -l -u -c орнына tcpserver и netcat -u орнына netcat тиісінше.
  • Құбырларды қарау құралы арқылы енгізу/шығаруды көру:

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

  • Қолдану арқылы екі жақтағы трафикті қысуға және ашуға болады gzip.
  • SSH арқылы сәйкес файлы бар басқа компьютерге қосылыңыз kubeconfig:

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

  • Қолдану арқылы әртүрлі кластерлерде екі қосқышты қосуға болады mkfifo және екі бөлек пәрменді іске қосыңыз kubectl.

Мүмкіндіктер шексіз!

Аудармашыдан PS

Біздің блогта да оқыңыз:

Ақпарат көзі: www.habr.com

пікір қалдыру