Ինչպես բացել թունել Kubernetes pod կամ կոնտեյներով tcpserver-ով և netcat-ով

Նշում. թարգմ.LayerCI-ի ստեղծողի այս գործնական գրառումը հիանալի պատկերացում է այսպես կոչված խորհուրդների և հնարքների Kubernetes-ի համար (և ավելին): Այստեղ առաջարկվող լուծումը միայն քչերից մեկն է և, գուցե, ոչ ամենաակնհայտը (որոշ դեպքերում մեկնաբանություններում արդեն նշված K8-ի «հայրենի» տարբերակը կարող է հարմար լինել. kubectl port-forward). Այնուամենայնիվ, դա թույլ է տալիս գոնե խնդրին նայել դասական կոմունալ ծառայություններից օգտվելու և դրանք հետագայում համատեղելու տեսանկյունից՝ միևնույն ժամանակ պարզ, ճկուն և հզոր (ներշնչանքի համար տե՛ս «այլ գաղափարներ» վերջում):

Ինչպես բացել թունել Kubernetes pod կամ կոնտեյներով tcpserver-ով և netcat-ով

Պատկերացրեք սովորական իրավիճակ. դուք ցանկանում եք մի նավահանգիստ ձեր տեղական մեքենայի վրա, որը կախարդական կերպով տեղափոխում է երթևեկությունը դեպի պատիճ/կոնտեյներ (կամ հակառակը):

Հնարավոր օգտագործման դեպքեր

  1. Ստուգեք, թե ինչ է վերադարձնում HTTP-ի վերջնակետը /healthz պատիճ արտադրական կլաստերում:
  2. Միացրեք TCP կարգաբերիչը տեղական մեքենայի պատին:
  3. Մուտք գործեք արտադրության տվյալների բազա տեղական տվյալների բազայի գործիքներից՝ առանց իսկականացման հետ անհանգստանալու (սովորաբար localhost-ն ունի արմատային իրավունքներ):
  4. Գործարկեք միանգամյա միգրացիոն սկրիպտը տվյալների համար բեմադրման կլաստերի համար՝ առանց դրա համար կոնտեյներ ստեղծելու:
  5. Միացրեք VNC նիստը վիրտուալ աշխատասեղանով աշխատող պատի հետ (տես XVFB):

Մի քանի խոսք անհրաժեշտ գործիքների մասին

Tcpserver — Բաց կոդով օգտակար ծրագիր, որը հասանելի է 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 pod կամ կոնտեյներով tcpserver-ով և netcat-ով
Կոմունալ փոխազդեցության դիագրամ

Հակառակ ուղղությամբ՝ լսեք պատիճում և միացեք հաղորդավարին

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.

  • Ներս թունելի համար դոկեր Դուք կարող եք փոխարինել հիմնական գիծը հետևյալով.
    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.

Հնարավորությունները անսահման են:

PS թարգմանչից

Կարդացեք նաև մեր բլոգում.

Source: www.habr.com

Добавить комментарий