เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเซ‹เชก เช…เชฅเชตเชพ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ tcpserver เช…เชจเซ‡ netcat เชธเชพเชฅเซ‡ เชŸเชจเชฒ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช–เซ‹เชฒเชตเซ€

เชจเซ‰เซ…เชง. เช…เชจเซเชตเชพเชฆ: LayerCI เชจเชพ เชธเชฐเซเชœเช•เชจเซ€ เช† เชตเซเชฏเชตเชนเชพเชฐเซ เชจเซ‹เช‚เชง เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ (เช…เชจเซ‡ เชตเชงเซ) เชฎเชพเชŸเซ‡ เช•เชนเซ‡เชตเชพเชคเซ€ เชŸเซ€เชชเซเชธ เช…เชจเซ‡ เชฏเซเช•เซเชคเชฟเช“เชจเซเช‚ เช‰เชคเซเชคเชฎ เช‰เชฆเชพเชนเชฐเชฃ เช›เซ‡. เช…เชนเซ€เช‚ เชชเซเชฐเชธเซเชคเชพเชตเชฟเชค เชธเซ‹เชฒเซเชฏเซเชถเชจ เชฎเชพเชคเซเชฐ เชฅเซ‹เชกเชพเชฎเชพเช‚เชฅเซ€ เชเช• เช›เซ‡ เช…เชจเซ‡, เช•เชฆเชพเชš, เชธเซŒเชฅเซ€ เชตเชงเซ เชธเซเชชเชทเซเชŸ เชจเชฅเซ€ (เช•เซ‡เชŸเชฒเชพเช• เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚, เชŸเชฟเชชเซเชชเชฃเซ€เช“เชฎเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค K8 เชฎเชพเชŸเซ‡ "เชฎเซ‚เชณ" เชเช• เชฏเซ‹เช—เซเชฏ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. kubectl port-forward). เชœเซ‹ เช•เซ‡, เชคเซ‡ เชคเชฎเชจเซ‡ เช“เช›เชพเชฎเชพเช‚ เช“เช›เซ€ เชถเชพเชธเซเชคเซเชฐเซ€เชฏ เช‰เชชเชฏเซ‹เช—เชฟเชคเชพเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเชพ เชชเชฐเชฟเชชเซเชฐเซ‡เช•เซเชทเซเชฏเชฎเชพเช‚ เชธเชฎเชธเซเชฏเชพเชจเซ‡ เชœเซ‹เชตเชพเชจเซ€ เช…เชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชตเชงเซ เชธเช‚เชฏเซ‹เชœเชฟเชค เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ - เชคเซ‡ เชœ เชธเชฎเชฏเซ‡ เชธเชฐเชณ, เชฒเชตเชšเซ€เช• เช…เชจเซ‡ เชถเช•เซเชคเชฟเชถเชพเชณเซ€ (เชชเซเชฐเซ‡เชฐเชฃเชพ เชฎเชพเชŸเซ‡ เช…เช‚เชคเชฎเชพเช‚ "เช…เชจเซเชฏ เชตเชฟเชšเชพเชฐเซ‹" เชœเซเช“).

เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเซ‹เชก เช…เชฅเชตเชพ เช•เชจเซเชŸเซ‡เชจเชฐเชฎเชพเช‚ tcpserver เช…เชจเซ‡ netcat เชธเชพเชฅเซ‡ เชŸเชจเชฒ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช–เซ‹เชฒเชตเซ€

เชธเชพเชฎเชพเชจเซเชฏ เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟเชจเซ€ เช•เชฒเซเชชเชจเชพ เช•เชฐเซ‹: เชคเชฎเซ‡ เชคเชฎเชพเชฐเชพ เชธเซเชฅเชพเชจเชฟเช• เชฎเชถเซ€เชจ เชชเชฐเชจเชพ เชชเซ‹เชฐเซเชŸเชจเซ‡ เชœเชพเชฆเซเชˆ เชฐเซ€เชคเซ‡ เชชเซ‹เชก/เช•เชจเซเชŸเซ‡เชจเชฐ (เช…เชฅเชตเชพ เชŠเชฒเชŸเซเช‚) เชชเชฐ เชŸเซเชฐเชพเชซเชฟเช• เชซเซ‹เชฐเชตเชฐเซเชก เช•เชฐเชตเชพ เชฎเชพเช‚เช—เซ‹ เช›เซ‹.

