GKE 私有集群和云 sql 代理连接

GKE private cluster and cloud sql proxy connection

我有 2 个 GKE 集群,包括私有集群和 public,并使用 cloudproxy 作为 gke 应用访问云 sql 实例的 sidecar 容器。

public development/testing

集群设置

云 SQL 启用了私有 IP 和 public IP。 GKE 应用使用 cloudproxy,默认选项为 ip types (public,private),如下所示 云 SQL 没有任何授权网络。

在这种情况下,我的应用程序能够连接云SQL并且运行顺利。据我了解,此处与云的连接sql 应该是私有的,因为没有配置授权网络。

用于生产的私有集群设置

云 SQL 启用了私有 IP 和 public IP。 GKE 应用使用 cloudproxy,默认选项为 ip types (public,private)

cloudsql-部署文件中的代理设置

  - name: cloudsql-proxy
    image: gcr.io/cloudsql-docker/gce-proxy:1.11
    command: ["/cloud_sql_proxy"]
    args: ["-instances=$(REAL_DB_HOST)=tcp:$(REAL_DB_PORT)","-credential_file=/secrets/cloudsql/credentials.json"]

案例 1 Cloud SQL 没有任何授权网络。 结果:应用程序无法连接到 Cloud SQL

案例 2 云 SQL 将私有 GKE NAT 网关作为授权网络 结果:应用程序无法连接到 Cloud SQL

可能从应用程序中删除 cloudproxy 会起作用(我尚未测试)但它不鼓励在开发环境期间使用代理,因为它需要在生产部署期间更改部署文件。

我无法理解是什么原因导致与 gke 私有集群中的 cloudproxy 连接失败。私有集群不应该使用cloudproxy吗?

更新 云代理无法连接云 sql 的原因已被禁用云 SQL 管理员 API。我已经在答案部分更新了我的答案。

看起来这里的问题是 "Should we use the Cloud SQL proxy in a private cluster?",答案是 "it depends"。不需要连接,但它可以提高安全性,因为您可以限制对云 SQL 服务器的不必要访问。

云 SQL 代理不为您的应用程序提供连接 - 它只提供身份验证。它必须能够通过现有路径进行连接,然后使用服务帐户的 IAM 角色对连接进行身份验证。这也意味着它不必来自白名单网络,因为它已经通过不同的方式进行了身份验证。

如果您想使用代理通过私有 IP 连接(而不是默认为 public),请使用 -ip_address_types=PRIVATE - 这将告诉代理改为连接实例的私有 IP . (请注意,如果代理缺少网络路径(例如,不在 VPC 上)代理仍然无法连接。)

@kurtisvg 对此提供了一个信息丰富的答案。

然而真正的问题是 SQL 管理员 API 并启用它解决了问题。查看日志后,我发现下面的条目。

错误 403:未配置访问。 Cloud SQL Admin API 之前未在项目 XXXXXX 中使用过或已禁用。通过访问 https://console.developers.google.com/apis/api/sqladmin.googleapis.com/overview?

启用它

我遇到的问题是在 GKE 集群中启用 Private cluster :(

由于私有 GKE 集群,它无法访问外部 IP 地址,解决方法是根据 https://cloud.google.com/nat/docs/gke-example.

创建带云路由器的 NAT 网关

提示如果问题是您在登录容器后将无法从容器 ping 到 google.com 等。