Не удалось подключить PostgreSQL в Kubernetes

# #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 помочь перезапустить.