EDIT:
我现在认为问题在于我的Golang pod通过localhost与代理pod通信,如第二条错误消息所示。
我将服务帐户凭据JSON文件添加到Docker镜像的GOOGLE_APPLICATION_CREDENTIALS
环境变量中。完成此操作后,使用my-project:us-central1:my-instance
作为下面的connName
工作。
但是,当我尝试将容器中的DB_HOST
环境变量用作connName
时,我仍然会收到以下404错误。
ORIGINAL POST
我正在关注this guide从Kubernetes Engine上的pod连接到Google Cloud SQL。该pod正在运行两个容器:一个包含Cloud SQL代理映像,另一个包含Golang服务以执行实际的数据库查询。
当我的Golang服务尝试启动连接时,我收到以下错误:
确保为您的项目启用了Cloud SQL API (https://console.cloud.google.com/flows/enableapi?apiid=sqladmin)。 在createEphemeral期间出错 my-project:us-central1:my-instance:googleapi:错误403: 许可不足,许可不足
我已经看过这里和其他地方的几个主题,这是我到目前为止所做的:
Editor
角色添加到我正在使用的服务帐户中。Cloud SQL Client
角色。以下是我正在使用的Golang代码片段,摘自here:
cfg := mysql.Cfg(connName, dbUser, dbPassword)
cfg.DBName = dbName
db, err := mysql.DialCfg(cfg)
if err != nil {
log.Println(err)
return c.NoContent(http.StatusInternalServerError)
}
connName
与错误中显示的字符串相同:my-project:us-central1:my-instance
。我已尝试将其更改为127.0.0.1:3306
,但我在下面收到此错误:
确保该帐户有权访问“127.0.0.1:3306”(并确保 这个名字没有拼写错误。在createEphemeral期间出错 127.0.0.1:3306:googleapi:获取带有正文的HTTP响应代码404:未找到
此外,这是我用于部署pod的yaml文件的片段。
env:
- name: DB_HOST
value: 127.0.0.1:3306
- name: DB_USER
valueFrom:
secretKeyRef:
name: cloudsql-db-credentials
key: username
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: cloudsql-db-credentials
key: password
- name: cloudsql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.11
command: ["/cloud_sql_proxy",
"-instances=my-project:us-central1:my-instance=tcp:3306",
"-credential_file=/secrets/cloudsql/credentials.json"]
volumeMounts:
- name: cloudsql-instance-credentials
mountPath: /secrets/cloudsql
readOnly: true
volumes:
- name: cloudsql-instance-credentials
secret:
secretName: cloudsql-instance-credentials
我还验证了Cloud SQL代理启动没有问题:
2018/04/21 20:41:19 Listening on 127.0.0.1:3306 for my-project:us-central1:my-instance
2018/04/21 20:41:19 Ready for new connections
我不确定还有什么可以尝试的。任何帮助表示赞赏。
答案 0 :(得分:0)
您好在这里可以阅读[1]:"如果您的程序是用Go编写的,那么您可以将Cloud SQL Proxy用作库,从而无需启动代理作为协同进程。&#34 ;,所以你已经使用SQL代理作为代码,并且不需要将SQL代理用作POD。
如果你仍想使用SQL代理作为POD,你可以使用GO Companion Process,你可以在这里阅读[2]:" Companion Process":
import (
"github.com/go-sql-driver/mysql"
)
dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s",
dbUser,
dbPassword,
"127.0.0.1:3306",
dbName)
db, err := sql.Open("mysql", dsn)
[1] https://github.com/GoogleCloudPlatform/cloudsql-proxy#to-use-inside-a-go-program [2] https://cloud.google.com/sql/docs/mysql/connect-external-app#languages