ืื™ืš ืคื•ืชื—ื™ื ืžื ื”ืจื” ื‘ืคื•ื“ ืื• ืงื•ื ื˜ื™ื™ื ืจ ืฉืœ Kubernetes ืขื tcpserver ื•-netcat

ื”ืขืจื”. ืชืจื’ื•ื: ื”ืขืจื” ืžืขืฉื™ืช ื–ื• ืžื‘ื™ืช ื”ื™ื•ืฆืจ ืฉืœ LayerCI ื”ื™ื ื”ืžื—ืฉื” ืžืฆื•ื™ื ืช ืฉืœ ืžื” ืฉื ืงืจื ืขืฆื•ืช & tricks ืขื‘ื•ืจ Kubernetes (ื•ืขื•ื“). ื”ืคืชืจื•ืŸ ื”ืžื•ืฆืข ื›ืืŸ ื”ื•ื ืจืง ืื—ื“ ืžื”ื‘ื•ื“ื“ื™ื ื•ืื•ืœื™ ืœื ื”ืžื•ื‘ืŸ ืžืืœื™ื• (ื‘ืžืงืจื™ื ืžืกื•ื™ืžื™ื, ื”ืคืชืจื•ืŸ "ื”ืžืงื•ืจื™" ืœ-K8 ืฉื›ื‘ืจ ื”ื•ื–ื›ืจ ื‘ื”ืขืจื•ืช ืขืฉื•ื™ ืœื”ืชืื™ื kubectl port-forward). ืขื ื–ืืช, ื–ื” ืžืืคืฉืจ ืœืš ืœืคื—ื•ืช ืœื”ืกืชื›ืœ ืขืœ ื”ื‘ืขื™ื” ืžื ืงื•ื“ืช ื”ืžื‘ื˜ ืฉืœ ืฉื™ืžื•ืฉ ื‘ื›ืœื™ ืขื–ืจ ืงืœืืกื™ื™ื ื•ืฉื™ืœื•ื‘ ื ื•ืกืฃ ื‘ื™ื ื™ื”ื - ื‘ื• ื–ืžื ื™ืช ืคืฉื•ื˜, ื’ืžื™ืฉ ื•ืขื•ืฆืžืชื™ (ืจืื” "ืจืขื™ื•ื ื•ืช ืื—ืจื™ื" ื‘ืกื•ืฃ ืœื”ืฉืจืื”).

ืื™ืš ืคื•ืชื—ื™ื ืžื ื”ืจื” ื‘ืคื•ื“ ืื• ืงื•ื ื˜ื™ื™ื ืจ ืฉืœ Kubernetes ืขื tcpserver ื•-netcat

ืชืืจ ืœืขืฆืžืš ืžืฆื‘ ื˜ื™ืคื•ืกื™: ืืชื” ืจื•ืฆื” ื™ืฆื™ืื” ื‘ืžื—ืฉื‘ ื”ืžืงื•ืžื™ ืฉืœืš ื›ื“ื™ ืœื”ืขื‘ื™ืจ ืชื ื•ืขื” ื‘ืฆื•ืจื” ืงืกื•ืžื” ืœืชืจืžื™ืœ/ืžื™ื›ืœ (ืื• ืœื”ื™ืคืš).

ืžืงืจื™ ืฉื™ืžื•ืฉ ืืคืฉืจื™ื™ื

  1. ื‘ื“ื•ืง ืžื” ืžื—ื–ื™ืจื” ื ืงื•ื“ืช ื”ืงืฆื” ืฉืœ HTTP /healthz ืชืจืžื™ืœ ื‘ืืฉื›ื•ืœ ื”ื™ื™ืฆื•ืจ.
  2. ื—ื‘ืจ ืžืืชืจ ื‘ืื’ื™ื TCP ืœืคื•ื“ ื‘ืžื—ืฉื‘ ื”ืžืงื•ืžื™.
  3. ืงื‘ืœ ื’ื™ืฉื” ืœืžืกื“ ื”ื ืชื•ื ื™ื ืฉืœ ื”ื™ื™ืฆื•ืจ ืžื›ืœื™ ืžืกื“ ื ืชื•ื ื™ื ืžืงื•ืžื™ื™ื ืžื‘ืœื™ ืœื”ืชืขืกืง ื‘ืื™ืžื•ืช (ื‘ื“ืจืš ื›ืœืœ ืœ-localhost ื™ืฉ ื–ื›ื•ื™ื•ืช ืฉื•ืจืฉ).
  4. ื”ืคืขืœ ืกืงืจื™ืคื˜ ื”ืขื‘ืจื” ื—ื“-ืคืขืžื™ ืขื‘ื•ืจ ื ืชื•ื ื™ื ื‘ืืฉื›ื•ืœ ืฉืœื‘ ืžื‘ืœื™ ืœื™ืฆื•ืจ ืขื‘ื•ืจื• ืงื•ื ื˜ื™ื™ื ืจ.
  5. ื—ื‘ืจ ื”ืคืขืœืช VNC ืœืคื•ื“ ืฉืžืจื™ืฅ ืฉื•ืœื—ืŸ ืขื‘ื•ื“ื” ื•ื™ืจื˜ื•ืืœื™ (ืจืื” XVFB).

ื›ืžื” ืžื™ืœื™ื ืขืœ ื”ื›ืœื™ื ื”ื“ืจื•ืฉื™ื

Tcpserver - ื›ืœื™ ืขื–ืจ ื‘ืงื•ื“ ืคืชื•ื— ื–ืžื™ืŸ ื‘ืจื•ื‘ ืžืื’ืจื™ ื”ื—ื‘ื™ืœื•ืช ืฉืœ ืœื™ื ื•ืงืก. ื–ื” ืžืืคืฉืจ ืœืš ืœืคืชื•ื— ื™ืฆื™ืื” ืžืงื•ืžื™ืช ื•ืœื”ืคื ื•ืช ืชืขื‘ื•ืจื” ืฉื”ืชืงื‘ืœื” ื“ืจืš 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)

ืื™ืš ืคื•ืชื—ื™ื ืžื ื”ืจื” ื‘ืคื•ื“ ืื• ืงื•ื ื˜ื™ื™ื ืจ ืฉืœ 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, ืืชื” ื™ื›ื•ืœ ื‘ืงืœื•ืช ืœืคืชื•ื— ืžื ื”ืจื” ื‘ืชืจืžื™ืœ ืขื ื”ืคืงื•ื“ื” 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 ื‘ื”ืชืืžื”.
  • ื”ืฆื’ ืงืœื˜/ืคืœื˜ ื‘ืืžืฆืขื•ืช ืžืฆื™ื’ ืฆื™ื ื•ืจื•ืช:

    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.

ื”ืืคืฉืจื•ื™ื•ืช ืื™ื ืกื•ืคื™ื•ืช!

ื .ื‘ ืžื”ืžืชืจื’ื

ืงืจื ื’ื ื‘ื‘ืœื•ื’ ืฉืœื ื•:

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”