تقريبا. العابرة. : هذه المذكرة العملية من خالق LayerCI هي مثال رائع على ما يسمى بالنصائح والحيل لـ Kubernetes (وليس فقط). الحل المقترح هنا هو واحد فقط من الحلول القليلة ، وربما ليس الأكثر وضوحًا (في بعض الحالات ، قد يكون " kubectl port-forward
" الأصلي إلى K8s المذكورة في التعليقات مناسبًا). ومع ذلك ، فإنه يتيح لك على الأقل النظر إلى المشكلة من منظور استخدام الأدوات الكلاسيكية ومزيجها الإضافي - البسيط والمرن والقوي (انظر "أفكار أخرى" في النهاية للإلهام).
تخيل موقفًا نموذجيًا: تريد من المنفذ الموجود على الكمبيوتر المحلي إعادة توجيه حركة المرور بطريقة سحرية إلى pod / الحاوية (أو العكس).
حالات الاستخدام الممكنة
- تحقق من أن
/healthz
HTTP endpoint /healthz
في كتلة الإنتاج. - قم بتوصيل مصحح TCP إلى pod على الجهاز المحلي.
- يمكنك الوصول إلى قاعدة بيانات الإنتاج من الأدوات المحلية للعمل مع قاعدة البيانات دون الاضطرار إلى المصادقة (عادة ما يكون لدى المضيف المحلي امتيازات الجذر).
- قم بتشغيل برنامج نصي ترحيل لمرة واحدة للبيانات الموجودة في نظام المجموعة المرحلي دون الحاجة إلى إنشاء حاوية له.
- قم بتوصيل جلسة 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
( 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
.
أفكار أخرى
- يمكنك إعادة توجيه حركة مرور 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 من المترجم
اقرأ أيضًا في مدونتنا: