1

我正在尝试使用以下 GCLOUD 命令使用市场 posgresql11 映像构建 VM(尽管对于我尝试过的所有映像,该问题似乎都很普遍):

gcloud compute instances create-with-container postgres-test \
  --container-image gcr.io/cloud-marketplace/google/postgresql11:latest \
  --container-env-file=envdata.txt \
  --container-mount-host-path mount-path=/var/lib/postgresql,host-path=/mnt/disks/postgres_data,mode=rw \
  --machine-type=e2-small \
  --scopes=cloud-platform \
  --boot-disk-size=10GB \
  --boot-disk-device-name=postgres-test \
  --create-disk="mode=rw,size=10GB,type=pd-standard,name=postgres-test-data,device-name=postgres-test_data" \
  --network-interface=subnet="default,no-address" \
  --tags=database-postgres \
  --metadata-from-file user-data=metadata.txt

envdata.txt 文件包含映像的环境变量数据, metadata.txt 文件包含 bootcmd 指令,用于格式化和挂载 postgres 数据的外部磁盘。

环境数据.txt:

POSTGRES_USER=postgresuser
POSTGRES_PASSWORD=postgrespassword

元数据.txt:

#cloud-config

bootcmd:
- fsck.ext4 -tvy /dev/sdb
- mkdir -p /mnt/disks/postgres_data
- mount -t ext4 -O ... /dev/sdb /mnt/disks/postgres_data

VM 已创建,但 sudo journalctl 命令显示尝试开始连接到 GCR,但这似乎不成功。postgres 的 docker 映像未下载,也未在 VM 上启动。

如果我现在通过执行以下命令从 cloud 命令的 network-interface 行中删除 no-address 命令(允许 google 为 VM 分配外部 IP 地址):

gcloud compute instances create-with-container postgres-test \
  --container-image gcr.io/cloud-marketplace/google/postgresql11:latest \
  --container-env-file=envdata.txt \
  --container-mount-host-path mount-path=/var/lib/postgresql,host-path=/mnt/disks/postgres_data,mode=rw \
  --machine-type=e2-small \
  --scopes=cloud-platform \
  --boot-disk-size=10GB \
  --boot-disk-device-name=postgres-test \
  --create-disk="mode=rw,size=10GB,type=pd-standard,name=postgres-test-data,device-name=postgres-test_data" \
  --network-interface=subnet="default" \
  --tags=database-postgres \
  --metadata-from-file user-data=metadata.txt

然后创建一个 VM,下载并执行 POSTGRES 映像。sudo journalctl 显示与 GCR 的连接正在启动并已启动。

谁能向我解释为什么在我的情况下执行图像取决于拥有外部 IP 以及如何使用 GCR 创建 VM 而无需为实例分配外部 IP 地址?

4

1 回答 1

2

如果您有公共 IP,则从您的实例到 Internet 的请求会通过 Internet 网关。如果您的实例没有公共 IP,那么您需要设置 Cloud NAT 以提供到 Internet 的路由。这是最简单的解决方案。如果您只需要访问 Google API 和服务而不需要访问公共 Internet,请参阅下一个选项。

谷歌云 NAT

Google 还提供Private Google Access仅访问 Google API 和服务的功能。

私人谷歌访问

于 2020-11-30T08:06:05.110 回答