Tcpserver болон netcat ашиглан Kubernetes pod эсвэл контейнерт хонгилыг хэрхэн нээх вэ

Анхаарна уу. орчуулга.: LayerCI-г бүтээгчийн энэхүү практик тэмдэглэл нь Kubernetes (болон бусад)-д зориулсан зөвлөмж, арга заль гэж нэрлэгддэг маш сайн дүрслэл юм. Энд санал болгож буй шийдэл нь цөөхөн хэдэн шийдлийн зөвхөн нэг бөгөөд магадгүй хамгийн тод биш юм (зарим тохиолдолд тайлбар дээр дурдсан K8-ийн "уугуул" шийдэл нь тохиромжтой байж магадгүй юм. kubectl port-forward). Гэсэн хэдий ч энэ нь наад зах нь асуудлыг сонгодог хэрэгслүүдийг ашиглах, тэдгээрийг нэгтгэх өнцгөөс харах боломжийг олгодог - нэгэн зэрэг энгийн, уян хатан, хүчирхэг (урам зориг авахын тулд төгсгөлд байгаа "бусад санаануудыг" үзнэ үү).

Tcpserver болон netcat ашиглан Kubernetes pod эсвэл контейнерт хонгилыг хэрхэн нээх вэ

Ердийн нөхцөл байдлыг төсөөлөөд үз дээ: та локал машин дээрх порт нь траффикийг под/контейнер рүү (эсвэл эсрэгээр) шилжүүлэхийг хүсч байна.

Хэрэглэх боломжит тохиолдлууд

  1. HTTP төгсгөлийн цэг юу буцаадаг болохыг шалгана уу /healthz үйлдвэрлэлийн кластер дахь pod .
  2. TCP дибаглагчийг локал машин дээрх подволд холбоно уу.
  3. Баталгаажуулалт хийх шаардлагагүй (ихэвчлэн localhost root эрхтэй) локал мэдээллийн сангаас үйлдвэрлэлийн мэдээллийн санд хандах боломжтой.
  4. Үе шатлалын кластерт өгөгдөлд зориулж контейнер үүсгэхгүйгээр нэг удаагийн шилжих скриптийг ажиллуул.
  5. VNC сессийг виртуал ширээний компьютер дээр ажиллуулж байгаа pod руу холбоно уу (XVFB-г үзнэ үү).

Шаардлагатай хэрэгслүүдийн талаар хэдэн үг хэлье

Tcpserver — Нээлттэй эхийн хэрэглүүрийг ихэнх Линукс багцын агуулахад ашиглах боломжтой. Энэ нь танд локал портыг нээж, 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 эсрэгээр нь хийдэг. Энэ нь танд нээлттэй порт руу холбогдож, түүнээс хүлээн авсан оролт гаралтыг 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

Үүнтэй адилтгаж үзвэл, pod доторх 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)

Tcpserver болон netcat ашиглан Kubernetes pod эсвэл контейнерт хонгилыг хэрхэн нээх вэ
Хэрэглээний харилцан үйлчлэлийн диаграм

Эсрэг чиглэлд: pod-д сонсож, хосттой холбогдоно уу

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

Энэ команд нь локал машин дээрх 8000 порт руу нэвтрэх боломжийг олгодог.

Bash скрипт

Би 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 мөн хоёр тусдаа командыг ажиллуул kubectl.

Боломжууд хязгааргүй юм!

Орчуулагчийн жич

Мөн манай блог дээрээс уншина уу:

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх