# #postgresql #go #kubernetes #linkerd
Вопрос:
Я использую Kubernetes. У меня есть два стручка.
В одном модуле работает сервер. Вот часть кодов, пытающихся подключить службу PostgreSQL в другом модуле.
import (
"context"
"github.com/jackc/pgx/v4/pgxpool"
"github.com/rs/zerolog/log"
)
databaseURL := "postgres://admin:passw0rd@my-database-service.hm:40072/my_db"
pg, err := pgxpool.Connect(context.Background(), databaseURL)
if err != nil {
log.Error().Err(err).Msg("conn.Close")
return nil
}
В настоящее время приведенный выше код выдает ошибку
{«уровень»:»ошибка»,»ошибка»:»не удалось подключиться к
host=my-database-service.hm user=admin database=my_db
: ошибка набора номера (наберите tcp 10.43.140.140:40072: подключение: отказано в подключении)»,»время»:1627849943,»сообщение»:»соединение.Закрыть»}
Однако после того, как я подключусь по ssh к модулю сервера, я смогу успешно подключить модуль PostgreSQL psql
.
/usr/src/app # psql --host=my-database-service.hm --port=40072 --dbname=my_db --username=admin --password
Password:
psql (13.3)
Type "help" for help.
my_db=#
Я попытался перезапустить свой серверный модуль, чтобы убедиться, что он запустится после того, как база данных PostgreSQL будет готова, и все равно получил ту же ошибку.
Любые предложения по дальнейшей отладке были бы полезны. Спасибо!
Обновить
На самом деле я использую Linkerd. Может быть связано с
https://linkerd.io/2.10/features/protocol-detection/
Я попытался изменить PostgreSQL на порт по умолчанию 5432, но все равно возникли проблемы. Обновится, если найдет решение.
Ответ №1:
После некоторых экспериментов я могу подтвердить, что моя проблема не связана с Linkerd.
Я думаю, что мой контейнерный/целевой порт PostgreSQL по-прежнему использует 5432 по умолчанию. И он отображается ClusterIP внутри сети через порт 40072, поэтому мне не нужно отмечать порт как непрозрачный в Linkerd.
Оказывается, что после добавления os.Exit(1)
,
pg, err := pgxpool.Connect(context.Background(), databaseURL)
if err != nil {
log.Error().Err(err).Msg("conn.Close")
os.Exit(1) // <- this helps
}
мой Kubernetes поможет перезапустить серверный модуль, когда он изначально не сможет дождаться готовности PostgreSQL.
После нескольких перезапусков серверный модуль теперь может хорошо подключаться к PostgreSQL.
Я думаю, что если я вручную перезапущусь больше раз раньше, это тоже может помочь. Но определенно не такой надежный, как этот способ, позволяющий Kubernetes помочь перезапустить.