我遵循的步骤:
1.创建VPC网络
gcloud compute networks create stg-vpc \ --subnet-mode custom
2.为此网络创建 VPC 对等连接的 IP 范围
gcloud beta compute addresses create google-managed-services-stg-vpc \ --global \ --purpose=VPC_PEERING \ --description="peering range for psql" \ --addresses=10.20.0.0 \ --prefix-length=16 \ --network=stg-vpc
3. 将私有 IP 分配给 Cloud SQL Postgres 实例
在 Cloud SQL Web 控制台中,我创建了一个新的 Postgres 实例。在连接我启用的选项私有 IP,并将其配置stg-vpc
为 IP 范围google-managed-services-stg-vpc
。
这将创建具有 IP 的 Cloud SQL Postgres 实例10.20.0.3
。
4. 为 GKE 集群创建子网
gcloud compute networks subnets create stg-vpc-us-central1 \ --network stg-vpc \ --region us-central1 \ --range 10.10.0.0/16
5. 创建 GKE 集群并部署连接到 Cloud SQL 中的数据库的应用程序
gcloud -q container clusters create cluster-1 \ --zone us-central1-a \ --num-nodes 3 \ --network stg-vpc \ --subnetwork stg-vpc-us-central1
我部署了一个 Java 应用程序,该应用程序使用 Postgres JDBC 驱动程序连接到 Cloud SQL DB 实例的私有 IP。我收到错误java.net.SocketTimeoutException: connect timed out
。
我还尝试了其他步骤:
- 我创建了一个防火墙规则来打开以下 IP 范围的 Postgres 端口:
gcloud compute firewall-rules create psql-access --network stg-vpc --allow tcp:5432 --source-ranges 10.20.0.0/16
。 - 我能够从 docker 容器内部 ping 通 K8s 主机,但不能 ping 通 Postgres 实例。
有人能指出我做错了什么以及为什么 VPC 对等不起作用吗?
答案1
我能够通过创建VPC 原生集群按照@patrick-w 的建议。
我的 VPC 子网创建已修改为包含两个次要范围:
gcloud compute networks subnets create stg-vpc-us-central1 \ --network stg-vpc \ --region us-central1 \ --range 10.10.0.0/16 \ --secondary-range stg-vpc-us-central1-pods=10.11.0.0/16,stg-vpc-us-central1-services=10.12.0.0/16
并且我的集群创建命令被修改为启用ip-alias
,并添加了要使用的次要范围的详细信息。
gcloud -q container clusters create cluster-1 \ --zone us-central1-a \ --num-nodes 3 \ --enable-ip-alias \ --network stg-vpc \ --subnetwork stg-vpc-us-central1 \ --cluster-secondary-range-name stg-vpc-us-central1-pods \ --services-secondary-range-name stg-vpc-us-central1-services