Tcpserver жана netcat менен Kubernetes поддонунда же контейнерде туннелди кантип ачуу керек

Эскертүү. котормо.: LayerCI жаратуучусунун бул практикалык эскертүүсү Kubernetes (жана башкалар) үчүн кеңештер жана амалдар деп аталган нерселердин эң сонун иллюстрациясы болуп саналат. Бул жерде сунушталган чечим саналуу чечимдердин бири гана жана, балким, эң айкын эмес (айрым учурларда, комментарийлерде айтылган K8 үчүн "түпкүлүктүү" чечим ылайыктуу болушу мүмкүн. kubectl port-forward). Бирок, бул көйгөйдү жок дегенде классикалык утилиталарды колдонуу жана аларды андан ары айкалыштыруу көз карашынан кароого мүмкүндүк берет - ошол эле учурда жөнөкөй, ийкемдүү жана күчтүү (илхам үчүн аягында "башка идеяларды" караңыз).

Tcpserver жана netcat менен Kubernetes поддонунда же контейнерде туннелди кантип ачуу керек

Кадимки кырдаалды элестетиңиз: жергиликтүү машинаңыздагы порт трафикти сыйкырдуу түрдө поддонго/контейнерге (же тескерисинче) жөнөтүшүн каалайсыз.

Мүмкүн болгон колдонуу учурлары

  1. HTTP акыркы чекити эмнени кайтарарын текшериңиз /healthz өндүрүштүк кластердеги под.
  2. TCP мүчүлүштүктөрдү жоюгучту жергиликтүү машинадагы подкокко туташтырыңыз.
  3. Аныктыгын текшерүү менен убара болбой туруп, жергиликтүү маалымат базасынын куралдарынан өндүрүш базасына кирүү мүмкүнчүлүгүн алыңыз (көбүнчө localhost тамыр укуктары бар).
  4. Статистика кластериндеги маалыматтар үчүн бир жолку көчүрүү скриптин ага контейнер түзбөстөн иштетиңиз.
  5. VNC сеансын виртуалдык иштакта иштеген подкокко туташтырыңыз (XVFB караңыз).

зарыл болгон куралдар жөнүндө бир нече сөз

Tcpserver — Open Source утилитасы 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 тескерисинче кылат. Бул ачык портко туташып, андан алынган I/Oну 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 поддонунда же контейнерде туннелди кантип ачуу керек
Утилитанын өз ара аракеттенүү диаграммасы

Карама-каршы багытта: поддонду угуп, хостко туташыңыз

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

Бул буйрук поддонго жергиликтүү машинадагы 8000 портуна кирүү мүмкүнчүлүгүн берет.

Баш скрипти

Мен Bash үчүн атайын скрипт жаздым, ал сизге Kubernetes өндүрүш кластерин башкарууга мүмкүндүк берет 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"
  • туннель үчүн K3s - аны өзгөртүү:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • жана башкалар.

Башка идеялар

  • Сиз буйруктарды колдонуп UDP трафигин кайра багыттай аласыз netcat -l -u -c ордуна tcpserver и netcat -u ордуна netcat тиешелүүлүгүнө жараша.
  • Түтүк көрүүчү аркылуу I/O көрүү:

    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

Биздин блогдон дагы окуңуз:

Source: www.habr.com

Комментарий кошуу