نحوه باز کردن یک تونل در یک غلاف یا ظرف Kubernetes با tcpserver و netcat

توجه داشته باشید. ترجمه: این یادداشت کاربردی از خالق LayerCI یک تصویر عالی از به اصطلاح نکات و ترفندها برای Kubernetes (و بیشتر) است. راه حل ارائه شده در اینجا تنها یکی از معدود و شاید واضح ترین راه حل نیست (برای برخی موارد، راه حل "بومی" برای K8 که قبلا در نظرات ذکر شده است ممکن است مناسب باشد. kubectl port-forward). با این حال، به شما این امکان را می دهد که حداقل از منظر استفاده از ابزارهای کلاسیک و ترکیب بیشتر آنها به مشکل نگاه کنید - در عین حال ساده، انعطاف پذیر و قدرتمند (برای الهام به "ایده های دیگر" در پایان مراجعه کنید).

نحوه باز کردن یک تونل در یک غلاف یا ظرف Kubernetes با tcpserver و netcat

یک موقعیت معمولی را تصور کنید: شما یک پورت در دستگاه محلی خود می خواهید که به طور جادویی ترافیک را به یک pod/container هدایت کند (یا برعکس).

موارد استفاده احتمالی

  1. بررسی کنید که نقطه پایانی HTTP چه چیزی را برمی گرداند /healthz غلاف در خوشه تولید.
  2. یک دیباگر TCP را به پاد دستگاه محلی متصل کنید.
  3. دسترسی به پایگاه داده تولید را از ابزارهای پایگاه داده محلی بدون نیاز به احراز هویت (معمولاً localhost دارای حقوق ریشه است).
  4. یک اسکریپت انتقال یکباره برای داده ها در یک خوشه مرحله بندی بدون نیاز به ایجاد یک ظرف برای آن اجرا کنید.
  5. یک جلسه VNC را به یک پاد که یک دسکتاپ مجازی را اجرا می کند وصل کنید (به XVFB مراجعه کنید).

چند کلمه در مورد ابزار لازم

Tcpserver - یک ابزار منبع باز موجود در اکثر مخازن بسته لینوکس. این به شما امکان می دهد یک پورت محلی را باز کنید و ترافیک دریافتی از طریق 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)

نت کت برعکس عمل می کند. این به شما امکان می دهد به یک پورت باز متصل شوید و ورودی/خروجی دریافتی از آن را به 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

این دستور به 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، با دستور می توانید به راحتی یک تونل را در یک pod باز کنید kubetunnel web-pod 8080 و انجام دهید curl localhost:6666.

  • برای تونل داخل کارگر بارانداز می توانید خط اصلی را جایگزین کنید:
    tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
  • برای تونل در K3 ها - آن را به:
    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.

امکانات بی پایان هستند!

PS از مترجم

در وبلاگ ما نیز بخوانید:

منبع: www.habr.com

اضافه کردن نظر