- PVSM.RU - https://www.pvsm.ru -
Прим. перев.: Эта практическая заметка от создателя LayerCI — отличный пример так называемых tips & tricks для Kubernetes. В ней рассказывается, как можно упростить некоторые привычные операции (по эксплуатации и отладке) благодаря использованию классических утилит. О том, какие именно операции, объясняет сам автор…
Представьте типичную ситуацию: вы хотите, чтобы порт на локальном компьютере волшебным образом перенаправлял трафик в pod/контейнер (или наоборот).
/healthz
pod'а в production-кластере.Tcpserver [1] — 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 [2])
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 [3])
В приведенном выше примере netcat запрашивает страницу по HTTP. Флаг -C
заставляет его добавлять CRLF в конец строки.
Если объединить представленные выше инструменты с kubectl, мы получим команду вроде этой:
tcpserver 127.0.0.1 8000 kubectl exec -i web-pod nc 127.0.0.1 8080
По аналогии, для доступа к порту 80 внутри pod'а достаточно будет сделать 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 [4])
Схема взаимодействия утилит
nc 127.0.0.1 8000 | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat
Эта команда позволяет pod'у получить доступ к порту 8000 на локальной машине.
Я написал специальный скрипт для Bash, позволяющий управлять production-кластером Kubernetes LayerCI [5], используя описанный выше метод:
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
, можно легко открывать туннель в pod командой kubetunnel web-pod 8080
и делать curl localhost:6666
.
tcpserver 127.0.0.1 6666 docker exec -i "$CONTAINER" nc 127.0.0.1 "$DESTPORT"
tcpserver 127.0.0.1 6666 k3s kubectl exec …
netcat -l -u -c
вместо tcpserver
и netcat -u
вместо netcat
соответственно.nc 127.0.0.1 8000 | pv --progress | kubectl exec -i web-pod tcpserver 127.0.0.1 8080 cat
.gzip
.kubeconfig
: cpserver ssh workcomputer "kubectl exec -i my-pod nc 127.0.0.1 80"
.mkfifo
и запустить две отдельные команды kubectl
.Возможности безграничны!
Читайте также в нашем блоге:
Автор: IlyaArens
Источник [10]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/bash/340374
Ссылки в тексте:
[1] Tcpserver: https://cr.yp.to/ucspi-tcp.html
[2] asciinema.org: https://asciinema.org/a/278469/
[3] asciinema.org: https://asciinema.org/a/278474/
[4] asciinema.org: https://asciinema.org/a/278477/
[5] LayerCI: https://layerci.com/
[6] Инструменты для разработчиков приложений, запускаемых в Kubernetes: https://habr.com/ru/company/flant/blog/462707/
[7] Kubernetes tips & tricks: о локальной разработке и Telepresence: https://habr.com/ru/company/flant/blog/446788/
[8] Плагин kubectl-debug для отладки в pod'ах Kubernetes: https://habr.com/ru/company/flant/blog/436112/
[9] Полезные утилиты при работе с Kubernetes: https://habr.com/ru/company/flant/blog/330198/
[10] Источник: https://habr.com/ru/post/479910/?utm_campaign=479910&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.