Чӣ гуна нақбро дар як контейнер ё контейнери Kubernetes бо tcpserver ва netcat кушоед

Шарҳ. тарҷума.: Ин ёддошти амалӣ аз созандаи LayerCI як тасвири олиҷаноби ба истилоҳ маслиҳатҳо ва ҳилаҳо барои Kubernetes аст (ва на танҳо). Ҳалли дар ин ҷо пешниҳодшуда танҳо яке аз чанде аст ва эҳтимолан возеҳтарин нест (барои баъзе ҳолатҳо, "модарӣ" барои K8s, ки дар шарҳҳо зикр шудаанд, мувофиқанд. kubectl port-forward). Бо вуҷуди ин, он ба шумо имкон медиҳад, ки ҳадди аққал ба мушкилот аз нуқтаи назари истифодаи утилитаҳои классикӣ ва муттаҳидсозии минбаъдаи онҳо - ҳамзамон содда, чандир ва тавоно назар кунед (барои илҳом дар охири “дигар ғояҳо” нигаред).

Чӣ гуна нақбро дар як контейнер ё контейнери Kubernetes бо tcpserver ва netcat кушоед

Вазъияти маъмулиро тасаввур кунед: шумо мехоҳед, ки бандари мошини маҳаллии шумо трафикро ба таври ҷодугарӣ ба поддон/контейнер интиқол диҳад (ё баръакс).

Ҳолатҳои эҳтимолии истифода

  1. Санҷед, ки нуқтаи ниҳоии HTTP чӣ бармегардад /healthz pod дар кластери истеҳсолӣ.
  2. Debuger 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)

Чӣ гуна нақбро дар як контейнер ё контейнери Kubernetes бо tcpserver ва netcat кушоед
Диаграммаи таъсири мутақобилаи коммуналӣ

Дар самти муқобил: дар подкаст гӯш кунед ва ба мизбон пайваст шавед

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

Ин фармон ба поддон имкон медиҳад, ки ба порти 8000 дар мошини маҳаллӣ дастрасӣ пайдо кунад.

Скрипти Bash

Ман барои 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, шумо метавонед ба осонӣ нақби дар pod бо фармон кушоед 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 аз тарҷумон

Инчунин дар блоги мо хонед:

Манбаъ: will.com

Илова Эзоҳ