суббота, 21 июля 2018 г.

Смотрим на Postgres в Kubernetes

В нашей компании мы используем Kubernetes в качестве системы оркестрации докеров. Судя по ИТ конференциям, которые я посещал в последнее время, K8s (так его называют коротко) стал фактически промышленным стандартом, поэтому думаю, что мой сегодняшний опыт будет интересным.
Собственно, K8s используют для запуска большого количества маленьких сервисов. В нашей команде их уже накопилось достаточно много. Зачастую сервисам необходимы базы данных. В случае, когда необходима реалиционная БД, мы используем Postgres. Иногда для анализа дефектов логов недостаточно, и хочется подключится к базе напрямую и посмотреть, что там происходит. К тому же такая возможность пригодилась бы и для других наших проектов.
Высунуть порт базы из K8s само по себе не сложно, но возникают проблемы с сетевым доступом, а в нашей финансовой компании с этим жестко. Дополнительно сразу возникает вопрос о том, что внешний балансировщик один, а высунуть захочется много БД, тогда придется вести учет - какой базе какой порт принадлежит. Так как в микросервисной архитектуре базы постоянно создаются и пропадают, это точно станет головной болью. Поэтому возникла идея запустить внутри кластера web-клиент. Ничего высовывать не придется. Все, кому это понадобится, смогут подключаться к внутренним базам без заморочек с доступом.
Так как у нас K8s, значит нужно найти что-то упакованное в Docker. Гугление первой строчкой выдало https://hub.docker.com/r/moritanosuke/docker-pgweb/, но он у меня с ходу не завёлся. Плюс насторожило, что проект совсем не развивается. Последнее изменение было сделано 2 года назад. Второй строчкой оказался https://hub.docker.com/r/fenglc/pgadmin4/. Его-то я и заиспользовал. Локально докер завелся сразу. Порадовал довольно продвинутый UI
dashboard
Быстренько накидал Helm-чарт и закинул его в K8s. Тут получилось не так гладко. Сервис сходу не стартанул и стал валиться с ошибкой

pgAdmin4 init process done. Ready for start up.
Traceback (most recent call last):
File "pgAdmin4.py", line 95, in
server_port = int(port)
ValueError: invalid literal for int() with base 10: 'tcp://10.103.24.187:5050'

Оказалось, что проблема известная: https://github.com/fenglc/dockercloud-pgadmin4/issues/17 - 
и решается добавлением переменной окружения PGADMIN_PORT. В Helm-чарте это получилось так:

- name: PGADMIN_PORT
value: "5050"

Странно, конечно, почему эта проблема не вылезла при локальном старте докера, но разбираться было уже лень.
Так как сервис необходим только для работы на тестовом стенде, то заморачиваться с выделением отдельного DNS-имени и настройкой Ingress-ов не хотелось, поэтому решил высунуть сервис, через уже запущенный Zuul. Но не тут то было. Оказалось, что данный проект использует абсолютные пути. То есть высунуть его можно только в корень. Даже дефект на эту тему есть: https://github.com/fenglc/dockercloud-pgadmin4/issues/19.  Пришлось высовывать из корня zuul-а. Хорошо, что у нас корень еще свободен, но жить, конечно, так нельзя, придется просить отдельное имя.
В целом получилось хорошо. Теперь можно делать любой запрос к тестовым базам. Коллеги тоже довольны:)

Комментариев нет: