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

تخيل موقفًا نموذجيًا: تريد منفذًا على جهازك المحلي لتوجيه حركة المرور بطريقة سحرية إلى حجرة/حاوية (أو العكس).
حالات الاستخدام الممكنة
- تحقق مما ترجعه نقطة نهاية HTTP
/healthzجراب في كتلة الإنتاج. - قم بتوصيل مصحح أخطاء TCP بالجراب الموجود على الجهاز المحلي.
- يمكنك الوصول إلى قاعدة بيانات الإنتاج من أدوات قاعدة البيانات المحلية دون الحاجة إلى الاهتمام بالمصادقة (عادةً ما يكون للمضيف المحلي حقوق الجذر).
- قم بتشغيل برنامج نصي للترحيل لمرة واحدة للبيانات الموجودة في مجموعة مرحلية دون الحاجة إلى إنشاء حاوية لها.
- قم بتوصيل جلسة VNC إلى حجرة تقوم بتشغيل سطح مكتب افتراضي (انظر XVFB).
بضع كلمات حول الأدوات اللازمة
— أداة مفتوحة المصدر متوفرة في معظم مستودعات الحزم. 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:~$()
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:~$()
في المثال أعلاه، يطلب 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()

مخطط تفاعل المنفعة
في الاتجاه المعاكس: استمع في الحجرة واتصل بالمضيف
nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 catيسمح هذا الأمر للكبسولة بالوصول إلى المنفذ 8000 على الجهاز المحلي.
نص باش
لقد كتبت نصًا خاصًا لـ Bash يسمح لك بإدارة مجموعة إنتاج Kubernetes باستخدام الطريقة الموضحة أعلاه:
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.
озможности безграничны!
PS من المترجم
اقرأ أيضًا على مدونتنا:
- «"؛
- «"؛
- «"؛
- «".
المصدر: www.habr.com
