【问题标题】:GKE Using multiple clusters with one CloudSQL instanceGKE 对一个 CloudSQL 实例使用多个集群
【发布时间】:2018-12-11 20:42:38
【问题描述】:

我有一个使用 CloudSQL 进行了一年多的暂存集群,现在我想启动另一个 GKE 集群(同一个谷歌项目),指向同一个数据库进行测试。但是,尝试在新集群中使用旧集群中的 credentials.json 时,我看到了错误。

googleapi: Error 403: The client is not authorized to make this request., notAuthorized" 

我在 IAM 上四处寻找一种方法来打开新集群的权限,但即使我看到一个具有“Cloud SQL 客户端”角色的服务帐户,也没有找到方法。

共享凭据或打开权限的正确方法是什么(或者我需要为此创建一个新的服务帐户)?

我们的模板部署 yaml 看起来像:

  - name: postgres-proxy
    image: gcr.io/cloudsql-docker/gce-proxy:1.09
    imagePullPolicy: Always
    command: ["/cloud_sql_proxy",
              "--dir=/cloudsql",
              "-instances=@@PROJECT@@:us-central1:@@DBINST@@=tcp:5432",
              "-credential_file=/secrets/cloudsql/credentials.json"]
    volumeMounts:
      - name: cloudsql-oauth-credentials
        mountPath: /secrets/cloudsql
        readOnly: true
      - name: ssl-certs
        mountPath: /etc/ssl/certs
      - name: cloudsql
        mountPath: /cloudsql

【问题讨论】:

  • 由于您使用 GKE 集群连接 Cloud SQL 数据库,我假设您使用 Cloud SQL 代理连接 Cloud SQL 实例。此外,您提到您正在使用服务帐户进行连接。在yaml文件中,你是否提供了secret,即本文“cloud.google.com/sql/docs/mysql/connect-kubernetes-engine#proxy”中描述的json密钥文件的路径?
  • Jason - 是的,这是标准的 Sidecar SQL 代理模式。我会将我们的模板添加到原始帖子中

标签: kubernetes google-cloud-platform google-cloud-sql google-kubernetes-engine


【解决方案1】:

当您从某些 Google API 收到错误 403 时,会出现 IAM 权限错误。要解决此问题,请确保将“Cloud SQL 客户端”角色分配给您的服务帐号。要检查向您的服务帐户添加了哪些权限,请转到 Cloud Project IAM 页面(左侧菜单 > IAM & Admin > IAM)并查找存在问题的服务帐户所在的行。服务帐户应在“角色”列上显示“Cloud SQL 客户端”。

如果您发现“Cloud SQL Client”角色未添加到服务帐户,请尝试按照this document 中的说明进行操作。如果服务帐户尚未在成员列表中,则不会为其分配任何角色。单击添加并输入服务帐户的电子邮件地址。如果服务帐户已在成员列表中,则它具有现有角色。单击要编辑的服务帐户的“角色”下的下拉列表,或者您可以将“Cloud SQL 客户端”角色作为附加角色添加到服务帐户。您需要从“Cloud SQL”下的下拉列表中选择“Cloud SQL Client”角色。

如果您看到“Cloud SQL 客户端”角色已存在,请单击编辑以打开下拉列表。之后点击删除并保存。请确保服务帐户已从 IAM 页面中删除。单击 Cloud Project IAM 页面顶部的添加按钮。输入服务帐户电子邮件地址,然后从“Cloud SQL”下的下拉列表中选择“Cloud SQL Client”角色。之后单击“保存”按钮,服务帐户应再次出现在列表下方。有了这个,我们将删除然后再次添加服务帐户的权限。

您还可以尝试添加this document 中所述的新服务帐户,并从“Cloud SQL”下的下拉列表中选择“Cloud SQL Client”角色。请注意,您需要“服务帐户管理员”角色或“编辑”原语角色来执行操作。

如果仍然无法解决问题,请确保“Cloud SQL 实例”名称正确。您可以从 Cloud SQL 实例的 Google Cloud Console 页面复制并粘贴“实例连接名称”,如 StackOverflow issue 中所述。

或者by updating the secret to use the right key 你可以解决这个问题。您可以为服务帐户创建多个密钥。

【讨论】:

  • 感谢@Mohammed,我会提出这些建议。最后,我认为我们在其中一个旧 pod 中找到了另一个 keyfile.json 并使其正常工作,但我的记忆不是 100% 清楚,所以我会问我的同事。
【解决方案2】:

GKE 当前支持私有 IP 地址连接。如果您在同一区域中并且集群启用了 IP 别名,则可以连接到云 sql 集群。

【讨论】:

  • 感谢@newoxo,我相信我们当时考虑到了这一点,但是 VPC 设置需要创建一个新集群。这似乎很重,但回想起来,在 k8s 世界中可能并不那么难。我不确定“私有 ip”是新的还是与 vpc 相同,会检查。
  • 对于私有 mysql 连接,您需要启用 vpc 本地网络,并且云 sql 和 GKE 集群必须在同一区域。
猜你喜欢
  • 2019-11-24
  • 1970-01-01
  • 1970-01-01
  • 2021-06-10
  • 2017-04-09
  • 2021-07-14
  • 2022-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多