0

我正在尝试使用 cloud-sql-proxy 从 GKE 集群连接到具有公共 IP 的 Cloud SQL 实例。我使用以下命令创建了集群:

gcloud services enable compute.googleapis.com
gcloud services enable container.googleapis.com
gcloud container clusters create my-cluster \
  --disk-size=10GB \
  --machine-type=e2-small \
  --node-locations=us-central1-b,us-central1-c,us-central1-f \
  --num-nodes=1 \
  --preemptible \
  --release-channel=regular \
  --workload-pool=my-production.svc.id.goog \
  --zone=us-central1-f \
  --no-enable-master-authorized-networks \
  --enable-ip-alias \
  --enable-private-nodes \
  --master-ipv4-cidr 172.16.0.32/28

我使用以下命令创建了 Cloud SQL:

gcloud sql instances create my-db \
  --database-version=POSTGRES_12 \
  --region=us-central1 \
  --storage-auto-increase \
  --storage-size=10 \
  --storage-type=SSD \
  --tier=db-f1-micro

我还使用以下命令设置了一个服务帐户:

gcloud iam service-accounts create my-service-account
gcloud iam service-accounts add-iam-policy-binding \
  --role=roles/iam.workloadIdentityUser \
  --member="serviceAccount:my-production.svc.id.goog[default/my-service-account]" \
  my-service-account@my-production.iam.gserviceaccount.com
gcloud projects add-iam-policy-binding my-production \
  --member serviceAccount:"my-service-account@my-production.iam.gserviceaccount.com" \
  --role "roles/cloudsql.client"

pod 中 cloud-sql-proxy 的 sidecar 容器设置如下:

      - name: cloud-sql-proxy
        image: gcr.io/cloudsql-docker/gce-proxy:1.20.2
        command:
          - "/cloud_sql_proxy"
          - "-instances=my-production:us-central1:my-db=tcp:5432"
          - "-term_timeout=20s"

尽管如此,当我的应用程序尝试连接到 Cloud SQL 实例时,我可以在 cloud-sql-proxy 日志中看到以下错误:

2021/03/19 21:30:02 couldn't connect to "my-production:us-central1:my-db": dial tcp MY_DB_PUBLIC_IP:3307: connect: connection timed out

我检查了一下,pod 可以访问 Internet(我可以访问www.google.com),因此它应该能够连接到 Cloud SQL 的公共 IP。我可以在笔记本电脑上毫无问题地使用 cloud-sql-proxy 并连接到那里的实例。我错过了什么?我还能检查什么?

我找到了GKE 私有集群和云 sql 代理连接,但我启用了 SQL Admin API。Private GKE 和 Cloud SQL 之间的连接仅涉及无法访问 Internet 的 GKE 集群。

4

3 回答 3

1

看起来你做的一切都是正确的。您是否有防火墙可能会阻止出站到 3307 上的云 sql 实例的流量?

于 2021-03-21T03:56:01.083 回答
0

结论是:

  • 不要使用www.google.com来检查节点是否可以访问 GCP 的基础架构上的 Internet。似乎www.google.com被视为 GCP 上的内部流量。尝试在私有 GKE 集群上获取www.amazon.com失败。
  • 要从私有 GKE 集群连接到 Cloud SQL,请使用 Cloud SQL 的私有 IP(记得添加-ip_address_types=PRIVATE到 cloud-sql-proxy)。
于 2021-03-23T18:45:52.450 回答
0

我遇到了同样的问题,并且正在努力解决它。我用私有 IP 启用了我的 SQL 实例,这个连接问题就解决了。我会说这是正确的答案。我的 GKE 集群是私有的。SQL 实例有可用的公共 IP,我可以使用身份验证代理从本地计算机连接到它,但同样的事情在 GKE 私有集群中不起作用。花了 2 天后,我发现这篇文章的答案对我有用。我刚刚启用了私有 IP,并在我的部署中添加了该标志。

要从私有 GKE 集群连接到 Cloud SQL,请使用 Cloud SQL 的私有 IP(请记住将 -ip_address_types=PRIVATE 添加到 cloud-sql-proxy)。

于 2021-06-20T20:13:24.180 回答