ΠΡΠΈΠΌ. ΠΏΠ΅ΡΠ΅Π².: ΠΡΠ° ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°ΠΌΠ΅ΡΠΊΠ° ΠΎΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ LayerCI β ΠΎΡΠ»ΠΈΡΠ½Π°Ρ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΡ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ tips & tricks Π΄Π»Ρ Kubernetes (ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ). ΠΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ΅ Π·Π΄Π΅ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β Π»ΠΈΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΈ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, Π½Π΅ ΡΠ°ΠΌΠΎΠ΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ (Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ ΡΠ»ΡΡΠ°Π΅Π² ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ΄ΠΎΠΉΡΠΈ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΉ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ Β«ΡΠΎΠ΄Π½ΠΎΠΉΒ» Π΄Π»Ρ K8s ). ΠΠ΄Π½Π°ΠΊΠΎ ΠΎΠ½ΠΎ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΊΠ°ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡΠΌ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π½Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΡ Ρ ΠΏΠΎΠ·ΠΈΡΠΈΠΈ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ ΠΊΠ»Π°ΡΡΠΈΡΠ΅ΡΠΊΠΈΡ ΡΡΠΈΠ»ΠΈΡ ΠΈ ΠΈΡ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅Π³ΠΎ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΡ β ΠΎΠ΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΠΏΡΠΎΡΡΠΎΠ³ΠΎ, Π³ΠΈΠ±ΠΊΠΎΠ³ΠΎ ΠΈ ΠΌΠΎΡΠ½ΠΎΠ³ΠΎ (ΡΠΌ. Β«Π΄ΡΡΠ³ΠΈΠ΅ ΠΈΠ΄Π΅ΠΈΒ» Π² ΠΊΠΎΠ½ΡΠ΅ Π΄Π»Ρ Π²Π΄ΠΎΡ Π½ΠΎΠ²Π΅Π½ΠΈΡ).

ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅ ΡΠΈΠΏΠΈΡΠ½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ: Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΡ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ Π²ΠΎΠ»ΡΠ΅Π±Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ» ΡΡΠ°ΡΠΈΠΊ Π² pod/ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ (ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ).
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
- ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ HTTP endpoint
/healthzpodβΠ° Π² production-ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅. - ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ TCP-ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ ΠΊ podβΡ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅.
- ΠΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ production-Π±Π°Π·Π΅ ΠΈΠ· Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΠ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²ΠΎΠ·ΠΈΡΡΡΡ Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ (ΠΎΠ±ΡΡΠ½ΠΎ Ρ localhostβΠ° Π΅ΡΡΡ ΠΏΡΠ°Π²Π° rootβΠ°).
- ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠΉ ΡΠΊΡΠΈΠΏΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ Π΄Π°Π½Π½ΡΡ Π² staging-ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ.
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΡΠΈΡ VNC ΠΊ podβΡ Ρ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠΌ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΠ°Π±ΠΎΡΠΈΠΌ ΡΡΠΎΠ»ΠΎΠΌ (ΡΠΌ. XVFB).
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠ² ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Ρ
β Open Source-ΡΡΠΈΠ»ΠΈΡΠ°, Π΄ΠΎΡΡΡΠΏΠ½Π°Ρ Π² Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²Π΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠ΅Π² ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² 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:~$()
Netcat Π΄Π΅Π»Π°Π΅Ρ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΠ΅. ΠΠ½Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡΡΡ ΠΊ ΠΎΡΠΊΡΡΡΠΎΠΌΡ ΠΏΠΎΡΡΡ ΠΈ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ ΠΎΡ Π½Π΅Π³ΠΎ Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄ Π½Π° 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:~$()
Π ΠΏΡΠΈΠ²Π΅Π΄Π΅Π½Π½ΠΎΠΌ Π²ΡΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠ΅ 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 Π²Π½ΡΡΡΠΈ podβΠ° Π΄ΠΎΡΡΠ°ΡΠΎΡΠ½ΠΎ Π±ΡΠ΄Π΅Ρ ΡΠ΄Π΅Π»Π°ΡΡ 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()

Π‘Ρ
Π΅ΠΌΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΡ ΡΡΠΈΠ»ΠΈΡ
Π ΠΎΠ±ΡΠ°ΡΠ½ΡΡ ΡΡΠΎΡΠΎΠ½Ρ: ΡΠ»ΡΡΠ°ΠΉΡΠ΅ Π² podβΠ΅ ΠΈ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°ΠΉΡΠ΅ΡΡ ΠΊ Ρ ΠΎΡΡΡ
nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 catΠΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ podβΡ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ ΠΏΠΎΡΡΡ 8000 Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅.
Π‘ΠΊΡΠΈΠΏΡ Π΄Π»Ρ Bash
Π― Π½Π°ΠΏΠΈΡΠ°Π» ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ ΡΠΊΡΠΈΠΏΡ Π΄Π»Ρ Bash, ΠΏΠΎΠ·Π²ΠΎΠ»ΡΡΡΠΈΠΉ ΡΠΏΡΠ°Π²Π»ΡΡΡ production-ΠΊΠ»Π°ΡΡΠ΅ΡΠΎΠΌ 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, ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ ΠΎΡΠΊΡΡΠ²Π°ΡΡ ΡΡΠ½Π½Π΅Π»Ρ Π² pod ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ kubetunnel web-pod 8080 ΠΈ Π΄Π΅Π»Π°ΡΡ curl localhost:6666.
- ΠΠ»Ρ ΡΡΠ½Π½Π΅Π»Ρ Π² Docker ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΡ ΠΎΡΠ½ΠΎΠ²Π½ΡΡ ΡΡΡΠΎΠΊΡ Π½Π°:
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ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ. - ΠΠΎΡΠΌΠΎΡΡΠ΅ΡΡ Π²Π²ΠΎΠ΄/Π²ΡΠ²ΠΎΠ΄ ΡΠ΅ΡΠ΅Π· pipe viewer:
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" - ΠΠΎΠΆΠ½ΠΎ ΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡ Π΄Π²Π° podβΠ° Π² ΡΠ°Π·Π½ΡΡ
ΠΊΠ»Π°ΡΡΠ΅ΡΠ°Ρ
Ρ ΠΏΠΎΠΌΠΎΡΡΡ
mkfifoΠΈ Π·Π°ΠΏΡΡΡΠΈΡΡ Π΄Π²Π΅ ΠΎΡΠ΄Π΅Π»ΡΠ½ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρkubectl.
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ Π±Π΅Π·Π³ΡΠ°Π½ΠΈΡΠ½Ρ!
P.S. ΠΎΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°
Π§ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π±Π»ΠΎΠ³Π΅:
- «»;
- «»;
- «»;
- «».
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com

