كيفية فتح نفق في جراب Kubernetes أو حاوية مع tcpserver و netcat

تقريبا. العابرة. : هذه المذكرة العملية من خالق LayerCI هي مثال رائع على ما يسمى بالنصائح والحيل لـ Kubernetes (وليس فقط). الحل المقترح هنا هو واحد فقط من الحلول القليلة ، وربما ليس الأكثر وضوحًا (في بعض الحالات ، قد يكون " kubectl port-forward " الأصلي إلى K8s المذكورة في التعليقات مناسبًا). ومع ذلك ، فإنه يتيح لك على الأقل النظر إلى المشكلة من منظور استخدام الأدوات الكلاسيكية ومزيجها الإضافي - البسيط والمرن والقوي (انظر "أفكار أخرى" في النهاية للإلهام).



تخيل موقفًا نموذجيًا: تريد من المنفذ الموجود على الكمبيوتر المحلي إعادة توجيه حركة المرور بطريقة سحرية إلى pod / الحاوية (أو العكس).

حالات الاستخدام الممكنة


  1. تحقق من أن /healthz HTTP endpoint /healthz في كتلة الإنتاج.
  2. قم بتوصيل مصحح TCP إلى pod على الجهاز المحلي.
  3. يمكنك الوصول إلى قاعدة بيانات الإنتاج من الأدوات المحلية للعمل مع قاعدة البيانات دون الاضطرار إلى المصادقة (عادة ما يكون لدى المضيف المحلي امتيازات الجذر).
  4. قم بتشغيل برنامج نصي ترحيل لمرة واحدة للبيانات الموجودة في نظام المجموعة المرحلي دون الحاجة إلى إنشاء حاوية له.
  5. قم بتوصيل جلسة VNC بأداة تشغيل سطح مكتب افتراضي (انظر XVFB).

بضع كلمات عن الأدوات اللازمة


Tcpserver هو أداة مساعدة مفتوحة المصدر متوفرة في معظم مستودعات حزمة Linux. يسمح لك بفتح منفذ محلي وإعادة توجيه حركة المرور المستلمة من خلال stdin / stdout من أي أمر محدد إليه:

 colin@colin-work:~$ tcpserver 127.0.0.1 8080 echo -e 'HTTP/1.0 200 OK\r\nContent-Length: 19\r\n\r\n<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: الاستماع على المضيف والاتصال جراب


إذا قمنا بدمج الأدوات المذكورة أعلاه مع 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 )


مخطط تفاعل المنفعة

في الاتجاه المعاكس: استمع إلى الحاضنة واتصل بالمضيف


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

يسمح هذا الأمر للجهاز بالوصول إلى المنفذ 8000 على الجهاز المحلي.

سيناريو باش


كتبت نصًا خاصًا لـ 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 .

  • للحصول على نفق في Docker ، يمكنك استبدال الخط الرئيسي بـ:

     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 على التوالي.
  • عرض 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 في مجموعات مختلفة باستخدام mkfifo وتشغيل أمرين kubectl منفصلين.

الاحتمالات لا حصر لها!

PS من المترجم


اقرأ أيضًا في مدونتنا:

Source: https://habr.com/ru/post/ar479910/


All Articles