Πώς να ανοίξετε ένα τούνελ σε ένα pod ή κοντέινερ Kubernetes με tcpserver και netcat

Σημείωση. μετάφρ.: Αυτή η πρακτική σημείωση από τον δημιουργό του LayerCI είναι μια εξαιρετική απεικόνιση των λεγόμενων tips & tricks για το Kubernetes (και πολλά άλλα). Η λύση που προτείνεται εδώ είναι μόνο μία από τις λίγες και, ίσως, όχι η πιο προφανής (για ορισμένες περιπτώσεις, η "εγγενής" λύση για K8 που αναφέρεται ήδη στα σχόλια μπορεί να είναι κατάλληλη kubectl port-forward). Ωστόσο, σας επιτρέπει να εξετάσετε τουλάχιστον το πρόβλημα από την προοπτική της χρήσης κλασικών βοηθητικών προγραμμάτων και του περαιτέρω συνδυασμού τους - ταυτόχρονα απλά, ευέλικτα και ισχυρά (δείτε «άλλες ιδέες» στο τέλος για έμπνευση).

Πώς να ανοίξετε ένα τούνελ σε ένα pod ή κοντέινερ Kubernetes με tcpserver και netcat

Φανταστείτε μια τυπική κατάσταση: θέλετε μια θύρα στο τοπικό σας μηχάνημα για να προωθήσει μαγικά την κυκλοφορία σε ένα pod/container (ή το αντίστροφο).

Πιθανές περιπτώσεις χρήσης

  1. Ελέγξτε τι επιστρέφει το τελικό σημείο HTTP /healthz λοβό στο σύμπλεγμα παραγωγής.
  2. Συνδέστε ένα πρόγραμμα εντοπισμού σφαλμάτων TCP στο pod του τοπικού υπολογιστή.
  3. Αποκτήστε πρόσβαση στη βάση δεδομένων παραγωγής από εργαλεία τοπικής βάσης δεδομένων χωρίς να χρειάζεται να ασχοληθείτε με τον έλεγχο ταυτότητας (συνήθως ο localhost έχει δικαιώματα root).
  4. Εκτελέστε ένα εφάπαξ σενάριο μετεγκατάστασης για δεδομένα σε ένα σύμπλεγμα σταδιοποίησης χωρίς να χρειάζεται να δημιουργήσετε ένα κοντέινερ για αυτό.
  5. Συνδέστε μια περίοδο λειτουργίας VNC σε ένα pod που εκτελεί εικονική επιφάνεια εργασίας (δείτε XVFB).

Λίγα λόγια για τα απαραίτητα εργαλεία

Tcpserver — Ένα βοηθητικό πρόγραμμα ανοιχτού κώδικα διαθέσιμο στα περισσότερα αποθετήρια πακέτων 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:~$

(asciinema.org)

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

(asciinema.org)

Στο παραπάνω παράδειγμα, η 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

(asciinema.org)

Πώς να ανοίξετε ένα τούνελ σε ένα pod ή κοντέινερ Kubernetes με tcpserver και netcat
Διάγραμμα αλληλεπίδρασης βοηθητικού προγράμματος

Στην αντίθετη κατεύθυνση: ακούστε το pod και συνδεθείτε με τον κεντρικό υπολογιστή

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

Αυτή η εντολή επιτρέπει στο pod να έχει πρόσβαση στη θύρα 8000 στον τοπικό υπολογιστή.

Σενάριο Bash

Έγραψα ένα ειδικό σενάριο για το Bash που σας επιτρέπει να διαχειριστείτε ένα σύμπλεγμα παραγωγής Kubernetes LayerCIχρησιμοποιώντας τη μέθοδο που περιγράφεται παραπάνω:

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, μπορείτε εύκολα να ανοίξετε ένα τούνελ σε μια ομάδα με την εντολή kubetunnel web-pod 8080 και κάνω curl localhost:6666.

  • Για το τούνελ μέσα Λιμενεργάτης μπορείτε να αντικαταστήσετε την κύρια γραμμή με:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • για σήραγγα μέσα Κ3δ - αλλάξτε το σε:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • κλπ.

Άλλες ιδέες

  • Μπορείτε να ανακατευθύνετε την κυκλοφορία UDP χρησιμοποιώντας τις εντολές netcat -l -u -c αντί για tcpserver и netcat -u αντί για netcat αντιστοίχως.
  • Προβολή I/O μέσω του προγράμματος προβολής σωλήνα:

    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"

  • Μπορείτε να συνδέσετε δύο λοβούς σε διαφορετικά συμπλέγματα χρησιμοποιώντας mkfifo και εκτελέστε δύο ξεχωριστές εντολές kubectl.

Οι πιθανότητες είναι ατελείωτες!

ΥΓ από τον μεταφραστή

Διαβάστε επίσης στο blog μας:

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο