टीसीपीसर्वर और नेटकैट के साथ कुबेरनेट्स पॉड या कंटेनर में सुरंग कैसे खोलें

टिप्पणी। अनुवाद।: लेयरसीआई के निर्माता का यह व्यावहारिक नोट कुबेरनेट्स (और न केवल) के लिए तथाकथित युक्तियों और युक्तियों का एक उत्कृष्ट उदाहरण है। यहां प्रस्तावित समाधान केवल कुछ में से एक है और, शायद, सबसे स्पष्ट नहीं है (कुछ मामलों के लिए, टिप्पणियों में पहले से ही उल्लिखित K8s के लिए "मूल" समाधान उपयुक्त हो सकता है kubectl port-forward). हालाँकि, यह आपको कम से कम शास्त्रीय उपयोगिताओं का उपयोग करने और उन्हें आगे संयोजित करने के परिप्रेक्ष्य से समस्या को देखने की अनुमति देता है - साथ ही सरल, लचीला और शक्तिशाली (प्रेरणा के लिए अंत में "अन्य विचार" देखें)।

टीसीपीसर्वर और नेटकैट के साथ कुबेरनेट्स पॉड या कंटेनर में सुरंग कैसे खोलें

एक सामान्य स्थिति की कल्पना करें: आप अपनी स्थानीय मशीन पर जादुई तरीके से ट्रैफिक को पॉड/कंटेनर (या इसके विपरीत) पर अग्रेषित करने के लिए एक पोर्ट चाहते हैं।

संभावित उपयोग के मामले

  1. जांचें कि HTTP समापन बिंदु क्या लौटाता है /healthz उत्पादन क्लस्टर में पॉड।
  2. एक टीसीपी डिबगर को स्थानीय मशीन पर पॉड से कनेक्ट करें।
  3. प्रमाणीकरण से परेशान हुए बिना स्थानीय डेटाबेस टूल से उत्पादन डेटाबेस तक पहुंच प्राप्त करें (आमतौर पर लोकलहोस्ट के पास रूट अधिकार होते हैं)।
  4. स्टेजिंग क्लस्टर में डेटा के लिए कंटेनर बनाए बिना उसके लिए एक बार की माइग्रेशन स्क्रिप्ट चलाएँ।
  5. VNC सत्र को वर्चुअल डेस्कटॉप चलाने वाले पॉड से कनेक्ट करें (XVFB देखें)।

आवश्यक उपकरणों के बारे में कुछ शब्द

टीसीपीसर्वर - अधिकांश लिनक्स पैकेज रिपॉजिटरी में उपलब्ध एक ओपन सोर्स उपयोगिता। यह आपको एक स्थानीय पोर्ट खोलने और किसी भी निर्दिष्ट कमांड से 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)

नेटकैट इसके विपरीत कार्य करता है। यह आपको एक खुले पोर्ट से कनेक्ट करने और उससे प्राप्त 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)

उपरोक्त उदाहरण में, नेटकैट HTTP पर पेज का अनुरोध करता है। झंडा -C इसके कारण पंक्ति के अंत में सीआरएलएफ जुड़ जाता है।

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 तक पहुंचने की अनुमति देता है।

बैश स्क्रिप्ट

मैंने बैश के लिए एक विशेष स्क्रिप्ट लिखी है जो आपको कुबेरनेट्स उत्पादन क्लस्टर को प्रबंधित करने की अनुमति देती है लेयरसीआईऊपर वर्णित विधि का उपयोग करना:

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 …
  • आदि

अधिक विचार

  • आप कमांड का उपयोग करके यूडीपी ट्रैफ़िक को पुनर्निर्देशित कर सकते हैं 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 और दो अलग-अलग कमांड चलाएँ kubectl.

संभावनाएं अनंत हैं!

अनुवादक से पी.एस

हमारे ब्लॉग पर भी पढ़ें:

स्रोत: www.habr.com

एक टिप्पणी जोड़ें