Tunnelin avaaminen Kubernetes-kotelossa tai -säiliössä tcpserverillä ja netcatilla

Huomautus. käännös: Tämä LayerCI:n luojan käytännöllinen huomautus on erinomainen esimerkki niin sanotuista Kubernetesin (ja muiden) vihjeistä ja temppuista. Tässä ehdotettu ratkaisu on vain yksi harvoista, eikä ehkä ilmeisin (joissakin tapauksissa kommenteissa jo mainittu "alkuperäinen" K8:lle saattaa olla sopiva kubectl port-forward). Sen avulla voit kuitenkin tarkastella ongelmaa ainakin klassisten apuohjelmien käytön ja niiden edelleen yhdistämisen näkökulmasta - samalla yksinkertaista, joustavaa ja tehokasta (katso lopusta "muut ideat" inspiraatiota varten).

Tunnelin avaaminen Kubernetes-kotelossa tai -säiliössä tcpserverillä ja netcatilla

Kuvittele tyypillinen tilanne: haluat paikallisen koneen portin välittävän liikenteen maagisesti koteloon/säilöön (tai päinvastoin).

Mahdollisia käyttötapauksia

  1. Tarkista, mitä HTTP-päätepiste palauttaa /healthz pod tuotantoklusterissa.
  2. Yhdistä TCP-virheenkorjain paikallisen koneen podiin.
  3. Pääset tuotantotietokantaan paikallisista tietokantatyökaluista ilman, että sinun tarvitsee vaivautua todentamiseen (yleensä localhostilla on pääkäyttäjän oikeudet).
  4. Suorita kertaluonteinen siirtokomentosarja tiedoille vaiheklusterissa ilman, että sinun tarvitsee luoda sille säilöä.
  5. Yhdistä VNC-istunto virtuaalista työpöytää käyttävään podiin (katso XVFB).

Muutama sana tarvittavista työkaluista

Tcpserver — Avoimen lähdekoodin apuohjelma, joka on saatavilla useimmissa Linux-pakettivarastoissa. Sen avulla voit avata paikallisen portin ja ohjata stdin/stdout:n kautta vastaanotetun liikenteen mistä tahansa määritetystä komennosta siihen:

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:~$

(ascinema.org)

Netcat tekee päinvastoin. Sen avulla voit muodostaa yhteyden avoimeen porttiin ja välittää siitä vastaanotetun I/O:n stdin/stdout:lle:

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:~$

(ascinema.org)

Yllä olevassa esimerkissä netcat pyytää sivua HTTP:n kautta. Lippu -C saa sen lisäämään CRLF:n rivin loppuun.

Yhteys kubectliin: kuuntele isännässä ja muodosta yhteys podiin

Jos yhdistämme yllä olevat työkalut kubectlin kanssa, saamme seuraavanlaisen komennon:

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

Analogisesti riittää, että päästään kotelon sisällä olevaan porttiin 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

(ascinema.org)

Tunnelin avaaminen Kubernetes-kotelossa tai -säiliössä tcpserverillä ja netcatilla
Hyödyllisyyden vuorovaikutuskaavio

Vastakkaiseen suuntaan: kuuntele podissa ja muodosta yhteys isäntään

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

Tämän komennon avulla pod pääsee porttiin 8000 paikallisessa koneessa.

Bash-skripti

Kirjoitin Bashille erityisen komentosarjan, jonka avulla voit hallita Kubernetes-tuotantoklusteria LayerCIkäyttämällä yllä kuvattua menetelmää:

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

Jos lisäät tämän toiminnon ~/.bashrc, voit helposti avata tunnelin kotelossa komennolla kubetunnel web-pod 8080 ja tee curl localhost:6666.

  • Tunneliin sisään Satamatyöläinen voit korvata päärivin seuraavasti:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • tunneliin sisään K3s - muuta se muotoon:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • jne.

Muita ideoita

  • Voit ohjata UDP-liikennettä komennoilla netcat -l -u -c sen sijasta tcpserver и netcat -u sen sijasta netcat vastaavasti.
  • Näytä I/O putkikatselun kautta:

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

  • Voit pakata ja purkaa liikennettä molemmista päistä käyttämällä gzip.
  • Yhdistä SSH:n kautta toiseen tietokoneeseen vastaavalla tiedostolla kubeconfig:

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

  • Voit yhdistää kaksi podia eri klusteriin käyttämällä mkfifo ja suorita kaksi erillistä komentoa kubectl.

Mahdollisuudet ovat rajattomat!

PS kääntäjältä

Lue myös blogistamme:

Lähde: will.com

Lisää kommentti