它是什么:用一句话认识虚拟机服务
一句话认识:Compute Engine 是 GCP 提供的虚拟机服务,能随用随弹性创建、启动、停止,不够用了再扩容,完全不用自己买物理服务器搬进机房。
对小白来说,一台 VM 就当成云上的 Linux 服务器:想装网站就配 Nginx,想跑脚本就丢个 Python 文件,装数据库、挂后台服务也都在它上面。区别只是它 24 小时在线,机房归 Google 管。
先别急着点控制台,复制这条只读命令,看看当前项目里已经跑着几台机器:
gcloud compute instances list
为什么这么做:它只查不改,最安全,能避免「没建过机器却一直在扣费」的懵圈。坑:若报权限错或输出空,先跑 gcloud init 选对项目,别对着空白怀疑人生。
后面天天见的概念,先混个脸熟:
- 实例:那台 VM 本身,也是计费主体。
- 机器类型:几核几 G,练手选
e2-micro就够。 - 镜像:开机自带啥系统,比如 Ubuntu、Debian。
- 系统盘:装系统和你代码的「硬盘」。
- VPC 网络:云上私有局域网,机器靠它互通。
- 防火墙规则:网络门卫,不放行端口外面进不来。
- 外部 IP:公网地址,有它你浏览器才访问得到。
再查一下可选的低配机型,顺便练手:
gcloud compute machine-types list --filter="name:e2-"
为什么加 --filter:不加会刷出几百行,只看 e2 系列不晕。三个高频坑记牢:①别顺手选了高配又忘关,隔夜账单很清醒;②网站部署好却打不开,九成是防火墙没开 80/443;③只点「停止」≠ 不花钱,系统盘和外部 IP 仍在计费,练完要删实例、连带删盘才彻底停。一句话:不用就删,比停着省。
解决什么问题:不用先买物理服务器
做 Google Cloud Platform上的ComputeEngine实践,先理解它替你省掉的事:以前要买物理服务器、等发货、上架接电、装系统,硬盘坏了还要换盘,机房电力、网络、空调也得有人盯。现在采购、上架、换硬盘和机房维护交给云平台;你在 Cloud Shell 里按需创建 VM,通常几分钟就能拿到可登录的 Linux 环境。
它适合个人项目、测试环境、小型网站、定时任务,以及需要稳定公网入口的后台服务。打开 Cloud Shell,先确认当前项目已开通结算,再复制下面整段:启用 API、预留静态外部 IP、创建小规格 VM、放行 SSH 和 80 端口,最后打印公网 IP。
gcloud services enable compute.googleapis.com
gcloud config set compute/region asia-east1
gcloud config set compute/zone asia-east1-b
gcloud compute addresses create gcpok-demo-ip --region=asia-east1
IP=$(gcloud compute addresses describe gcpok-demo-ip --region=asia-east1 --format='get(address)')
gcloud compute instances create gcpok-demo-vm
--machine-type=e2-micro
--image-family=debian-12
--image-project=debian-cloud
--boot-disk-size=20GB
--tags=http-server
--address="$IP"
gcloud compute firewall-rules create allow-ssh-http-gcpok-demo
--allow=tcp:22,tcp:80
--target-tags=http-server
gcloud compute instances describe gcpok-demo-vm
--zone=asia-east1-b
--format='get(networkInterfaces[0].accessConfigs[0].natIP)'
为什么这么做:静态 IP 比默认临时 IP 更适合域名解析和后台回调;e2-micro 用来低成本试水;防火墙只开要用的端口。小白常见坑:当前项目选错或没开结算、地区与可用区不一致、实例名或防火墙名已存在、开了防火墙却没装网站程序。重复练习请改名或删旧资源;不用时删除实例并释放静态 IP,否则可能继续计费。
流量或算力变化时,不用按峰值一次性买高配。先停机做快照留底,再把机器类型从 e2-micro 调到 e2-small、启动盘从 20GB 增到 30GB,然后开机。快照用于回滚,扩容解决空间不够,升配解决 CPU/内存吃紧,避免一次性投入过高。
gcloud compute instances stop gcpok-demo-vm --zone=asia-east1-b
gcloud compute disks snapshot gcpok-demo-vm
--snapshot-names=gcpok-demo-snapshot-1
--zone=asia-east1-b
gcloud compute instances set-machine-type gcpok-demo-vm
--machine-type=e2-small
--zone=asia-east1-b
gcloud compute disks resize gcpok-demo-vm
--size=30GB
--zone=asia-east1-b
gcloud compute instances start gcpok-demo-vm --zone=asia-east1-b
扩完云盘还要进系统扩展分区和文件系统,否则控制台显示 30GB,系统里可能仍看不到新增容量;首次 SSH 若仍提示生成密钥,按提示确认即可。复制执行:
gcloud compute ssh gcpok-demo-vm
--zone=asia-east1-b
--quiet
--strict-host-key-checking=no
--command='set -e; sudo apt-get update; sudo apt-get install -y cloud-guest-utils; sudo growpart /dev/sda 1; sudo resize2fs /dev/sda1; df -h'
- 停机改配置会短暂中断:避开访问高峰,后台服务先告知或切流量。
- 快照不是自动备份:只保存某一刻,重要数据要定期做并验证恢复。
- 默认启动盘名等于实例名:如果你改过磁盘名,先在控制台查名称再替换命令。
- 静态公网入口有成本和安全责任:正式环境限制 SSH 来源 IP,只开放业务端口。
怎么上手:从零创建第一台 VM
第一次别追求性能,跑通“能登录、能开网页”的小机器就行。先在 Cloud Console 左上角确认项目:用练习项目,别误选生产项目,账单和防火墙规则都算在它头上。
- 选位置、规格、镜像:进 Compute Engine 的“VM 实例”点“创建实例”。区域选离自己近的,如 asia-east1,可用区选 b;区域决定价格、延迟和外部 IP,建好后不好搬。机器类型先选 e2-micro/e2-small,启动磁盘 10GB 够用;保持默认按量计费,别买承诺折扣,Spot 更便宜但可能被回收。启动磁盘里选 Ubuntu 22.04 LTS,下面命令按它或 Debian 12 写,选 CentOS 会没有 apt。
- 开端口:在“防火墙”勾“允许 HTTP 流量”,再去“VPC 网络 > 防火墙”确认 tcp:80;本机 SSH 还要 tcp:22,默认网络通常已有 default-allow-ssh,自定义网络要补。只开 22、80,别开放全部端口。防火墙只是门禁,勾了不代表网站已运行。
点实例右侧“SSH”用浏览器登录最省事。登录后先更新系统、建普通用户、装最小网页服务并测 80;用户默认禁用密码,是为了避免弱密码被扫,别长期用默认高权限账号干活。
sudo apt update
sudo DEBIAN_FRONTEND=noninteractive apt upgrade -y
sudo adduser --disabled-password --gecos "" practice
sudo usermod -aG sudo practice
sudo su - practice -c "whoami"
sudo DEBIAN_FRONTEND=noninteractive apt install -y nginx curl
sudo systemctl enable --now nginx
curl -I --max-time 5 http://127.0.0.1
EXTERNAL_IP="$(curl -H 'Metadata-Flavor: Google' 'http://metadata.google.internal/computeMetadata/v1/instance/network-interfaces/0/access-configs/0/external-ip')"
echo "http://$EXTERNAL_IP"
curl -I --max-time 10 "http://$EXTERNAL_IP"
看到 HTTP 响应后,在本机浏览器打开命令输出的 http 地址。常见坑是:复制了内部 IP、没分配外部 IP、浏览器自动跳 https,或只开门却没启动服务。若用本机 SSH 密钥,先生成一对密钥,只把公钥粘到 Console 的“元数据 > SSH 密钥”,登录用 SSH 下拉菜单给出的本机命令;私钥绝不上传,启用 OS Login 时粘贴可能不生效,卡住就先回浏览器 SSH。
mkdir -p ~/.ssh
chmod 700 ~/.ssh
KEY="$HOME/.ssh/gcp-practice-$(date +%s)-$$"
ssh-keygen -t ed25519 -f "$KEY" -C "gcp-practice" -N ""
echo "私钥:$KEY"
cat "$KEY.pub"
练完点“停止”,不再用就“删除”:停止主要省 CPU/内存,磁盘和静态外部 IP 仍可能计费。等要批量操作时,再开 Console 右上角 Cloud Shell,它自带 gcloud 并继承当前项目;先核对顶部项目名。下面这段把创建、停机、开机、查询变成可复用脚本雏形;规则或实例名已存在会报错,忽略或改名即可,真实环境别照抄全网来源。
gcloud services enable compute.googleapis.com
gcloud config set compute/zone asia-east1-b
gcloud compute firewall-rules create allow-http-demo --allow=tcp:80 --target-tags=http-server --source-ranges=0.0.0.0/0
gcloud compute firewall-rules create allow-ssh-demo --allow=tcp:22 --target-tags=ssh-server --source-ranges=0.0.0.0/0
gcloud compute instances create demo-vm --machine-type=e2-micro --image-family=ubuntu-2204-lts --image-project=ubuntu-os-cloud --tags=http-server,ssh-server
gcloud compute instances stop demo-vm
gcloud compute instances start demo-vm
gcloud compute instances describe demo-vm
gcloud compute instances list --filter="name=demo-vm"
与替代方案对比:什么时候别急着用 VM
很多小白一上来就开 VM,觉得「有台服务器才叫上云」,其实先停一下:Compute Engine 不是万能钥匙,选错了既费钱又费精力。下面用大白话帮你对号入座。
先说和本地物理服务器比。VM 最大的爽点是快:不用买机器、等发货、装系统,点几下或一条命令几十秒就开机,流量涨了还能随时加 CPU、内存,不用了就关掉。但坑也在这:云上是按秒计费的,如果你 7×24 小时满负载跑一两年,账单一路累加,很可能比自己买台机器托管还贵。所以长期高负载别拍脑袋,先用价格计算器算一遍再决定。
gcloud compute instances list --format="table(name, machineType, status, zone)"
这条命令能列出你当前项目里所有 VM 和规格,为什么先跑它:小白最容易忘掉自己开过的机器,实例哪怕闲置也在计费,定期看一眼能直接止损。
再说和 App Engine、Cloud Run 这类托管服务比。VM 自由度最高,装什么软件、改什么内核参数都随你;代价是系统补丁、防火墙、安全加固、监控告警全得自己扛。托管服务反过来:你只管传代码,平台帮你扩缩容、打补丁。如果你只是想跑个小 API 或博客后台,没特殊系统依赖,用 Cloud Run 往往更省心。
gcloud run deploy hello --image=gcr.io/cloudrun/hello --region=asia-east1 --allow-unauthenticated
复制执行就能起一个示例服务,为什么这么干:亲手体验一下「不用管服务器」是什么感觉,再回头判断自己是不是真需要 VM。常见坑是开了 VM 却从不更新系统,时间一长漏洞一堆。
接着看容器服务。单台 VM 装个 Nginx、跑一个简单应用,入门最直观,文件放哪儿、日志怎么看都清清楚楚,适合练手。可一旦变成「前端 + 后端 + 数据库 + 定时任务」好几个服务,还要自动重启、滚动更新,再靠手工管一台 VM 就会乱,这时候才该考虑 GKE 或 Cloud Run 做编排。别一上来就上 Kubernetes,概念太多容易劝退。
top
在 VM 里跑这个能实时看 CPU 和内存占用,为什么看它:如果长期只用到 5%,说明你多半买大了,降配或换托管服务更划算;这也是小白最常忽略的「隐形浪费」。
最后一条最容易被跳过:如果只是静态网站、图片、PDF、下载包,别开 VM。直接放 Cloud Storage 对象存储,通常更便宜,不用装系统、不用配 Nginx、不用管证书和打补丁,配好公开读取就能访问。
gsutil mb -l asia-east1 gs://your-bucket-name-demo
gsutil cp ./index.html gs://your-bucket-name-demo/
第一条建桶,第二条把本地网页传上去。注意坑:桶名全球唯一,your-bucket-name-demo 要换成你自己的名字;另外默认权限是私有的,想当网站看还得单独放行公开读取,别以为传完就能打开。
简单记一句:要完全控制、要长期稳定高负载、要练 Linux 基本功,选 VM;要少操心、流量忽高忽低、只是放代码或放文件,先试试托管服务和对象存储。拿不准时,按上面几条命令先花几分钟看现状、算笔账,比急着开机稳得多。
最佳实践:安全、备份、监控与成本
在 Google Cloud Platform上的ComputeEngine实践里,先别急着装业务。把“谁能进、坏了怎么恢复、出问题怎么发现、钱怎么不超”四件事定好,后面会少很多半夜救火。打开 Cloud Shell,先选好项目;项目里至少已有一台 VM。下面默认处理列表里的第一台,如果提示没有实例,先建一台再回来。
export PROJECT_ID="$(gcloud config get-value project)"
export VM_NAME="$(gcloud compute instances list --format="value(name)" --limit=1)"
export ZONE="$(gcloud compute instances list --format="value(zone)" --limit=1)"
export REGION="${ZONE%-*}"
gcloud projects add-iam-policy-binding "$PROJECT_ID"
--member="user:$(gcloud config get-value account)"
--role="roles/compute.viewer"
按最小权限配置 IAM。示例先给当前账号“只看”的权限;给同事时把成员换成对方邮箱,需要开关机再单独加权限,别顺手给 Owner/Editor,因为那等于把整个项目交出去。坑:已有 Owner 不会自动变小,要移除多余的高权限角色。
只开放必要端口,禁用密码登录。优先用 SSH 密钥,并把 22 端口限制到当前公网 IP;网站才开 80/443,数据库 3306 不要对公网开放。上面的登录命令会自动用密钥,再把密码登录关掉,避免被暴力猜密码。
export MY_IP="$(curl -s https://ipinfo.io/ip)/32"
gcloud compute firewall-rules create allow-ssh-from-my-ip --network=default --allow=tcp:22 --source-ranges="$MY_IP" --target-tags=ssh-from-my-ip || gcloud compute firewall-rules update allow-ssh-from-my-ip --source-ranges="$MY_IP"
gcloud compute instances add-tags "$VM_NAME" --zone="$ZONE" --tags=ssh-from-my-ip
gcloud compute ssh "$VM_NAME" --zone="$ZONE" --command='sudo sed -i "s/^#?PasswordAuthentication.*/PasswordAuthentication no/" /etc/ssh/sshd_config; grep -q "^PasswordAuthentication no" /etc/ssh/sshd_config || echo "PasswordAuthentication no" | sudo tee -a /etc/ssh/sshd_config; sudo systemctl restart ssh || sudo systemctl restart sshd'
坑:家里宽带公网 IP 会变,变了就重新复制防火墙那一段;不要图省事写 0.0.0.0/0。确认新规则能连上后,再删除默认把 22 开给全网的规则:
gcloud compute firewall-rules delete default-allow-ssh --quiet || echo "默认 SSH 规则不存在,可忽略"
给系统盘做定期快照。快照负责回滚数据,镜像和启动脚本负责“重装 VM 时装回原环境”,两者都留才稳。默认新建 VM 的启动盘名通常与实例同名;改过盘名就先查实际名字再执行。
gcloud compute resource-policies create snapshot-schedule daily-boot-snapshot --region="$REGION" --schedule=daily --start-time=03:00 --max-retention-days=7 --on-source-disk-delete=keep-auto-snapshots || echo "快照策略已存在,可忽略"
gcloud compute disks add-resource-policies "$VM_NAME" --zone="$ZONE" --resource-policies="projects/$PROJECT_ID/regions/$REGION/resourcePolicies/daily-boot-snapshot" || echo "启动盘可能已绑定策略,可忽略"
printf '%sn' '#!/bin/bash' 'apt-get update' 'apt-get install -y nginx' > startup.sh
gcloud compute instances add-metadata "$VM_NAME" --zone="$ZONE" --metadata-from-file=startup-script=startup.sh
gcloud compute images create "rescue-image-$(date +%F)" --source-disk="$VM_NAME" --source-disk-zone="$ZONE" --family=computeengine-practice --force || echo "今天的镜像可能已存在,可忽略"
坑:只做快照、不保存安装步骤,重装后还是会一脸懵;数据库要先停写或另做逻辑备份,快照和镜像也会持续收费,保留天数别设无限。
打开 Cloud Logging 与 Cloud Monitoring。关注 CPU、内存、磁盘、网络和登录日志,才能同时发现跑满、写满、流量异常和异常登录。默认指标通常不含内存,登录日志也要装 Ops Agent 才稳。
gcloud services enable logging.googleapis.com monitoring.googleapis.com
gcloud compute ssh "$VM_NAME" --zone="$ZONE" --command='set -e; curl -sSO https://dl.google.com/cloudagents/add-google-cloud-ops-agent-repo.sh; sudo bash add-google-cloud-ops-agent-repo.sh --also-install; sudo systemctl status google-cloud-ops-agent --no-pager'
坑:告警别只盯 CPU 90%,磁盘快满、网络异常、登录失败暴增更常见。到 Monitoring 仪表盘和日志浏览器按 VM 名称筛选即可。
为 VM 加标签、设预算提醒,闲置实例及时停机,并区分生产与测试项目。标签方便按环境、负责人分摊费用;预算提醒能在超支前发邮件,不是自动关机。
gcloud compute instances update "$VM_NAME" --zone="$ZONE" --labels=env=test,owner=me,cost-center=demo
gcloud billing accounts list
复制上面命令查到结算账号后,在控制台的“结算 > 预算和提醒 > 创建预算”里选项目,设置 50%、90%、100% 邮件提醒。下班前或确认闲置时,才复制这一行:
gcloud compute instances stop "$VM_NAME" --zone="$ZONE"
坑:labels 和防火墙的 network tags 不是一个东西;停机后系统盘、静态 IP、快照仍收费。生产、测试尽量放两个项目,IAM、预算、配额、日志分开,误删测试机才不会伤到生产。
常见问题(FAQ)
小白第一次创建 VM 要选什么配置?
选离用户近的区域、较小机器类型和 Linux 镜像,先练 SSH 登录与停机。
为什么创建后连不上 SSH?
先查防火墙、外部 IP、实例状态和密钥权限,再看系统日志。
VM 一直开着会不会很贵?
会。练习环境用完停机,删除闲置磁盘,并设置预算提醒。
什么时候该换到托管运行服务?
当应用可容器化、流量波动大且不想维护系统时,可考虑托管运行服务。
不想自己折腾 GCP?我们提供云平台代维护、上云迁移与账单代付服务,一对一技术支持。
