tcpserver рд░ netcat рдХреЛ рд╕рд╛рде Kubernetes рдкреЛрдб рд╡рд╛ рдХрдиреНрдЯреЗрдирд░рдорд╛ рдЯрдиреЗрд▓ рдХрд╕рд░реА рдЦреЛрд▓реНрдиреЗ

рдиреЛрдЯред рдЕрдиреБрд╡рд╛рджред: LayerCI рдХреЛ рд╕рд┐рд░реНрдЬрдирд╛рдХрд░реНрддрд╛рдХреЛ рдпреЛ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдиреЛрдЯ Kubernetes (рд░ рдердк) рдХреЛ рд▓рд╛рдЧрд┐ рддрдерд╛рдХрдерд┐рдд рд╕реБрдЭрд╛рд╡ рд░ рдпреБрдХреНрддрд┐рд╣рд░реВрдХреЛ рдЙрддреНрдХреГрд╖реНрдЯ рджреГрд╖реНрдЯрд╛рдиреНрдд рд╣реЛред рдпрд╣рд╛рдБ рдкреНрд░рд╕реНрддрд╛рд╡рд┐рдд рд╕рдорд╛рдзрд╛рди рдХреЗрд╣рд┐ рдордзреНрдпреЗ рдПрдХ рдорд╛рддреНрд░ рд╣реЛ рд░, рд╕рд╛рдпрдж, рд╕рдмреИ рднрдиреНрджрд╛ рд╕реНрдкрд╖реНрдЯ рдЫреИрди (рдХреЗрд╣рд┐ рдХреЗрд╕рдорд╛, рдЯрд┐рдкреНрдкрдгреАрд╣рд░реВрдорд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рдЙрд▓реНрд▓реЗрдЦ рдЧрд░рд┐рдПрдХреЛ K8 рдХреЛ рд▓рд╛рдЧрд┐ "рдиреЗрдЯрд┐рдн" рдЙрдкрдпреБрдХреНрдд рд╣реБрди рд╕рдХреНрдЫред kubectl port-forward)ред рдпрджреНрдпрдкрд┐, рдпрд╕рд▓реЗ рддрдкрд╛рдЗрдБрд▓рд╛рдИ рд╢рд╛рд╕реНрддреНрд░реАрдп рдЙрдкрдпреЛрдЧрд┐рддрд╛рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рд░ рддрд┐рдиреАрд╣рд░реВрд▓рд╛рдИ рдердк рд╕рдВрдпреЛрдЬрди рдЧрд░реНрдиреЗ рдкрд░рд┐рдкреНрд░реЗрдХреНрд╖реНрдпрдмрд╛рдЯ рд╕рдорд╕реНрдпрд╛рд▓рд╛рдИ рд╣реЗрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ - рдПрдХреИ рд╕рдордпрдорд╛ рд╕рд░рд▓, рд▓рдЪрд┐рд▓реЛ рд░ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА (рдкреНрд░реЗрд░рдгрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреНрддрдорд╛ "рдЕрдиреНрдп рд╡рд┐рдЪрд╛рд░рд╣рд░реВ" рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН)ред

tcpserver рд░ netcat рдХреЛ рд╕рд╛рде Kubernetes рдкреЛрдб рд╡рд╛ рдХрдиреНрдЯреЗрдирд░рдорд╛ рдЯрдиреЗрд▓ рдХрд╕рд░реА рдЦреЛрд▓реНрдиреЗ

рдПрдЙрдЯрд╛ рд╕рд╛рдорд╛рдиреНрдп рдЕрд╡рд╕реНрдерд╛рдХреЛ рдХрд▓реНрдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН: рддрдкрд╛рдИрдВ рдЖрдлреНрдиреЛ рд╕реНрдерд╛рдиреАрдп рдореЗрд╕рд┐рдирдорд╛ рд░рд╣реЗрдХреЛ рдкреЛрд░реНрдЯрд▓рд╛рдИ рдЬрд╛рджреБрдИ рд░реВрдкрдорд╛ рдкреЛрдб/рдХрдиреНрдЯреЗрдирд░рдорд╛ рдЯреНрд░рд╛рдлрд┐рдХ рдлрд░реНрд╡рд╛рд░реНрдб рдЧрд░реНрди рдЪрд╛рд╣рдиреБрд╣реБрдиреНрдЫ (рд╡рд╛ рдпрд╕рдХреЛ рд╡рд┐рдкрд░реАрдд)ред

