Hur man öppnar en tunnel i en Kubernetes pod eller container med tcpserver och netcat

Notera. transl.: Denna praktiska anteckning från skaparen av LayerCI är en utmärkt illustration av de så kallade tips & tricks för Kubernetes (och mer). Den lösning som föreslås här är bara en av de få och kanske inte den mest uppenbara (för vissa fall kan den "inhemska" för K8:or som redan nämns i kommentarerna vara lämplig kubectl port-forward). Men det låter dig åtminstone se på problemet ur perspektivet att använda klassiska verktyg och ytterligare kombinera dem - samtidigt enkelt, flexibelt och kraftfullt (se "andra idéer" i slutet för inspiration).

Hur man öppnar en tunnel i en Kubernetes pod eller container med tcpserver och netcat

Föreställ dig en typisk situation: du vill ha en port på din lokala dator för att magiskt vidarebefordra trafik till en pod/behållare (eller vice versa).

Möjliga användningsfall

  1. Kontrollera vad HTTP-slutpunkten returnerar /healthz pod i produktionsklustret.
  2. Anslut en TCP-felsökare till podden på den lokala datorn.
  3. Få tillgång till produktionsdatabasen från lokala databasverktyg utan att behöva bry sig om autentisering (vanligtvis har localhost root-rättigheter).
  4. Kör ett engångsmigreringsskript för data i ett staging-kluster utan att behöva skapa en behållare för det.
  5. Anslut en VNC-session till en pod som kör ett virtuellt skrivbord (se XVFB).

Några ord om de nödvändiga verktygen

Tcpserver — Ett verktyg med öppen källkod tillgängligt i de flesta Linux-paketförråd. Det låter dig öppna en lokal port och omdirigera trafik som tas emot via stdin/stdout från valfritt angivet kommando till den:

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 gör tvärtom. Den låter dig ansluta till en öppen port och skicka I/O som tas emot från den till 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)

I exemplet ovan begär netcat sidan över HTTP. Flagga -C får den att lägga till CRLF i slutet av raden.

Anslutning till kubectl: lyssna på värden och anslut till podden

Om vi ​​kombinerar ovanstående verktyg med kubectl får vi ett kommando så här:

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

I analogi med att komma åt port 80 inuti podden kommer det att räcka att göra 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)

Hur man öppnar en tunnel i en Kubernetes pod eller container med tcpserver och netcat
Verktygsinteraktionsdiagram

I motsatt riktning: lyssna i podden och anslut till värden

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

Detta kommando låter podden komma åt port 8000 på den lokala maskinen.

Bash manus

Jag skrev ett speciellt skript för Bash som låter dig hantera ett Kubernetes-produktionskluster LayerCImed metoden som beskrivs ovan:

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"
}

Om du lägger till denna funktion till ~/.bashrc, kan du enkelt öppna en tunnel i en pod med kommandot kubetunnel web-pod 8080 och gör curl localhost:6666.

  • För tunneln in Hamnarbetare du kan ersätta huvudlinjen med:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • för tunnel in K3s - ändra det till:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • etc.

Andra idéer

  • Du kan omdirigera UDP-trafik med hjälp av kommandona netcat -l -u -c istället för tcpserver и netcat -u istället för netcat respektive.
  • Visa I/O via pipe viewer:

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

  • Du kan komprimera och dekomprimera trafik i båda ändar med hjälp av gzip.
  • Anslut via SSH till en annan dator med motsvarande fil kubeconfig:

    tcpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80"

  • Du kan koppla två pods i olika kluster med hjälp av mkfifo och kör två separata kommandon kubectl.

Möjligheterna är oändliga!

PS från översättaren

Läs även på vår blogg:

Källa: will.com

Lägg en kommentar