• Русский
  • Подключение к внешнему PostgreSQL завершается ошибкой SSL is not enabled on the server

    Описание проблемы

    Когда экземпляр SonarQube настроен на использование внешней базы данных PostgreSQL, Pod SonarQube не запускается, а в его журналах появляется сообщение, похожее на:

    org.postgresql.util.PSQLException: The server does not support SSL.

    или

    FATAL: no pg_hba.conf entry for host "...", user "...", database "...", SSL on

    Интерфейс SonarQube UI так и не становится доступным, потому что веб-процесс завершается во время инициализации базы данных.

    Корневая причина

    JDBC-драйвер PostgreSQL по умолчанию пытается согласовать SSL при каждом новом подключении. Если в целевом PostgreSQL SSL отключён (или он не настроен на принятие TLS-handshake от этого клиента), драйвер аварийно завершает работу с сообщением The server does not support SSL, и Pod SonarQube не может завершить запуск.

    Исправление заключается в том, чтобы указать JDBC-драйверу не пытаться использовать SSL, установив sslmode=disable в JDBC URL.

    Устранение неполадок

    Проверьте журналы Pod SonarQube:

    kubectl -n <NAMESPACE> logs <RELEASE>-sonarqube-xxxxx

    Если в журнале указано The server does not support SSL или SSL is not enabled on the server, эта проблема относится к вашему случаю.

    Вы можете отдельно проверить, принимает ли целевой PostgreSQL SSL, с помощью psql с любого узла, который может к нему подключиться:

    PGSSLMODE=require psql "host=<PG_HOST> port=<PG_PORT> user=<PG_USER> dbname=<PG_DATABASE>"

    Если эта команда завершается с ошибкой, связанной с SSL, сервер не поддерживает SSL в этом соединении, и приведённое ниже обходное решение применимо.

    Решение

    Добавьте sslmode=disable как параметр запроса в JDBC URL, указанный в CR SonarQube. Остальные JDBC-параметры (socketTimeout и т. д.) сохраняются; sslmode добавляется через &:

    apiVersion: operator.alaudadevops.io/v1alpha1
    kind: Sonarqube
    metadata:
      name: <RELEASE>
      namespace: <NAMESPACE>
    spec:
      helmValues:
        jdbcOverwrite:
          enable: true
          jdbcSecretName: <PG_SECRET_NAME>
          jdbcUrl: jdbc:postgresql://<PG_HOST>:<PG_PORT>/<PG_DATABASE>?socketTimeout=1500&sslmode=disable
          jdbcUsername: <PG_USER>

    Указанный secret должен содержать только пароль — см. Настройка PostgreSQL и учетных данных доступа к аккаунту для эталонной схемы secret. Соответствующий ключ — jdbc-password:

    kubectl -n <NAMESPACE> create secret generic <PG_SECRET_NAME> \
      --from-literal=jdbc-password=<PG_PASSWORD>

    Примените изменение к CR. Operator выполнит reconcile нового jdbcUrl в ConfigMap SonarQube; пересоздайте Pod SonarQube, чтобы JDBC-подключение было установлено заново с новым режимом:

    kubectl -n <NAMESPACE> rollout restart deployment <RELEASE>-sonarqube

    Примечания

    • Отключение SSL уместно, когда SonarQube и PostgreSQL обмениваются данными через доверенную частную сеть. Для развёртываний, в которых трафик базы данных проходит через недоверенную границу, настройте SSL на стороне PostgreSQL и не указывайте sslmode в URL (в этом случае значение драйвера по умолчанию prefer будет успешно применено).
    • Поддерживаемые значения sslmode соответствуют стандартной конвенции libpq (disable, allow, prefer, require, verify-ca, verify-full). Выберите значение, которое соответствует фактической TLS-конфигурации базы данных.