איך פותחים מנהרה בפוד או קונטיינר של Kubernetes עם tcpserver ו-netcat

הערה. תרגום: הערה מעשית זו מבית היוצר של LayerCI היא המחשה מצוינת של מה שנקרא עצות & tricks עבור Kubernetes (ועוד). הפתרון המוצע כאן הוא רק אחד מהבודדים ואולי לא המובן מאליו (במקרים מסוימים, הפתרון "המקורי" ל-K8 שכבר הוזכר בהערות עשוי להתאים kubectl port-forward). עם זאת, זה מאפשר לך לפחות להסתכל על הבעיה מנקודת המבט של שימוש בכלי עזר קלאסיים ושילוב נוסף ביניהם - בו זמנית פשוט, גמיש ועוצמתי (ראה "רעיונות אחרים" בסוף להשראה).

איך פותחים מנהרה בפוד או קונטיינר של Kubernetes עם tcpserver ו-netcat

תאר לעצמך מצב טיפוסי: אתה רוצה יציאה במחשב המקומי שלך כדי להעביר תנועה בצורה קסומה לתרמיל/מיכל (או להיפך).

מקרי שימוש אפשריים

  1. בדוק מה מחזירה נקודת הקצה של HTTP /healthz תרמיל באשכול הייצור.
  2. חבר מאתר באגים TCP לפוד במחשב המקומי.
  3. קבל גישה למסד הנתונים של הייצור מכלי מסד נתונים מקומיים מבלי להתעסק באימות (בדרך כלל ל-localhost יש זכויות שורש).
  4. הפעל סקריפט העברה חד-פעמי עבור נתונים באשכול שלב מבלי ליצור עבורו קונטיינר.
  5. חבר הפעלת VNC לפוד שמריץ שולחן עבודה וירטואלי (ראה 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 עושה את ההיפך. זה מאפשר לך להתחבר ליציאה פתוחה ולהעביר את ה-I/O שהתקבל ממנו ל-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: האזינו במארח והתחברו לפוד

אם נשלב את הכלים לעיל עם kubectl, נקבל פקודה כזו:

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

באנלוגיה, כדי לגשת ליציאה 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

(asciinema.org)

איך פותחים מנהרה בפוד או קונטיינר של Kubernetes עם tcpserver ו-netcat
דיאגרמת אינטראקציה של כלי שירות

בכיוון ההפוך: הקשיבו בפוד והתחברו למארח

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

פקודה זו מאפשרת לפוד לגשת ליציאה 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"
  • עבור מנהרה פנימה K3s - שנה את זה ל:
    tcpserver 127.0.0.1 6666 k3s kubectl exec …
  • וכו '

רעיונות נוספים

  • אתה יכול להפנות תעבורת UDP באמצעות הפקודות netcat -l -u -c במקום tcpserver и netcat -u במקום netcat בהתאמה.
  • הצג קלט/פלט באמצעות מציג צינורות:

    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.

האפשרויות אינסופיות!

נ.ב מהמתרגם

קרא גם בבלוג שלנו:

מקור: www.habr.com

קנה אירוח אמין לאתרים עם הגנת DDoS, שרתי VPS VDS 🔥 קנה אחסון אתרים אמין עם הגנת DDoS, שרתי VPS VDS | ProHoster