+86 189 8218 1436 周一至五 10:00-22:00

开始使用 Google Compute Engine 虚拟机

TL;DR:用最少步骤理解 GCP 虚拟机:从创建实例、SSH 登录到开关机、防火墙和费用控制,适合第一次上云的小白。

它是什么

开始使用 Google Compute Engine 虚拟机前,先记住一句话:Google Compute Engine(常简称 GCE)是 GCP 提供的云上虚拟机服务。说人话,它就是一台放在 Google 数据中心里的 Linux 或 Windows 服务器:你不用买主机、插网线、装系统,只要按需创建、启动、停止和删除。想临时跑网站、测试程序、练习命令行,就开一台;不用了就删掉。之所以强调“按需”,是因为云资源通常按时间和配置计费,停止 VM 不等于所有费用都消失,启动盘、静态外部 IP 等还可能继续收费;删除前也要确认数据已备份,因为启动盘可能一起被删。

但“虚拟机”不是一个孤零零的 CPU。一台能用的 VM 通常包含或要一起配置下面这些东西:

  • 机器类型:选几核 CPU、多少内存,类似选电脑配置。
  • 系统镜像:决定装 Ubuntu、Debian、Windows Server 等哪个系统。
  • 启动盘:系统文件、程序和你保存的数据放这里。
  • 网络、外部 IP、防火墙规则:决定 VM 在哪个私有网络里、有没有公网地址、哪些端口允许访问;很多人连不上 SSH 或远程桌面,就是外部 IP 或防火墙没配好。
  • 身份权限:也就是服务账号和 IAM 权限,决定这台 VM 能不能读存储桶、访问数据库等;新手容易图省事给太大权限,后面很难收拾。

为什么先讲这些?因为控制台创建页面里的每个选项,都会对应上面的一个部分;选项看不懂,后面就容易出现“机器开了但连不上”“以为没收费”“权限给太多”等问题。你可以在 GCP 控制台右上角打开 Cloud Shell(它自带 gcloud 和登录态,别先复制到自己电脑的普通终端),复制下面几行:前两行确认环境,第三行只启用 Compute Engine API,后面都是查看;不会创建 VM。

gcloud auth list
gcloud config list project
gcloud services enable compute.googleapis.com
gcloud compute machine-types list --limit=5
gcloud compute images list --limit=5
gcloud compute instances list
gcloud compute networks list
gcloud compute firewall-rules list

前两行用来确认登录账号和当前项目,最常见的坑是选错项目,然后以为刚开的机器不见了。第三行如果提示权限或结算账号问题,说明当前项目还没准备好,先找项目管理员,不要反复点创建按钮。后面几行分别列出机器类型、镜像、现有实例、网络和防火墙规则,用来把抽象概念和可选项对上。看到列表为空也别慌,可能只是这个项目还没建过相关资源。

解决什么问题

想搭个小网站、跑个测试脚本,或者临时试个新软件,难道非得掏钱买台沉甸甸的服务器放家里?开始使用 Google Compute Engine 虚拟机,就是帮你省掉这步的:相当于在谷歌机房「租」台电脑,不搬机器、不拉网线,几分钟就能拿到一台能联网的主机,放网站、做测试环境、跑后台任务或当用完就扔的实验机都行。

想直观感受「不用买硬件」?装好 gcloud 并登录后,直接复制下面这行看现成配置:

gcloud compute machine-types list --zones=asia-east1-b --limit=3

为什么这么做:这只是「查菜单」,不会创建机器、也不会产生费用,最适合零基础先练手,让你秒懂 CPU 和内存是随挑随用的,根本不用去电脑城比价。小白常踩的坑:一上来就照着教程敲「停止实例」,可自己连机器都还没建,立马报「找不到资源」就慌了。记住顺序:先查、再建、最后才停。

计费也很友好:按秒算钱,但有最低计费时长(一般 1 分钟起),不是老式云主机那种「一开就扣整小时」。随用随停,特别适合流量忽高忽低的小站、只跑两三天的短期项目,以及一年练一次的灾备演练。坑就在这儿:关掉浏览器标签页 ≠ 关掉虚拟机!只要实例还在跑,费用就一直在跳表,练完务必回控制台点「停止」或直接删掉,别让它默默挂一整个月。

