这让我疯了,我已经尝试了3天了:我正在尝试将kubernetes部署连接到GCP中的Cloud SQL数据库。
以下是我迄今为止所做的:
- 设置云SQL代理以在我的部署中作为sidecar工作
- 创建了一个GKE服务帐户并将其附加到我的部署中
- 将GKE服务帐户绑定到我的GCP服务帐户
- 编辑到服务帐户(据我所知(是所有者权限
然而,我在GKE中运行部署时仍然得到:
the default Compute Engine service account is not configured with sufficient permissions to access the Cloud SQL API from this VM. Please create a new VM with Cloud SQL access (scope) enabled under "Identity and API access". Alternatively, create a new "service account key" and specify it using the -credential_file parameter
我该怎么解决这个问题?我找不到任何关于如何设置服务帐户以拥有云SQL的正确权限或如何调试此问题的文档。我能找到的每一个教程都以";绑定您的服务帐户";然后停止。没有任何内容描述需要什么权限,也没有任何关于如何从我的代码实际连接到DB的内容(我的代码将如何与代理通信?(。
请帮助
终于开始工作了!
关于这一点的主要文章(cloud.google.com/sql/docs/mysql/connect-kubernetes engine(掩盖了两个主要部分:
-
正确设置工作负载标识,我发现这些链接非常有用:a(https://cloud.google.com/kubernetes-engine/docs/how-to/workload-identityb(https://www.youtube.com/watch?v=l-nws1e4B8M
-
要连接到数据库,你必须让你的代码使用数据库主机127.0.0.1
对于任何正在寻找摘要的人:
您可以在此处找到快速启动:https://cloud.google.com/sql/docs/postgres/connect-instance-kubernetes
详细的文档请点击此处:https://cloud.google.com/sql/docs/postgres/connect-kubernetes-engine
基本上,如果你选择Cloud SQL Auth proxy
+Workload Identity
,当它出错时,你需要检查一些事情:
在GKE方面:代码示例
-
确保启用了
Workload Identity
(cluster
和node pool
( -
检查是否为应用程序创建了
Kubernetes Service Account
-
代表您的应用程序创建您自己的
IAM Service Account
。
gcloud iam服务帐户创建GSA_NAME--项目=GSA_project
- 确保您的
IAM service account
具有您需要的角色,这里是Cloud SQL Client IAM
角色
gcloud项目添加iam策略绑定PROJECT_ID
--member"serviceAccount:GSA_NAME@GSA_PROJECT.iam.gserviceaccount.com">
--角色"roles/cloudsql.client";
- 通过以下方式将
Kubernetes Service Account
绑定到IAM service account
(换句话说:允许Kubernetes Service Account
模拟IAM Service Account
(:
- 启用
Kubernetes Service Account
和IAM service account
之间的IAM绑定 - 向
Kubernetes Service Account
添加注释,以便Workload Identity知道要使用哪个IAM Service Account
-
请确保在deployment.yaml中为应用程序指定
Kubernetes Service Account
。在此处的spec.template.spec.serviceAccountName下。通过设置此项,您的部署代表模拟IAM Service Account
的Kubernetes Service Account
,因此此配置中的sidecarCloud SQL Auth proxy
具有Cloud SQL Client IAM
角色(来自IAM Service Account
(以建立到Cloud SQL
的连接 -
请检查
Cloud SQL Auth proxy
是否也在您的应用程序部署中。替换<INSTANCE_CONNECTION_NAME>由您的云SQL实例连接名称和<DB_PORT>转换为类似于:5432的数字。这个将在你的pod中运行一个sidecar和你的应用程序,这个sidecar将在localhost:5432上打开一个Cloud SQL Auth Proxy
(5432是您在上面指定的DB_PORT,Cloud SQL Auth Proxy
通过上面的Cloud SQL Client IAM
角色向Cloud SQL
进行身份验证(。因此,在应用程序中,数据库URL的配置属性应该是:jdbc:postgresql://localhost:5432
。
在应用程序端:
- 确保您的数据属性配置正确
url:jdbc:postgresql://localhost:5432
用户名:您的用户名
密码:您的密码
数据库:您的数据库