Контейнерное серверное приложение не может подключиться к базам данных MySQL
Я пытаюсь подключить свой серверный код, работающий в качестве контейнера Docker в нашем кластере Kubernetes (размещенный на Google Container Engine), с экземпляром MySQL 5.7, управляемым Google Cloud SQL. Проблема, с которой я сталкиваюсь, заключается в том, что каждое соединение отклоняется сервером базы данных с Access denied for user 'USER'@'IP' (using password: YES)
, Учетные данные базы данных (имя пользователя, пароль, имя базы данных и сертификаты SSL) являются правильными и работают при подключении через другие клиенты MySQL или то же приложение, работающее в качестве контейнера на локальном экземпляре.
Я проверил, что все учетные данные одинаковы в локальной и серверной версиях приложения и что пользователь, с которым я соединяюсь, имеет подстановочный знак %
хост указан. Не совсем уверен, что проверить здесь, если честно...
Отредактированная версия кода подключения приведена ниже:
let connectionCreds = {
host: Config.SQL.HOST,
user: Config.SQL.USER,
password: Config.SQL.PASSWORD,
database: Config.SQL.DATABASE,
charset: 'utf8mb4',
};
if (Config.SQL.SSL_ENABLE) {
connectionCreds['ssl'] = {
key: fs.readFileSync(Config.SQL.SSL_CLIENT_KEY_PATH),
cert: fs.readFileSync(Config.SQL.SSL_CLIENT_CERT_PATH),
ca: fs.readFileSync(Config.SQL.SSL_SERVER_CA_PATH)
}
}
this.connection = MySQL.createConnection(connectionCreds);
Дополнительная информация: серверное приложение встроено в Node с использованием библиотеки mysql2 для подключения к базе данных. Не существует специальных правил брандмауэра, которые вызывают проблемы с сетью, и это подтверждается тем фактом, что библиотека подключается, но не проходит аутентификацию.
2 ответа
После настройки Cloud SQL Proxy мне удалось выяснить, в чем именно заключалась ошибка: где-то между секретом и конфигурацией модуля добавлялся дополнительный символ новой строки в имя базы данных, что приводило к неудачной попытке любого подключения. С настройкой прокси это стало ясно, потому что было отображено фактическое сообщение об ошибке.
(в частности, все мои записи в журнале вокруг учетных данных, которые я использовал для проверки точности учетных данных, не отображали явно новую строку и были замаскированы тем фактом, что на дисплее консоли были добавлены разрывы строк, чтобы обернуть экран, и оказалось, что строка точно, где закончилось имя базы данных)
Вы читали документацию по https://cloud.google.com/sql/docs/mysql/connect-container-engine?
В Container Engine вам нужно настроить контейнер Cloud SQL Proxy вместе с модулем приложения и поговорить с ним. Cloud SQL Proxy затем выполнит фактический вызов службы Cloud SQL.
Если контейнер работал локально, я предполагаю, что на вашем компьютере разработки установлены учетные данные приложения по умолчанию. Это может произойти сбой, потому что эти учетные данные не находятся в вашем контейнере как файл учетной записи службы. Попробуйте настроить файл служебной учетной записи или создать кластер GKE с --scopes
аргумент, который дает вашим экземплярам доступ к облачному SQL.