Одним из болей за управлением контейнерным применением на Кубернанах является неспособность отлаживать его нормальной 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”