рд╕рдореНрднрд╛рд╡рд┐рдд рдкреНрд░рдпреЛрдЧ рдХреЗрд╕рд╣рд░реВ

  1. HTTP рдЕрдиреНрддреНрдп рдмрд┐рдиреНрджреБрд▓реЗ рдХреЗ рдлрд░реНрдХрд╛рдЙрдБрдЫ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреБрд╣реЛрд╕реН /healthz рдЙрддреНрдкрд╛рджрди рдХреНрд▓рд╕реНрдЯрд░рдорд╛ рдкреЛрдбред
  2. рд╕реНрдерд╛рдиреАрдп рдореЗрд╕рд┐рдирдХреЛ рдкреЛрдбрдорд╛ TCP рдбрд┐рдмрдЧрд░ рдЬрдбрд╛рди рдЧрд░реНрдиреБрд╣реЛрд╕реНред
  3. рдкреНрд░рдорд╛рдгреАрдХрд░рдгрдХреЛ рд╕рд╛рде рдкрд░реЗрд╢рд╛рди рдирдЧрд░реА рд╕реНрдерд╛рдиреАрдп рдбрд╛рдЯрд╛рдмреЗрд╕ рдЙрдкрдХрд░рдгрд╣рд░реВрдмрд╛рдЯ рдЙрддреНрдкрд╛рджрди рдбрд╛рдЯрд╛рдмреЗрд╕рдорд╛ рдкрд╣реБрдБрдЪ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреБрд╣реЛрд╕реН (рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рд▓реЛрдХрд▓рд╣реЛрд╕реНрдЯрдХреЛ рд░реВрдЯ рдЕрдзрд┐рдХрд╛рд░рд╣рд░реВ рдЫрдиреН)ред
  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)

tcpserver рд░ netcat рдХреЛ рд╕рд╛рде Kubernetes рдкреЛрдб рд╡рд╛ рдХрдиреНрдЯреЗрдирд░рдорд╛ рдЯрдиреЗрд▓ рдХрд╕рд░реА рдЦреЛрд▓реНрдиреЗ
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛ рд░реЗрдЦрд╛рдЪрд┐рддреНрд░

рд╡рд┐рдкрд░рд┐рдд рджрд┐рд╢рд╛рдорд╛: рдкреЛрдбрдорд╛ рд╕реБрдиреНрдиреБрд╣реЛрд╕реН рд░ рд╣реЛрд╕реНрдЯрдорд╛ рдЬрдбрд╛рди рдЧрд░реНрдиреБрд╣реЛрд╕реН

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

рдпреЛ рдЖрджреЗрд╢рд▓реЗ рдкреЛрдбрд▓рд╛рдИ рд╕реНрдерд╛рдиреАрдп рдореЗрд╕рд┐рдирдорд╛ рдкреЛрд░реНрдЯ 8000 рдкрд╣реБрдБрдЪ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

рдмреНрдпрд╛рд╕ рд▓рд┐рдкрд┐

рдореИрд▓реЗ Bash рдХреЛ рд▓рд╛рдЧрд┐ рдПрдЙрдЯрд╛ рд╡рд┐рд╢реЗрд╖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЗрдЦреЗрдХреЛ рдЫреБ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ Kubernetes рдЙрддреНрдкрд╛рджрди рдХреНрд▓рд╕реНрдЯрд░ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫ рд▓реЗрдпрд░рд╕реАрдЖрдИрдорд╛рдерд┐ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рд╡рд┐рдзрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░:

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди