从私有 GKE 集群连接到 public 云 SQL
Connecting to public Cloud SQL from a private GKE cluster
我正在尝试使用云-sql-代理从 GKE 集群连接到具有 public IP 的云 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 可以访问互联网(我可以访问 www.google.com),因此它应该能够连接到云 SQL 的 public IP。我可以在我的笔记本电脑上毫无问题地使用 cloud-sql-proxy 并连接到那里的实例。我错过了什么?我还能检查什么?
我发现 but I have SQL Admin API enabled. 只谈论没有互联网访问的 GKE 集群。
看起来你做的一切都是正确的。您是否有可能阻止流量出站到 3307 上的云 sql 实例的防火墙?
结论是:
- 不使用 www.google.com to check if a node has Internet access on GCP's infrastructure. It seems that www.google.com is viewed as internal traffic on GCP. Trying to fetch www.amazon.com 在私有 GKE 集群上失败。
- 要从私有 GKE 集群连接到 Cloud SQL,请使用 Cloud SQL 的私有 IP(记得将
-ip_address_types=PRIVATE
添加到 cloud-sql-proxy) .
我遇到了同样的问题,正在苦思冥想。我使用私有 IP 启用了 SQL 实例,此连接问题已解决。
我会说这是正确的答案。我的 GKE 集群是私有的。 SQL 个实例有 public 个 IP 可用,我可以使用身份验证代理从我的本地计算机连接到它,但同样的事情在 GKE 私有集群中不起作用。花了 2 天后,我发现这个 post 这个答案对我有用。我刚刚启用了私有 IP 并在我的部署中也添加了该标志。
To connect to Cloud SQL from a private GKE cluster use a private IP for Cloud SQL (remember to add -ip_address_types=PRIVATE to cloud-sql-proxy).
我正在尝试使用云-sql-代理从 GKE 集群连接到具有 public IP 的云 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 可以访问互联网(我可以访问 www.google.com),因此它应该能够连接到云 SQL 的 public IP。我可以在我的笔记本电脑上毫无问题地使用 cloud-sql-proxy 并连接到那里的实例。我错过了什么?我还能检查什么?
我发现
看起来你做的一切都是正确的。您是否有可能阻止流量出站到 3307 上的云 sql 实例的防火墙?
结论是:
- 不使用 www.google.com to check if a node has Internet access on GCP's infrastructure. It seems that www.google.com is viewed as internal traffic on GCP. Trying to fetch www.amazon.com 在私有 GKE 集群上失败。
- 要从私有 GKE 集群连接到 Cloud SQL,请使用 Cloud SQL 的私有 IP(记得将
-ip_address_types=PRIVATE
添加到 cloud-sql-proxy) .
我遇到了同样的问题,正在苦思冥想。我使用私有 IP 启用了 SQL 实例,此连接问题已解决。 我会说这是正确的答案。我的 GKE 集群是私有的。 SQL 个实例有 public 个 IP 可用,我可以使用身份验证代理从我的本地计算机连接到它,但同样的事情在 GKE 私有集群中不起作用。花了 2 天后,我发现这个 post 这个答案对我有用。我刚刚启用了私有 IP 并在我的部署中也添加了该标志。
To connect to Cloud SQL from a private GKE cluster use a private IP for Cloud SQL (remember to add -ip_address_types=PRIVATE to cloud-sql-proxy).