2017-05-17 66 views
0

我試圖將作爲Docker容器在我們的Kubernetes集羣(託管在Google Container Engine上)運行的服務器代碼連接到Google Cloud SQL託管的MySQL 5.7實例。我遇到的問題是每個連接都被數據庫服務器以Access denied for user 'USER'@'IP' (using password: YES)拒絕。數據庫證書(用戶名,密碼,數據庫名稱和SSL證書)在通過其他MySQL客戶端連接或與本地實例上的容器相同的應用程序進行連接時都是正確的。集裝箱式服務器應用程序無法連接到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); 

附加信息:服務器應用程序使用mysql2庫建於節點連接到數據庫。沒有特定的防火牆規則可以引發網絡問題,這一點由庫連接但未通過身份驗證確認。

+0

如果您確定防火牆和端口已在您的安全組中啓用,那麼代碼中存在問題可能在參數中。如果您分享你的連接代碼 – Adiii

+0

@Adiii我已經添加了上面的連接代碼以防萬一它有幫助 – moberemk

回答

1

設置Cloud SQL Proxy後,我設法弄清楚實際的錯誤是什麼:在祕密和pod配置之間的某處,一個額外的換行符被添加到數據庫名稱中,導致任何連接嘗試失敗。隨着代理的設置,這一點變得清晰了,因爲顯示了一個實際的錯誤信息。

(值得注意的是,所有記錄我用來驗證憑證是否準確的憑證的日誌都沒有明確顯示換行符,並且被控制檯顯示添加換行符以包裝顯示的事實僞裝,以及它恰好與數據庫名稱的結尾一致)

0

您是否閱讀過關於https://cloud.google.com/sql/docs/mysql/connect-container-engine的文檔?

在Container Engine中,您需要在應用程序窗口旁邊設置Cloud SQL Proxy容器並與之通話。雲SQL代理然後將實際調用Cloud SQL服務。

如果容器在本地工作,我假設你在開發機器上設置了Application Default Credentials。它可能會失敗,因爲這些憑據不在您的容器上作爲服務帳戶文件。嘗試配置服務帳戶文件,或使用--scopes參數創建您的GKE羣集,以便您的實例訪問Cloud SQL。

+0

我已經閱讀過文檔yes;但我相當確信代理服務器不是必需的,因爲我可以毫無問題地連接到服務器;在認證步驟之前連接不會失敗。此外,我已經設置了服務器並與具有相同安全設置的另一個雲SQL實例進行通信(只允許從0.0.0.0/0開始使用SSL) – moberemk

+0

好吧,這並沒有真正解決問題,但設置CloudSQL代理後,我發現實際的問題,因爲它提供了更有用的錯誤消息。 – moberemk

相關問題