分工上更省心:硬件坏了、机房断电、物理网络抖动,这些全交给 GCP 兜底,你基本感知不到。自己主要管三样就够了——系统(装什么 Linux/Windows)、数据(存了什么文件)、应用(跑的网站或脚本),不用再半夜爬起来重启交换机。

最省时间的其实是复制环境。第一台装顺了之后,别再给第二台重装系统、重敲一遍依赖:用快照存个档、用镜像存整套系统盘、再用实例模板把「机型 + 镜像 + 启动设置」固定下来,下次要 1 台还是 10 台,照模板一键生成,配置一模一样,重复装机的麻烦直接没了。

  • 快照:改配置前存一下,改崩了能退回去。
  • 镜像:拿装好环境的盘,直接去开新机。
  • 实例模板:批量开机器,避免每次手滑选错配置。

最后一个坑:快照和镜像不是免费无限存的,长期不用的旧快照也会一直收存储费。实验做完顺手清掉,才真的叫「随用随停」。

怎么上手

  1. 第一次开始使用 Google Compute Engine 虚拟机,别急着点创建:先打开 Google Cloud 控制台,顶部选好项目,到「结算」确认已绑定结算账号,再搜索「Compute Engine」并点「启用」,把 Compute Engine 服务打开。区域建议选离访客近的 asia-east1,可用区选 asia-east1-b。不想装工具就点右上角 Cloud Shell,下面命令可直接复制:

    gcloud services enable compute.googleapis.com
    gcloud config set compute/region asia-east1
    gcloud config set compute/zone asia-east1-b

    为什么:项目是资源和账单的篮子,结算账号没绑会创建失败;区域影响延迟、价格和机型,可用区是区域内的具体机房。坑:免费额度不是无限,配额不够、项目选错,都会让后面步骤莫名报错。

  2. 进入「创建实例」:机器类型先选 e2-micro,系统镜像选 Debian 12,启动盘 20GB,网络用 default,是否分配外部 IP 这项,这次选「临时」。也可以一次复制执行:

    gcloud compute instances create my-first-vm 
      --zone=asia-east1-b 
      --machine-type=e2-micro 
      --image-family=debian-12 
      --image-project=debian-cloud 
      --boot-disk-size=20GB 
      --network=default 
      --tags=http-server

    为什么:小配置够练手又便宜,20GB 给系统和日志留空间,临时外部 IP 方便 SSH 和访问网页,标签方便后面只给这台机器开端口。坑:不选外部 IP 更安全省钱,但小白常常连不上;临时 IP 停止再启动可能变,别当固定地址用。

  3. 在实例列表点「SSH」按钮就能用浏览器终端登录;也可以用 gcloud 命令登录,并顺手更新系统、部署一个 Nginx 服务、检查防火墙端口 80:

    gcloud compute ssh my-first-vm --zone=asia-east1-b --command='set -e; sudo apt-get update; sudo apt-get upgrade -y; sudo apt-get install -y nginx; sudo systemctl enable --now nginx'
    if ! gcloud compute firewall-rules describe allow-http >/dev/null 2>/dev/null; then
      gcloud compute firewall-rules create allow-http 
        --network=default 
        --allow=tcp:80 
        --target-tags=http-server
    fi
    gcloud compute firewall-rules describe allow-http --format='table(name,allowed,targetTags)'
    EXTERNAL_IP=$(gcloud compute instances describe my-first-vm --zone=asia-east1-b --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
    curl -I "http://${EXTERNAL_IP}"

    为什么:先更新系统是为了补安全补丁;Nginx 是最容易验证的服务;云端防火墙默认常只放行 22,不放行 80 时浏览器会一直转圈。坑:云端防火墙和 Linux 内部防火墙是两层,服务装好了不等于外网能访问。

  4. 用完及时停止或删除实例。练习结束先停止,并确认磁盘、快照和静态 IP 是否仍在计费:

    gcloud compute instances stop my-first-vm --zone=asia-east1-b
    gcloud compute disks list
    gcloud compute snapshots list
    gcloud compute addresses list

    确定不要了再删除;有数据先做快照:

    gcloud compute instances delete my-first-vm --zone=asia-east1-b --delete-disks=all --quiet
    gcloud compute disks list
    gcloud compute snapshots list
    gcloud compute addresses list

    为什么:停止后 CPU 和内存通常不再收费,但启动盘、快照、未绑定的静态 IP 仍可能按存储或占用收费;删除能清掉实例和启动盘,却不会自动清掉所有额外资源。坑:看到列表里还有磁盘、快照或地址,就去控制台确认是否还需要,别以为关机就是全免费。

与替代方案对比

开始使用 Google Compute Engine 虚拟机时,别急着点「创建实例」。VM 就是「在云里租一台电脑」。和本地物理机比,它几分钟开通,配置能再调,做实验、压测很灵活;不用买机器、等上架。但物理机放着,账单基本停了;VM 开机、挂着磁盘、留着外部 IP,就可能继续计费。长期用要算出站流量、磁盘、快照、静态 IP,别只看每小时单价。

和 App Engine、Cloud Run 等托管服务比,VM 控制权更高:能选系统、装包、改 SSH、开端口、跑常驻进程;代价是补丁、防火墙、密钥、日志、备份都自己管。托管服务像「把菜交给厨房」,平台管扩容和底层安全;VM 像「连厨房一起租」,自由多,也要自己打扫。

和轻量云主机比,GCP 的网络、IAM 权限、镜像、监控更完整,以后扩展更顺;但项目、区域、VPC、服务账号、防火墙概念更多,初次配置更细。小白常照教程开了机,却漏看项目和防火墙,连不上就以为机器坏了。

怎么选:只跑一个容器化服务,比如一个网站接口,优先看 Cloud Run:平台自动扩容,不用管服务器;需要完整 Linux 权限,要装包、改系统配置、开守护进程,再选 VM。先在 GCP 控制台右上角打开 Cloud Shell,复制下面命令做「需求体检」,只查看信息,不创建收费资源:

uname -a
id
gcloud config list

为什么跑:第一条看系统,第二条看是否要管理员权限,第三条防项目选错。头大就选 Cloud Run;想到「我要改系统配置」再选 VM。

  • Windows 坑:别在 CMD 试这些命令;Cloud Shell 是现成 Linux,也自带所需工具。
  • 费用坑:删除实例不等于删掉磁盘、外部 IP、快照、防火墙规则,回控制台逐项看。
  • 配置坑:别为「以后可能用到」开大规格,先小后调,才用得上弹性。

最佳实践

先把安全底线立住:别用默认高权限服务账号,更别给 Owner/Editor。下面整段复制到本地终端或 Cloud Shell 的 Bash 执行:选项目、建最小权限账号、把当前公网 IP 和 IAP 网段写进 SSH 防火墙、用 e2-micro 开练习机,并做快照和实例模板。第一次按屏幕登录选项目即可。

# 整段复制执行;第一次会提示登录并选择一个项目
gcloud init --console-only

PROJECT_ID="$(gcloud config get-value project 2>/dev/null)"
if [ -z "$PROJECT_ID" ]; then echo "还没选项目,请重新运行 gcloud init"; exit 1; fi

ZONE="asia-east1-a"
VM_NAME="web-dev-zhangsan-001"
SA_NAME="vm-app-readonly"
SA_EMAIL="${SA_NAME}@${PROJECT_ID}.iam.gserviceaccount.com"

MY_IP="$(curl -s https://api.ipify.org || curl -s https://ipinfo.io/ip)"
if [ -z "$MY_IP" ]; then echo "取不到公网 IP,请联网后重试"; exit 1; fi
MY_IP="${MY_IP}/32"
SOURCE_RANGES="${MY_IP},35.235.240.0/20"

STARTUP_SCRIPT='#!/bin/bash
set -e
apt-get update
apt-get install -y curl
curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh
bash add-google-cloud-ops-agent-repo.sh --also-install'

gcloud iam service-accounts create "$SA_NAME" 
  --display-name="GCE beginner least privilege" || true
gcloud projects add-iam-policy-binding "$PROJECT_ID" 
  --member="serviceAccount:${SA_EMAIL}" 
  --role="roles/logging.logWriter" || true
gcloud projects add-iam-policy-binding "$PROJECT_ID" 
  --member="serviceAccount:${SA_EMAIL}" 
  --role="roles/monitoring.metricWriter" || true
gcloud projects add-iam-policy-binding "$PROJECT_ID" 
  --member="serviceAccount:${SA_EMAIL}" 
  --role="roles/stackdriver.resourceMetadata.writer" || true

# 默认网络常自带对全网开放 22 的旧规则,先删掉再建限制来源的规则
gcloud compute firewall-rules delete default-allow-ssh --quiet || true
gcloud compute firewall-rules update allow-ssh-from-my-ip 
  --allow=tcp:22 
  --source-ranges="$SOURCE_RANGES" 
  --target-tags=ssh-from-my-ip 2>/dev/null || 
gcloud compute firewall-rules create allow-ssh-from-my-ip 
  --network=default 
  --direction=INGRESS 
  --allow=tcp:22 
  --source-ranges="$SOURCE_RANGES" 
  --target-tags=ssh-from-my-ip || true

gcloud compute instances create "$VM_NAME" 
  --zone="$ZONE" 
  --machine-type=e2-micro 
  --image-family=debian-12 
  --image-project=debian-cloud 
  --service-account="$SA_EMAIL" 
  --scopes=cloud-platform 
  --tags=ssh-from-my-ip 
  --labels=env=dev,owner=zhangsan,cost_center=demo 
  --metadata=startup-script="$STARTUP_SCRIPT" || true

SNAPSHOT_NAME="${VM_NAME}-$(date +%Y%m%d%H%M%S)"
gcloud compute disks snapshot "$VM_NAME" 
  --zone="$ZONE" 
  --snapshot-names="$SNAPSHOT_NAME" || true
gcloud compute disks create "${VM_NAME}-restore-test" 
  --zone="$ZONE" 
  --source-snapshot="$SNAPSHOT_NAME" || true

gcloud compute instance-templates create "${VM_NAME}-template" 
  --machine-type=e2-micro 
  --image-family=debian-12 
  --image-project=debian-cloud 
  --service-account="$SA_EMAIL" 
  --scopes=cloud-platform 
  --tags=ssh-from-my-ip 
  --labels=env=dev,owner=zhangsan,cost_center=demo 
  --metadata=startup-script="$STARTUP_SCRIPT" || true
  • 权限和端口:IAM 才决定能做什么,cloud-platform 只是访问范围,不是“全开”。练习机只开 22;以后要建站再单独加 80/443,别提前开。常见坑是默认网络自带 default-allow-ssh 对全网开 22,新增限制规则不会覆盖旧规则,所以命令先删旧规则。来源里除了你的 IP 还带了 IAP 网段,方便浏览器 SSH,仍不是全网;公网 IP 变了就更新来源,别改回 0.0.0.0/0。若提示没权限或找不到 default 网络,找管理员确认,别反复重试。
  • 命名和标签:名字用「用途-环境-负责人-编号」,标签写 env、owner、cost_center,最后这个就是成本归属。账单、找机器、自动开关机都靠它们;别全叫 test、instance-1,月底不知道谁建的。
  • 可观测和备份:启动脚本装了 Ops Agent(收日志和 CPU/内存指标),服务账号只给三个写角色;再去「结算 > 预算和提醒」设 50%/90%/100% 邮件提醒,别等账单出来才发现忘关机。快照不是备份的证明,命令先建恢复测试盘,演练时挂到临时小机器读一次文件再删;先 e2-micro 练,别一上来选高配或 GPU。
  • 生产固化:练习可用启动脚本;生产把验证过的机器做成自定义镜像,再用实例模板或托管实例组(按模板自动建/换机器)重建。别每次 SSH 上去手工改,改着改着两台就不一样,这叫配置漂移,排障很痛苦。

常见问题(FAQ)

第一次创建 VM 选哪种机器类型?

先用 e2-micro 或 e2-small 练手,够跑 Linux 基础服务,费用也更容易控制。

为什么创建后连不上 SSH?

先查实例是否运行、防火墙是否放行、外部 IP 是否存在,再看账号和密钥。

停止实例后还会收费吗?

通常不再收实例运行费,但启动盘、静态 IP、快照等资源仍可能产生费用。

需要一开始就学命令行吗?

不用,先用控制台完成创建和 SSH 登录,熟悉后再逐步学 gcloud。

不想自己折腾 GCP?我们提供云平台代维护、上云迁移与账单代付服务,一对一技术支持。

查看代维服务 →

发表评论