เชธเช‚เชญเชตเชฟเชค เช‰เชชเชฏเซ‹เช—เชจเชพ เช•เชฟเชธเซเชธเชพเช“

  1. เชคเชชเชพเชธเซ‹ เช•เซ‡ HTTP เชเชจเซเชกเชชเซ‹เช‡เชจเซเชŸ เชถเซเช‚ เช†เชชเซ‡ เช›เซ‡ /healthz เช‰เชคเซเชชเชพเชฆเชจ เช•เซเชฒเชธเซเชŸเชฐเชฎเชพเช‚ เชชเซ‹เชก.
  2. เชธเซเชฅเชพเชจเชฟเช• เชฎเชถเซ€เชจ เชชเชฐ TCP เชกเซ€เชฌเช—เชฐเชจเซ‡ เชชเซ‹เชก เชธเชพเชฅเซ‡ เชœเซ‹เชกเซ‹.
  3. เชชเซเชฐเชฎเชพเชฃเซ€เช•เชฐเชฃเชจเซ€ เชšเชฟเช‚เชคเชพ เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เชธเซเชฅเชพเชจเชฟเช• เชกเซ‡เชŸเชพเชฌเซ‡เช เชŸเซ‚เชฒเซเชธเชฎเชพเช‚เชฅเซ€ เช‰เชคเซเชชเชพเชฆเชจ เชกเซ‡เชŸเชพเชฌเซ‡เชเชจเซ€ เชเช•เซเชธเซ‡เชธ เชฎเซ‡เชณเชตเซ‹ (เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชฒเซ‹เช•เชฒเชนเซ‹เชธเซเชŸเชจเซ‡ เชฐเซ‚เชŸ เช…เชงเชฟเช•เชพเชฐเซ‹ เชนเซ‹เชฏ เช›เซ‡).
  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 เชคเซ‡เชจเซ‡ เชฒเซ€เชŸเซ€เชจเชพ เช…เช‚เชคเชฎเชพเช‚ เชธเซ€เช†เชฐเชเชฒเชเชซ เชœเซ‹เชกเชตเชพเชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ‡ เช›เซ‡.

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 เชธเชพเชฅเซ‡ เชŸเชจเชฒ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช–เซ‹เชฒเชตเซ€
เช‰เชชเชฏเซ‹เช—เชฟเชคเชพ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎ

เชตเชฟเชฐเซเชฆเซเชง เชฆเชฟเชถเชพเชฎเชพเช‚: เชชเซ‹เชกเชฎเชพเช‚ เชธเชพเช‚เชญเชณเซ‹ เช…เชจเซ‡ เชนเซ‹เชธเซเชŸ เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เชฅเชพเช“

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

เช† เช†เชฆเซ‡เชถ เชชเซ‹เชกเชจเซ‡ เชธเซเชฅเชพเชจเชฟเช• เชฎเชถเซ€เชจ เชชเชฐ เชชเซ‹เชฐเซเชŸ 8000 เชเช•เซเชธเซ‡เชธ เช•เชฐเชตเชพเชจเซ€ เชชเชฐเชตเชพเชจเช—เซ€ เช†เชชเซ‡ เช›เซ‡.

เชฌเซ‡เชถ เชธเซเช•เซเชฐเชฟเชชเซเชŸ

เชฎเซ‡เช‚ Bash เชฎเชพเชŸเซ‡ เชเช• เช–เชพเชธ เชธเซเช•เซเชฐเชฟเชชเซเชŸ เชฒเช–เซ€ เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เช•เซเชฌเชฐเชจเซ‡เชŸเซเชธ เชชเซเชฐเซ‹เชกเช•เซเชถเชจ เช•เซเชฒเชธเซเชŸเชฐเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡ เชฒเซ‡เชฏเชฐเชธเซ€เช†เชˆเช‰เชชเชฐ เชตเชฐเซเชฃเชตเซ‡เชฒ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡:

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.

  • เชฎเชพเช‚ เชŸเชจเชฒ เชฎเชพเชŸเซ‡ Docker เชคเชฎเซ‡ เชฎเซเช–เซเชฏ เชฒเชพเช‡เชจเชจเซ‡ เช†เชจเชพเชฅเซ€ เชฌเชฆเชฒเซ€ เชถเช•เซ‹ เช›เซ‹:
    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 เช…เชจเซเช•เซเชฐเชฎเซ‡.
  • เชชเชพเช‡เชช เชตเซเชฏเซ‚เช…เชฐ เชฆเซเชตเชพเชฐเชพ 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.

เชถเช•เซเชฏเชคเชพเช“ เช…เชจเช‚เชค เช›เซ‡!

เช…เชจเซเชตเชพเชฆเช• เชคเชฐเชซเชฅเซ€ เชชเซ€เชเชธ

เช…เชฎเชพเชฐเชพ เชฌเซเชฒเซ‹เช— เชชเชฐ เชชเชฃ เชตเชพเช‚เชšเซ‹:

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