Рубрики
Без рубрики

Отладка приложения Python работает на Kubernetes с Pycharm (с точками останова и всем Shebang)

Одним из болей за управление контейнерным приложением на Кубернанах является неспособность отладить его … Теги с Куберовщиками, Python, Pycharm, Intellij.

Одним из болей за управлением контейнерным применением на Кубернанах является неспособность отлаживать его нормальной IDE. С Python есть хорошие решения для дистанционного отладки, такие как Удаленный PDB Но это никогда не будет так удобно, как отладка вашего приложения с реальным IDE.

Проблема

Хотя Intellij провел удивительную работу с Руководство и поддержка Для удаленной отладки их решения несовместимы с удаленным временем выполнения, что незнакома с средой разработки, Или в более простых условиях – для удаленной отладки на работу, время выполнения (Python Process) должен иметь доступ к сети к IDE (вашу рабочую станцию).

Под капотом Pycharm использует отладчик на основе Pydevd – который поддерживает только подключение от времени выполнения в качестве клиента и не прослушивает входящие соединения внутри времени выполнения в качестве сервера.

Наивное решение этой проблемы можно соединить SSHD SIDECAR с вашим развертыванием и запуском клиентского туннеля с обратным SSH. Это, вероятно, будет работать – но для того, чтобы сделать его прозрачным, нужно будет вводить Sidecar с открытым ключом, а затем запустить SSH-клиент и держать туннель открытым … кажется, что много работы.

Еще одна альтернатива использует Telepresence На самом деле запустить службу локально, но это будет означать, что нужно будет построить/устанавливать зависимости локально – которые иногда значат много времени и работают, и даже не упомянув CPU и память, что наше приложение будет потреблять.

Ktunnel до спасения

Ktunnel Является ли CLI, который устанавливает обратный туннель от Kubernetes и обнажает вашу рабочую станцию к трафику из Kubernetes, это означает, что можно разоблачить свою рабочую станцию на Cubernetes POD, или даже как сервис. Для нашего использования в случае – это означает, что можно сказать на нашем приложении Python для подключения к Localhost на порт отладки, Когда на самом деле за кулисами будет установлен туннель для IDE, который слушает этот порт на моей рабочей станции. Довольно аккуратно!

Начиная

В качестве примера я создал простой веб-сервер Flask с двумя конечными точками:

  • / – вернет случайное число
  • /debug – будет работать

Когда /отлаживать Конечная точка вызывается, время выполнения должно попытаться подключиться к отладчике и блоку, пока он не будет успешным.

Кодекс вместе с манифестами Kubernetes можно найти здесь

Шаг 1 – Разверните приложение к Kubernetes

> kubectl apply -f deployment.yaml
deployment.extensions/pyremotedebug created

Давайте также портируемся до веб-сервера и отправить запрос:

 > kubectl port-forward pyremotedebug-5dcf9cf4c6-q9tr9 8000
 Forwarding from [::1]:8000 -> 8000

 > curl localhost:8000
Handling connection for 8000
Hello, Ktunnel! random number: 409

Шаг 2 – Откройте проект на Pycharm и настройте удаленный отладчик

  • Откройте Pycharm, откройте проект ( File-> Open -> «Справочник проекта» ).
  • Положите точки останова в main.py файл
  • Настройте удаленный отладчик в соответствии с эти инструкции. Используйте локальное имя хоста «localhost» и порт 4321. Важная заметка! Используйте «Путь сопоставления», чтобы сопоставить свой локальный каталог проекта на исходный рабочий режим в контейнерном изображении
  • Начните отладчик ( Run-> Debug Remote_server )

Шаг 3 – Установите туннель

> ./ktunnel inject deployment pyremotedebug 4321
INFO[0000] Debug level is set to info
INFO[0000] Injecting tunnel sidecar to default/pyremotedebug
INFO[0000] Waiting for deployment to be ready
INFO[0011] All pods located for port-forwarding
INFO[0011] Waiting for port forward to finish
INFO[0011] Forwarding from 127.0.0.1:28688 -> 28688
Forwarding from [::1]:28688 -> 28688
INFO[0011] starting tcp tunnel from source 4321 to target 4321

Шаг 4 – Позвоните в конечную точку отладки

> curl localhost:8000/debug

Глядя на журнал контейнера, вы увидите следующую строку: Информация: root: Подключение к удаленному отладчику на 127.0.0.1:4321 Это означает, что отладчик теперь подключен к выполнению времени

Шаг 5 – разум

Теперь отправка запроса на конечную точку root проверит точку останова в IDE:

> curl -v localhost:8000/

Мы можем изменить значение R в Оценить выражение Окно к -1, а результат в нашем терминале:

> curl -v localhost:8000/
*   Trying 127.0.0.1...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 8000 (#0)
> GET / HTTP/1.1
> Host: localhost:8000
> User-Agent: curl/7.54.0
> Accept: */*
>
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Content-Type: text/html; charset=utf-8
< Content-Length: 33
< Server: Werkzeug/0.16.0 Python/3.7.6
< Date: Wed, 25 Dec 2019 06:15:53 GMT
<
* Closing connection 0
Hello, Ktunnel! random number: -1

Важные предостережения

  • Для этого работать с вашей установкой Pycharm, контейнер должен иметь совместимую версию «Pydevd-Pycharm», в моем случае это pydevd-pycharm ~ = 191.7141.48
  • Если вы планируете выполнить это на производственных услугах, знайте, что настройки точек останова на производственных услугах не рекомендуется, делайте на свой страх и риск!

Оригинал: “https://dev.to/omrikiei/debugging-a-python-application-running-on-kubernetes-with-pycharm-with-breakpoints-and-the-whole-shebang-1h3c”