Как Π΄Π° ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ Ρ‚ΡƒΠ½Π΅Π» Π² Kubernetes pod ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с tcpserver ΠΈ netcat

Π—Π°Π±Π΅Π»Π΅ΠΆΠΊΠ°. ΠΏΡ€Π΅Π²ΠΎΠ΄: Π’Π°Π·ΠΈ практичСска Π±Π΅Π»Π΅ΠΆΠΊΠ° ΠΎΡ‚ ΡΡŠΠ·Π΄Π°Ρ‚Π΅Π»Ρ Π½Π° LayerCI Π΅ ΠΎΡ‚Π»ΠΈΡ‡Π½Π° ΠΈΠ»ΡŽΡΡ‚Ρ€Π°Ρ†ΠΈΡ Π½Π° Ρ‚Π°ΠΊΠ° Π½Π°Ρ€Π΅Ρ‡Π΅Π½ΠΈΡ‚Π΅ ΡΡŠΠ²Π΅Ρ‚ΠΈ ΠΈ Ρ‚Ρ€ΠΈΠΊΠΎΠ²Π΅ Π·Π° Kubernetes (ΠΈ Π΄Ρ€ΡƒΠ³ΠΈ). Π Π΅ΡˆΠ΅Π½ΠΈΠ΅Ρ‚ΠΎ, ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ Ρ‚ΡƒΠΊ, Π΅ само Π΅Π΄Π½ΠΎ ΠΎΡ‚ ΠΌΠ°Π»ΠΊΠΎΡ‚ΠΎ ΠΈ ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π½Π΅ Π΅ Π½Π°ΠΉ-ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎΡ‚ΠΎ (Π·Π° някои случаи ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ подходящо β€žΡ€ΠΎΠ΄Π½ΠΎΡ‚ΠΎβ€œ Π·Π° K8, Π²Π΅Ρ‡Π΅ спомСнато Π² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΡ‚Π΅ kubectl port-forward). Π’ΡŠΠΏΡ€Π΅ΠΊΠΈ Ρ‚ΠΎΠ²Π°, Ρ‚ΠΎΠΉ Π²ΠΈ позволява ΠΏΠΎΠ½Π΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅Ρ‚Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° класичСски ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΈ ΠΈ ΠΏΠΎ-Π½Π°Ρ‚Π°Ρ‚ΡŠΡˆΠ½ΠΎΡ‚ΠΎ ΠΈΠΌ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°Π½Π΅ - Π² ΡΡŠΡ‰ΠΎΡ‚ΠΎ Π²Ρ€Π΅ΠΌΠ΅ прости, гъвкави ΠΈ ΠΌΠΎΡ‰Π½ΠΈ (Π²ΠΈΠΆΡ‚Π΅ β€žΠ΄Ρ€ΡƒΠ³ΠΈ ΠΈΠ΄Π΅ΠΈβ€œ Π² края Π·Π° Π²Π΄ΡŠΡ…Π½ΠΎΠ²Π΅Π½ΠΈΠ΅).

Как Π΄Π° ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ Ρ‚ΡƒΠ½Π΅Π» Π² Kubernetes pod ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с tcpserver ΠΈ netcat

ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²Π΅Ρ‚Π΅ си Ρ‚ΠΈΠΏΠΈΡ‡Π½Π° ситуация: искатС ΠΏΠΎΡ€Ρ‚ Π½Π° Π²Π°ΡˆΠ°Ρ‚Π° Π»ΠΎΠΊΠ°Π»Π½Π° машина магичСски Π΄Π° ΠΏΡ€Π΅ΠΏΡ€Π°Ρ‰Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊ към ΠΏΠΎΠ΄/ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ (ΠΈΠ»ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΡ‚ΠΎ).

Π’ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΈ случаи Π½Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°

  1. ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ ΠΊΠ°ΠΊΠ²ΠΎ Π²Ρ€ΡŠΡ‰Π° ΠΊΡ€Π°ΠΉΠ½Π°Ρ‚Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° HTTP /healthz pod Π² производствСния ΠΊΠ»ΡŠΡΡ‚Π΅Ρ€.
  2. Π‘Π²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ TCP Π΄Π΅Π±ΡŠΠ³Π΅Ρ€ към pod Π½Π° Π»ΠΎΠΊΠ°Π»Π½Π°Ρ‚Π° машина.
  3. ΠŸΠΎΠ»ΡƒΡ‡Π΅Ρ‚Π΅ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ производствСната Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ ΠΎΡ‚ инструмСнти Π·Π° Π»ΠΎΠΊΠ°Π»Π½Π° Π±Π°Π·Π° Π΄Π°Π½Π½ΠΈ, Π±Π΅Π· Π΄Π° сС Π½Π°Π»Π°Π³Π° Π΄Π° сС Π·Π°Π½ΠΈΠΌΠ°Π²Π°Ρ‚Π΅ с удостовСряванС (ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ localhost ΠΈΠΌΠ° root ΠΏΡ€Π°Π²Π°).
  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 ΠΏΡ€Π°Π²ΠΈ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΡ‚ΠΎ. Вя Π²ΠΈ позволява Π΄Π° сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ към ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ ΠΏΠΎΡ€Ρ‚ ΠΈ Π΄Π° ΠΏΡ€Π΅Ρ…Π²ΡŠΡ€Π»ΠΈΡ‚Π΅ 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: ΡΠ»ΡƒΡˆΠ°ΠΉΡ‚Π΅ Π½Π° хоста ΠΈ сС ΡΠ²ΡŠΡ€ΠΆΠ΅Ρ‚Π΅ с pod

Ако ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ Π³ΠΎΡ€Π½ΠΈΡ‚Π΅ инструмСнти с 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 pod ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅ΠΉΠ½Π΅Ρ€ с 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, ΠΌΠΎΠΆΠ΅Ρ‚Π΅ лСсно Π΄Π° ΠΎΡ‚Π²ΠΎΡ€ΠΈΡ‚Π΅ Ρ‚ΡƒΠ½Π΅Π» Π² ΠΏΠΎΠ΄ с ΠΊΠΎΠΌΠ°Π½Π΄Π°Ρ‚Π° 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 ΠΎΡ‚ ΠΏΡ€Π΅Π²ΠΎΠ΄Π°Ρ‡Π°

ΠŸΡ€ΠΎΡ‡Π΅Ρ‚Π΅Ρ‚Π΅ ΡΡŠΡ‰ΠΎ Π² нашия Π±Π»ΠΎΠ³:

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€