วิธีเปิดอุโมงค์ในพ็อด Kubernetes หรือคอนเทนเนอร์ด้วย tcpserver และ netcat

บันทึก. แปล: บันทึกที่เป็นประโยชน์นี้จากผู้สร้าง LayerCI เป็นตัวอย่างที่ยอดเยี่ยมของสิ่งที่เรียกว่าเคล็ดลับและคำแนะนำสำหรับ Kubernetes (และอื่นๆ อีกมากมาย) วิธีแก้ปัญหาที่เสนอที่นี่เป็นเพียงหนึ่งในไม่กี่อย่างและอาจจะไม่ชัดเจนที่สุด (ในบางกรณี "เนทีฟ" สำหรับ K8 ที่กล่าวถึงแล้วในความคิดเห็นอาจเหมาะสม kubectl port-forward). อย่างไรก็ตามอย่างน้อยจะช่วยให้คุณมองปัญหาจากมุมมองของการใช้ยูทิลิตี้แบบคลาสสิกและรวมเข้าด้วยกันเพิ่มเติม - ในเวลาเดียวกันก็เรียบง่าย ยืดหยุ่น และทรงพลัง (ดู "แนวคิดอื่น" ในตอนท้ายเพื่อดูแรงบันดาลใจ)

วิธีเปิดอุโมงค์ในพ็อด Kubernetes หรือคอนเทนเนอร์ด้วย tcpserver และ netcat

ลองนึกภาพสถานการณ์ทั่วไป: คุณต้องการให้พอร์ตบนเครื่องของคุณส่งต่อการรับส่งข้อมูลไปยังพ็อด/คอนเทนเนอร์อย่างน่าอัศจรรย์ (หรือกลับกัน)

กรณีการใช้งานที่เป็นไปได้

  1. ตรวจสอบว่าปลายทาง HTTP ส่งคืนอะไร /healthz พ็อดในคลัสเตอร์การผลิต
  2. เชื่อมต่อดีบักเกอร์ TCP กับพ็อดบนเครื่องท้องถิ่น
  3. เข้าถึงฐานข้อมูลที่ใช้งานจริงจากเครื่องมือฐานข้อมูลท้องถิ่นโดยไม่ต้องยุ่งยากกับการตรวจสอบสิทธิ์ (โดยปกติแล้ว localhost จะมีสิทธิ์รูท)
  4. เรียกใช้สคริปต์การย้ายข้อมูลแบบครั้งเดียวสำหรับข้อมูลในคลัสเตอร์ชั่วคราวโดยไม่ต้องสร้างคอนเทนเนอร์ให้
  5. เชื่อมต่อเซสชัน VNC กับพ็อดที่ใช้เดสก์ท็อปเสมือน (ดู XVFB)

คำไม่กี่คำเกี่ยวกับเครื่องมือที่จำเป็น

ทีซีเซิร์ฟเวอร์ — ยูทิลิตี้ Open Source มีอยู่ในที่เก็บแพ็คเกจ 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:~$

(asciinema.org)

Netcat ทำสิ่งที่ตรงกันข้าม ช่วยให้คุณสามารถเชื่อมต่อกับพอร์ตที่เปิดอยู่และส่ง 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)

ในตัวอย่างข้างต้น 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

คำสั่งนี้อนุญาตให้พ็อดเข้าถึงพอร์ต 8000 บนเครื่องท้องถิ่น

สคริปต์ทุบตี

ฉันเขียนสคริปต์พิเศษสำหรับ Bash ที่ให้คุณจัดการคลัสเตอร์การผลิต Kubernetes เลเยอร์CIโดยใช้วิธีการที่อธิบายไว้ข้างต้น:

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"
  • เพื่อเข้าอุโมงค์ K3 - เปลี่ยนเป็น:
    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 และรันสองคำสั่งแยกกัน kubectl.

ความเป็นไปได้ไม่มีที่สิ้นสุด!

ปล.จากผู้แปล

อ่านเพิ่มเติมในบล็อกของเรา:

ที่มา: will.com

เพิ่มความคิดเห็น