ΠΡΠΈΠΌ. ΠΏΠ΅ΡΠ΅Π².: ΠΡΠ° ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠ°Ρ Π·Π°ΠΌΠ΅ΡΠΊΠ° ΠΎΡ ΡΠΎΠ·Π΄Π°ΡΠ΅Π»Ρ LayerCI β ΠΎΡΠ»ΠΈΡΠ½Π°Ρ ΠΈΠ»Π»ΡΡΡΡΠ°ΡΠΈΡ ΡΠ°ΠΊ Π½Π°Π·ΡΠ²Π°Π΅ΠΌΡΡ
tips & tricks Π΄Π»Ρ Kubernetes (ΠΈ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ). ΠΡΠ΅Π΄Π»Π°Π³Π°Π΅ΠΌΠΎΠ΅ Π·Π΄Π΅ΡΡ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ β Π»ΠΈΡΡ ΠΎΠ΄Π½ΠΎ ΠΈΠ· Π½Π΅ΠΌΠ½ΠΎΠ³ΠΈΡ
ΠΈ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, Π½Π΅ ΡΠ°ΠΌΠΎΠ΅ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΠ΅ (Π΄Π»Ρ Π½Π΅ΠΊΠΎΡΠΎΡΡΡ
ΡΠ»ΡΡΠ°Π΅Π² ΠΌΠΎΠΆΠ΅Ρ ΠΏΠΎΠ΄ΠΎΠΉΡΠΈ ΡΠΆΠ΅ ΡΠΏΠΎΠΌΡΠ½ΡΡΡΠΉ Π² ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡ
Β«ΡΠΎΠ΄Π½ΠΎΠΉΒ» Π΄Π»Ρ K8s kubectl port-forward
ΠΡΠ΅Π΄ΡΡΠ°Π²ΡΡΠ΅ ΡΠΈΠΏΠΈΡΠ½ΡΡ ΡΠΈΡΡΠ°ΡΠΈΡ: Π²Ρ Ρ
ΠΎΡΠΈΡΠ΅, ΡΡΠΎΠ±Ρ ΠΏΠΎΡΡ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΌ ΠΊΠΎΠΌΠΏΡΡΡΠ΅ΡΠ΅ Π²ΠΎΠ»ΡΠ΅Π±Π½ΡΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ ΠΏΠ΅ΡΠ΅Π½Π°ΠΏΡΠ°Π²Π»ΡΠ» ΡΡΠ°ΡΠΈΠΊ Π² pod/ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ (ΠΈΠ»ΠΈ Π½Π°ΠΎΠ±ΠΎΡΠΎΡ).
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΡΡΠ΅Π½Π°ΡΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ
- ΠΡΠΎΠ²Π΅ΡΠΈΡΡ, ΡΡΠΎ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ HTTP endpoint
/healthz
pod’Π° Π² production-ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅. - ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ TCP-ΠΎΡΠ»Π°Π΄ΡΠΈΠΊ ΠΊ pod’Ρ Π½Π° Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΠΌΠ°ΡΠΈΠ½Π΅.
- ΠΠΎΠ»ΡΡΠΈΡΡ Π΄ΠΎΡΡΡΠΏ ΠΊ production-Π±Π°Π·Π΅ ΠΈΠ· Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΎΠ² Π΄Π»Ρ ΡΠ°Π±ΠΎΡΡ Ρ ΠΠ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ Π²ΠΎΠ·ΠΈΡΡΡΡ Ρ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠ΅ΠΉ (ΠΎΠ±ΡΡΠ½ΠΎ Ρ localhost’Π° Π΅ΡΡΡ ΠΏΡΠ°Π²Π° root’Π°).
- ΠΠ°ΠΏΡΡΡΠΈΡΡ ΠΎΠ΄Π½ΠΎΡΠ°Π·ΠΎΠ²ΡΠΉ ΡΠΊΡΠΈΠΏΡ ΠΌΠΈΠ³ΡΠ°ΡΠΈΠΈ Π΄Π»Ρ Π΄Π°Π½Π½ΡΡ Π² staging-ΠΊΠ»Π°ΡΡΠ΅ΡΠ΅ Π±Π΅Π· Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΠΈ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ Π΄Π»Ρ Π½Π΅Π³ΠΎ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ.
- ΠΠΎΠ΄ΠΊΠ»ΡΡΠΈΡΡ ΡΠ΅ΡΡΠΈΡ VNC ΠΊ pod’Ρ Ρ Π·Π°ΠΏΡΡΠ΅Π½Π½ΡΠΌ Π²ΠΈΡΡΡΠ°Π»ΡΠ½ΡΠΌ ΡΠ°Π±ΠΎΡΠΈΠΌ ΡΡΠΎΠ»ΠΎΠΌ (ΡΠΌ. XVFB).
ΠΠ΅ΡΠΊΠΎΠ»ΡΠΊΠΎ ΡΠ»ΠΎΠ² ΠΎ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΡ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ°Ρ
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. ΠΎΡ ΠΏΠ΅ΡΠ΅Π²ΠΎΠ΄ΡΠΈΠΊΠ°
Π§ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π² Π½Π°ΡΠ΅ΠΌ Π±Π»ΠΎΠ³Π΅:
- Β«
ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡ Π΄Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΎΠ² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ, Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌΡΡ Π² Kubernetes Β»; - Β«
Kubernetes tips & tricks: ΠΎ Π»ΠΎΠΊΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ΅ ΠΈ Telepresence Β»; - Β«
ΠΠ»Π°Π³ΠΈΠ½ kubectl-debug Π΄Π»Ρ ΠΎΡΠ»Π°Π΄ΠΊΠΈ Π² pod’Π°Ρ Kubernetes Β»; - Β«
ΠΠΎΠ»Π΅Π·Π½ΡΠ΅ ΡΡΠΈΠ»ΠΈΡΡ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ΅ Ρ Kubernetes Β».
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com