Jinsi ya kufungua handaki kwenye ganda la Kubernetes au chombo chenye tcpserver na netcat

Kumbuka. tafsiri.: Dokezo hili la vitendo kutoka kwa mtayarishaji wa LayerCI ni kielelezo bora cha kile kinachojulikana kama vidokezo na hila za Kubernetes (na zaidi). Suluhisho lililopendekezwa hapa ni moja tu ya wachache na, labda, sio dhahiri zaidi (kwa baadhi ya matukio, "asili" ya K8 tayari imetajwa kwenye maoni inaweza kufaa. kubectl port-forward) Walakini, hukuruhusu angalau kutazama shida kutoka kwa mtazamo wa kutumia huduma za kitamaduni na kuzichanganya zaidi - wakati huo huo ni rahisi, rahisi na yenye nguvu (angalia "maoni mengine" mwishoni kwa msukumo).

Jinsi ya kufungua handaki kwenye ganda la Kubernetes au chombo chenye tcpserver na netcat

Hebu fikiria hali ya kawaida: unataka bandari kwenye mashine yako ya karibu ili kusambaza trafiki kwa njia ya kichawi kwenye ganda/chombo (au kinyume chake).

Kesi zinazowezekana za matumizi

  1. Angalia kile sehemu ya mwisho ya HTTP inarudi /healthz ganda katika nguzo ya uzalishaji.
  2. Unganisha kitatuzi cha TCP kwenye ganda kwenye mashine ya ndani.
  3. Pata ufikiaji wa hifadhidata ya uzalishaji kutoka kwa zana za hifadhidata za ndani bila kusumbua na uthibitishaji (kwa kawaida localhost huwa na haki za mizizi).
  4. Tekeleza hati ya uhamishaji ya mara moja kwa data katika nguzo ya hatua bila kulazimika kuunda chombo kwa ajili yake.
  5. Unganisha kipindi cha VNC kwenye ganda linaloendesha kompyuta ya mezani (angalia XVFB).

Maneno machache kuhusu zana muhimu

Tcpserver - Huduma ya Open Source inapatikana katika hazina nyingi za kifurushi cha Linux. Inakuruhusu kufungua bandari ya ndani na kuelekeza trafiki iliyopokelewa kupitia stdin/stdout kutoka kwa amri yoyote iliyoainishwa kwake:

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 hufanya kinyume. Inakuruhusu kuunganishwa kwenye bandari iliyo wazi na kupitisha I/O iliyopokelewa kutoka kwake hadi 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)

Katika mfano hapo juu, netcat inaomba ukurasa kupitia HTTP. Bendera -C inasababisha kuambatanisha CRLF hadi mwisho wa mstari.

Muunganisho na kubectl: sikiliza mpangishaji na uunganishe kwenye ganda

Ikiwa tutachanganya zana zilizo hapo juu na kubectl, tunapata amri kama hii:

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

Kwa mlinganisho, kufikia bandari 80 ndani ya pod itakuwa ya kutosha kufanya 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)

Jinsi ya kufungua handaki kwenye ganda la Kubernetes au chombo chenye tcpserver na netcat
Mchoro wa mwingiliano wa matumizi

Kwa upande mwingine: sikiliza kwenye ganda na uunganishe kwa mwenyeji

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

Amri hii inaruhusu pod kufikia bandari 8000 kwenye mashine ya ndani.

Hati ya bash

Niliandika hati maalum ya Bash ambayo hukuruhusu kudhibiti kikundi cha uzalishaji cha Kubernetes TabakaCIkwa kutumia njia iliyoelezwa hapo juu:

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

Ukiongeza kitendakazi hiki kwa ~/.bashrc, unaweza kufungua handaki kwa urahisi kwenye ganda kwa amri kubetunnel web-pod 8080 na kufanya curl localhost:6666.

  • Kwa handaki ndani Docker unaweza kubadilisha mstari kuu na:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • kwa handaki ndani K3 za - ibadilishe kuwa:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • nk

Mawazo mengine

  • Unaweza kuelekeza trafiki ya UDP ukitumia amri netcat -l -u -c badala ya tcpserver ΠΈ netcat -u badala ya netcat ipasavyo.
  • Tazama I/O kupitia kitazamaji bomba:

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

  • Unaweza kukandamiza na kupunguza trafiki kwenye ncha zote mbili kwa kutumia gzip.
  • Unganisha kupitia SSH kwa kompyuta nyingine na faili inayolingana kubeconfig:

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

  • Unaweza kuunganisha maganda mawili katika makundi tofauti kwa kutumia mkfifo na endesha amri mbili tofauti kubectl.

Uwezekano hauna mwisho!

PS kutoka kwa mtafsiri

Soma pia kwenye blogi yetu:

Chanzo: mapenzi.com

Kuongeza maoni