tcpserver ๋ฐ netcat์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ํฌ๋“œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ„ฐ๋„์„ ์—ฌ๋Š” ๋ฐฉ๋ฒ•

๋ฉ”๋ชจ. ๋ฒˆ์—ญ: LayerCI ์ œ์ž‘์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ด ์‹ค์šฉ์ ์ธ ๋…ธํŠธ๋Š” ์†Œ์œ„ Kubernetes(๋ฐ ๊ทธ ์ด์ƒ)์— ๋Œ€ํ•œ ํŒ๊ณผ ์š”๋ น์„ ํ›Œ๋ฅญํ•˜๊ฒŒ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์€ ๋ช‡ ๊ฐ€์ง€ ์†”๋ฃจ์…˜ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ด๋ฉฐ ์•„๋งˆ๋„ ๊ฐ€์žฅ ๋ช…ํ™•ํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค(์–ด๋–ค ๊ฒฝ์šฐ์—๋Š” ์ด๋ฏธ ์˜๊ฒฌ์— ์–ธ๊ธ‰๋œ K8์šฉ "๊ธฐ๋ณธ" ์†”๋ฃจ์…˜์ด ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Œ). kubectl port-forward). ๊ทธ๋Ÿฌ๋‚˜ ์ตœ์†Œํ•œ ๊ณ ์ „์ ์ธ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ด๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ด€์ ์—์„œ ๋ฌธ์ œ๋ฅผ ์‚ดํŽด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— ๊ฐ„๋‹จํ•˜๊ณ  ์œ ์—ฐํ•˜๋ฉฐ ๊ฐ•๋ ฅํ•ฉ๋‹ˆ๋‹ค(์˜๊ฐ์„ ์–ป์œผ๋ ค๋ฉด ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” "๋‹ค๋ฅธ ์•„์ด๋””์–ด" ์ฐธ์กฐ).

tcpserver ๋ฐ netcat์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ํฌ๋“œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ„ฐ๋„์„ ์—ฌ๋Š” ๋ฐฉ๋ฒ•

์ผ๋ฐ˜์ ์ธ ์ƒํ™ฉ์„ ์ƒ์ƒํ•ด ๋ณด์‹ญ์‹œ์˜ค. ๋กœ์ปฌ ์‹œ์Šคํ…œ์˜ ํฌํŠธ๊ฐ€ ๋งˆ์ˆ ์ฒ˜๋Ÿผ ํŠธ๋ž˜ํ”ฝ์„ ํฌ๋“œ/์ปจํ…Œ์ด๋„ˆ๋กœ(๋˜๋Š” ๊ทธ ๋ฐ˜๋Œ€๋กœ) ์ „๋‹ฌํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€

  1. HTTP ์—”๋“œํฌ์ธํŠธ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‚ด์šฉ์„ ํ™•์ธํ•˜์„ธ์š”. /healthz ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์˜ ํฌ๋“œ.
  2. TCP ๋””๋ฒ„๊ฑฐ๋ฅผ ๋กœ์ปฌ ๋จธ์‹ ์˜ Pod์— ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  3. ์ธ์ฆ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ ๋„ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋„๊ตฌ์—์„œ ํ”„๋กœ๋•์…˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ localhost์—๋Š” ๋ฃจํŠธ ๊ถŒํ•œ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ƒ์„ฑํ•  ํ•„์š” ์—†์ด ์Šคํ…Œ์ด์ง• ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ผํšŒ์„ฑ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  5. ๊ฐ€์ƒ ๋ฐ์Šคํฌํ†ฑ์„ ์‹คํ–‰ํ•˜๋Š” ํฌ๋“œ์— VNC ์„ธ์…˜์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค(XVFB ์ฐธ์กฐ).

ํ•„์š”ํ•œ ๋„๊ตฌ์— ๋Œ€ํ•œ ๋ช‡ ๋งˆ๋””

TCP์„œ๋ฒ„ โ€” ๋Œ€๋ถ€๋ถ„์˜ 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)

tcpserver ๋ฐ netcat์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ํฌ๋“œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ์—์„œ ํ„ฐ๋„์„ ์—ฌ๋Š” ๋ฐฉ๋ฒ•
์œ ํ‹ธ๋ฆฌํ‹ฐ ์ƒํ˜ธ ์ž‘์šฉ ๋‹ค์ด์–ด๊ทธ๋žจ

๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ: ํฌ๋“œ์—์„œ ์ˆ˜์‹  ๋Œ€๊ธฐํ•˜๊ณ  ํ˜ธ์ŠคํŠธ์— ์—ฐ๊ฒฐ

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

์ด ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜๋ฉด Pod๊ฐ€ ๋กœ์ปฌ ์‹œ์Šคํ…œ์˜ ํฌํŠธ 8000์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์‰ฌ ์Šคํฌ๋ฆฝํŠธ

Kubernetes ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” Bash์šฉ ํŠน์ˆ˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ ˆ์ด์–ดCI์œ„์— ์„ค๋ช…๋œ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ:

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.

๊ฐ€๋Šฅ์„ฑ์€ ๋ฌดํ•œํ•ฉ๋‹ˆ๋‹ค!

๋ฒˆ์—ญ๊ฐ€์˜ ์ถ”์‹ 

๋ธ”๋กœ๊ทธ์—์„œ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€