它是什么
先别急着回答「為什麼要學 GCP」,先弄清它是什么。GCP 是 Google Cloud 的云平台,把买服务器、装系统、接网络、做运维搬到网上,按需提供计算、存储、网络、数据库、日志与监控等服务。你可以只开一台小机器,也可以让网站、数据库和数据任务一起跑,用多少付多少。
对小白来说,它更像一间按需租用的机房:不用买服务器,也能创建 VM、部署网站、跑数据任务。VM 就是云端的一台虚拟电脑;网站放上去别人能访问,任务跑完结果能存回云端。实体机房坏了要自己修,云上的很多基础维护由平台接管。
常见入口包括 Cloud Console、gcloud 和 SSH:
- Cloud Console:网页控制台,适合点选操作,如看项目、开服务、查账单;打开 console.cloud.google.com 后,新手从右上角 Cloud Shell 开始,它自带 gcloud,少踩本机安装和环境变量的坑。
- gcloud:命令行管理入口,适合重复操作、批量处理和脚本。先做只读查看,是为了确认账号、项目没选错,也避免误开收费资源。
- SSH:连接 Linux 服务器终端,VM 建好后进去装软件、改配置;它不是网盘,也不是另一朵云。
在 Cloud Shell 里,下面这段可以直接复制执行,用来检查工具、账号、当前项目、已有机器和 SSH:
gcloud --version
gcloud auth list
gcloud config get-value project
gcloud projects list
gcloud compute instances list
gcloud compute ssh --help
command -v ssh
为什么先看这些?因为小白最常见的坑是项目选错:在 A 项目里找半天,资源其实在 B 项目;或复制了网上带别人实例名、区域的命令,结果提示找不到。看到权限不足、API 未开启也别慌,通常是需要授权或按提示开启服务。
还有一个坑:创建 VM、数据库、公网 IP 后可能产生费用,不用时别只关浏览器,要回控制台停止或删除;日志与监控顺手看一眼,能发现网站挂了、机器空转。先把它想成可点、可查、可连的云上机房,后面学会稳很多。
解决什么问题
很多小白学 GCP,不是为了背概念,而是为了少折腾:本地电脑跑数据库、压测、构建容易卡;买服务器要等采购和装机;流量涨了,扩容要搬机器;备份靠手动复制,监控靠肉眼看,出问题时连日志和费用都说不清。GCP 把计算、网络、存储、监控、账单放进同一个项目,几分钟开资源,不用就删,正好补上这些运维短板。
先在控制台右上角打开 Cloud Shell,顶部选好已有项目并确认已绑定结算账号;下面整段一次复制执行。它会创建一台小虚拟机、只开网页 80 端口的防火墙、建只读监控服务账号,并列出账单账号和项目绑定情况。
PROJECT_ID="${GOOGLE_CLOUD_PROJECT:-$(gcloud config get-value core/project)}"
if [ -z "$PROJECT_ID" ] || [ "$PROJECT_ID" = "(unset)" ]; then
echo "请先在 Cloud Shell 顶部选择项目"
else
echo "当前项目:$PROJECT_ID"
gcloud config set project "$PROJECT_ID"
gcloud services enable compute.googleapis.com iam.googleapis.com cloudresourcemanager.googleapis.com cloudbilling.googleapis.com
gcloud compute firewall-rules create allow-http-demo --allow=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=http-server --description="Allow HTTP for demo"
gcloud compute instances create demo-gcp-01 --zone=asia-east1-b --machine-type=e2-micro --tags=http-server --image-family=debian-12 --image-project=debian-cloud --boot-disk-size=10GB
gcloud iam service-accounts create demo-reader --display-name="Demo Reader"
gcloud projects add-iam-policy-binding "$PROJECT_ID" --member="serviceAccount:demo-reader@${PROJECT_ID}.iam.gserviceaccount.com" --role="roles/monitoring.viewer"
gcloud billing accounts list
gcloud billing projects describe "$PROJECT_ID"
fi
为什么这么做?生产环境不是“能跑就行”,还要能访问、权限最小、能看监控、能查成本、能清理。学会按量创建资源、配置防火墙、设置 IAM 权限和查看账单后,个人项目也会更像正式生产环境:资源有名字,入口有规则,账号有边界,花钱有记录。
- 坑一:按量不等于免费,虚拟机、磁盘、公网 IP、快照都可能计费;做完要清理,并在控制台结算、账单里看金额明细、设预算提醒。
- 提示没有结算账号、权限不足或默认网络不存在,通常是项目没绑结算、账号权限不够或组织禁用默认 VPC;先确认,别乱加 Owner。
- 防火墙只开 80 给测试网页;别把 22、3389、数据库端口开给 0.0.0.0/0,远程登录要限定来源 IP 或用 IAP。
- IAM 练的是最小权限,示例只给只读监控角色;重复执行看到“已存在”不用慌,先清理或改名再试。
不用时执行下面清理命令,避免一直扣费:
PROJECT_ID="${GOOGLE_CLOUD_PROJECT:-$(gcloud config get-value core/project)}"
if [ -z "$PROJECT_ID" ] || [ "$PROJECT_ID" = "(unset)" ]; then
echo "请先在 Cloud Shell 顶部选择项目"
else
gcloud config set project "$PROJECT_ID"
gcloud compute instances delete demo-gcp-01 --zone=asia-east1-b --quiet
gcloud compute firewall-rules delete allow-http-demo --quiet
gcloud projects remove-iam-policy-binding "$PROJECT_ID" --member="serviceAccount:demo-reader@${PROJECT_ID}.iam.gserviceaccount.com" --role="roles/monitoring.viewer"
gcloud iam service-accounts delete "demo-reader@${PROJECT_ID}.iam.gserviceaccount.com" --quiet
fi
掌握 GCP 后,迁移网站、做灾备、搭建测试环境和理解云原生架构都会更轻松,因为它们复用同一套项目、网络、权限、账单和监控概念;再学负载均衡、自动扩缩容、容器、无服务器,就不是背名词,而是知道它们替你省了哪一步。
怎么上手
还在问「為什麼要學 GCP」的话,别背概念,按先控费、再开机器、最后看日志告警走一遍。先到控制台「结算」建结算账号并绑卡,回 Cloud Shell 复制第一段建独立项目并绑定;接着到「预算和提醒」给这个项目设 10 美元预算、50/90/100% 邮件提醒,最后才开 API。项目 ID 带时间戳,避开「全局唯一、重名失败」;提醒不是熔断,不会自动关机,免费额度也只认指定区域,所以下面用 us-central1-a 的 e2-micro,别随手换区。
PROJECT_ID="gcpok-lab-$(date +%s)"
gcloud projects create "$PROJECT_ID" --name="GCP 上手练习"
BILLING_ACCOUNT_ID="$(gcloud billing accounts list --filter='open=true' --format='value(name)' | head -n 1 | sed 's|billingAccounts/||')"
gcloud billing projects link "$PROJECT_ID" --billing-account="$BILLING_ACCOUNT_ID"
gcloud config set project "$PROJECT_ID"
gcloud config set compute/zone us-central1-a
设完预算再复制这段,只开 Compute、Logging、Monitoring 三个 API。API 多半不扣钱,VM 和磁盘才开始计费,别点「启用全部推荐」。
PROJECT_ID="$(gcloud config get-value project --quiet)"
gcloud services enable compute.googleapis.com logging.googleapis.com monitoring.googleapis.com --project="$PROJECT_ID"
接着开规则和小型 VM。选 Debian 12 是因为教程多、命令好查;22 只放行当前出口 IP,80 才对全网开。最常见的坑是把 tcp:22 也写成 0.0.0.0/0;重跑提示规则已存在就先删旧规则,出口 IP 变了要重取。
PROJECT_ID="$(gcloud config get-value project --quiet)"
MY_IP="$(curl -4 -s https://ifconfig.me | tr -d 'n')"
gcloud compute firewall-rules create gcpok-allow-ssh --project="$PROJECT_ID" --network=default --allow=tcp:22 --source-ranges="${MY_IP}/32" --target-tags=gcpok-lab
gcloud compute firewall-rules create gcpok-allow-http --project="$PROJECT_ID" --network=default --allow=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=gcpok-lab
gcloud compute instances create gcpok-lab-vm --project="$PROJECT_ID" --zone=us-central1-a --machine-type=e2-micro --image-family=debian-12 --image-project=debian-cloud --boot-disk-size=10GB --tags=gcpok-lab
用 SSH 登录,第一次会等几十秒生成密钥;登录后复制下一段,装网页和 Ops Agent,按 Ctrl+D 回 Cloud Shell。没装 Ops Agent,常会疑惑「VM 有日志,Logging 却空的」。
PROJECT_ID="$(gcloud config get-value project --quiet)"
gcloud compute ssh gcpok-lab-vm --project="$PROJECT_ID" --zone=us-central1-a --quiet
sudo apt-get update -y
sudo apt-get install -y nginx curl
printf '%sn' '<h1>Hello GCP from gcpok-lab</h1>' | sudo tee /var/www/html/index.html
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 restart google-cloud-ops-agent
sudo systemctl status google-cloud-ops-agent --no-pager
echo "$(date) hello from Cloud Logging" | sudo tee -a /var/log/syslog
回 Cloud Shell 用 Cloud Logging 查日志,等 1~2 分钟,延迟正常。
PROJECT_ID="$(gcloud config get-value project --quiet)"
gcloud logging read 'resource.type="gce_instance" AND textPayload:"hello from Cloud Logging"' --limit=10 --project="$PROJECT_ID" --format='value(textPayload)'
指标和告警用界面更稳:Cloud Monitoring 的 Metrics Explorer 看 VM Instance / CPU utilization;告警政策设同一指标大于 0.8、持续 5 分钟、通知邮箱,邮箱没验证会以为告警坏了。
收尾别忘:停机仍收磁盘费,预算提醒也不替你关机,删掉才干净。
PROJECT_ID="$(gcloud config get-value project --quiet)"
gcloud compute instances delete gcpok-lab-vm --project="$PROJECT_ID" --zone=us-central1-a --quiet
gcloud compute firewall-rules delete gcpok-allow-ssh gcpok-allow-http --project="$PROJECT_ID" --quiet
与替代方案对比
判断「为什么要学 GCP」,别背产品名,先看它替代了什么:差别本质是「谁管机器」和「你要懂多少规则」。
- 自建物理机:要采购、找机房、上架、接电接网,还要做硬件维护,硬盘坏了也得换;GCP 省去这些,点几下就有资源。代价是学 IAM 权限、VPC/防火墙和计费规则:谁能开机、端口怎么放行、哪些按时间或流量收钱,都要看清。
- 传统虚拟主机:放小网站省事,流量一冲容易卡。GCP 的弹性伸缩、全球网络、托管数据库和运维观测(日志、监控、告警)更强;配置也更复杂:区域、子网、服务账号、告警策略都要配,因为能力被拆成多个服务,彼此要联网和授权。
- 其他云厂商:不必站队。GCP 在数据分析、容器、网络上有特色,如 BigQuery、GKE、全球 VPC 和负载均衡;新手先看免费额度、官方文档和长期成本。
为什么先做只读检查?云上最怕登录错账号、选错项目;一旦创建 VM、公网 IP、磁盘或托管数据库,没买硬件也可能计费。复制到控制台右上角的 Cloud Shell(或 macOS/Linux 终端),它只看配置,不建资源:
if command -v gcloud >/dev/null; then
gcloud --version
gcloud auth list
gcloud config list
gcloud config configurations list
else
echo "还没有安装 Google Cloud CLI;先安装它,再复制本段执行。"
fi
看到公司账号、生产项目或陌生配置名,先停。再按顺序做:
- 搜「免费额度」,分清始终免费和试用金,注意区域、机型、每月用量。
- 看官方文档 Quickstart,只做最小例子,别照搬生产架构。
- 在「预算和提醒」设邮件提醒,用「定价计算器」把开机时长、磁盘、公网 IP、出网流量、查询量、日志留存算进长期成本。
小白坑:免费不等于无限免费;随手给 Owner;防火墙写成 0.0.0.0/0;练完忘记关机、删 IP 或删数据库;只看首月价格。先确认账号、项目、额度和预算,再创建资源,才不会第一节课就收到账单。
最佳实践
先把三件事变成习惯:权限给少、钱看得见、操作能复现。第一次练习请在同一台电脑打开终端,先跑下面这段。gcloud init 会让你登录并选择项目;后面命令只作用于当前项目,能避开小白最常见的坑:选错项目,把改动做进生产环境。
gcloud init
PROJECT_ID="$(gcloud config get-value project)"
gcloud services enable iam.googleapis.com compute.googleapis.com logging.googleapis.com --project="$PROJECT_ID"
gcloud iam service-accounts create app-runner --display-name="app runner" || true
SA_EMAIL="app-runner@${PROJECT_ID}.iam.gserviceaccount.com"
gcloud projects add-iam-policy-binding "$PROJECT_ID" --member="serviceAccount:${SA_EMAIL}" --role="roles/logging.logWriter"
printf '%s' "输入团队 Google 群组邮箱;没有就按回车跳过: "
read -r GROUP_EMAIL
if [ -n "$GROUP_EMAIL" ]; then gcloud projects add-iam-policy-binding "$PROJECT_ID" --member="group:${GROUP_EMAIL}" --role="roles/viewer"; fi
gcloud projects get-iam-policy "$PROJECT_ID" --flatten="bindings[].members" --format="table(bindings.role,bindings.members)"
按最小权限,程序用独立服务账号,只给 roles/logging.logWriter;团队人用 Google 群组统一给 roles/viewer,加减人只改群组,不一个个改 IAM。别把 roles/owner 或 roles/editor 长期挂在个人 Gmail 上;上面最后一条会打印现有权限,看到 user:xxx@gmail.com 拿高权限就该收。群组邮箱必须是真群组,普通 Gmail 填进去会失败。
PROJECT_ID="$(gcloud config get-value project)"
SA_EMAIL="app-runner@${PROJECT_ID}.iam.gserviceaccount.com"
KEY_FILE="$HOME/app-runner-key-$(date +%Y%m%d%H%M%S).json"
gcloud iam service-accounts keys create "$KEY_FILE" --iam-account="$SA_EMAIL"
echo "新密钥已保存到 $KEY_FILE"
gcloud iam service-accounts keys list --iam-account="$SA_EMAIL" --format="table(name,validAfterTime,validBeforeTime)"
printf '%s' "确认新密钥已在程序里生效后,粘贴旧密钥 ID: "
read -r OLD_KEY_ID
OLD_KEY_ID="${OLD_KEY_ID##*/}"
if [ -n "$OLD_KEY_ID" ]; then gcloud iam service-accounts keys delete "$OLD_KEY_ID" --iam-account="$SA_EMAIL" --quiet; fi
密钥轮换顺序别反:先生成新密钥,把程序配置换成新文件并观察一段时间,再删旧密钥;直接删旧密钥会让服务马上挂。密钥 JSON 不要发群、不要提交 Git,能不用就尽量不用。
费用上,别一慢就升 CPU/内存,控制费用比盲目升配更重要。先给资源贴 env、owner、cost 标签,再到控制台「结算里的预算和提醒」建预算告警,金额填你能接受的上限,50%、90%、100% 都发邮件给自己。每周跑一次下面命令;users 为空的磁盘、很久没人用的快照,确认不是唯一备份后再删,删除不可恢复。
PROJECT_ID="$(gcloud config get-value project)"
printf '%s' "输入要补标签的磁盘名;没有就按回车: "
read -r DISK_NAME
printf '%s' "输入该磁盘可用区,例如 asia-east1-b: "
read -r DISK_ZONE
if [ -n "$DISK_NAME" ]; then gcloud compute disks add-labels "$DISK_NAME" --zone="$DISK_ZONE" --labels="env=lab,owner=beginner,cost=watch"; fi
printf '%s' "输入要补标签的快照名;没有就按回车: "
read -r SNAP_NAME
if [ -n "$SNAP_NAME" ]; then gcloud compute snapshots add-labels "$SNAP_NAME" --labels="env=lab,owner=beginner,cost=watch"; fi
gcloud compute disks list --format="table(name,zone.basename(),sizeGb,users,labels.list())"
gcloud compute snapshots list --format="table(name,diskSizeGb,creationTimestamp,labels.list())"
printf '%s' "确认后粘贴要删除的闲置磁盘名;不删就按回车: "
read -r DEL_DISK
if [ -n "$DEL_DISK" ]; then
printf '%s' "再输入它的可用区: "
read -r DEL_ZONE
gcloud compute disks delete "$DEL_DISK" --zone="$DEL_ZONE" --quiet
fi
printf '%s' "确认后粘贴要删除的旧快照名;不删就按回车: "
read -r DEL_SNAP
if [ -n "$DEL_SNAP" ]; then gcloud compute snapshots delete "$DEL_SNAP" --quiet; fi
最后,把常用操作写成 gcloud 脚本和文档,别靠记忆。下面会生成 gcp-runbook.md 和 daily-check.sh,把默认日志保留 30 天,并立即跑一遍检查。监控在控制台「监控」里给 CPU、错误日志、预算邮件设提醒;每月按文档做一次「从快照恢复测试机」演练。只备份不演练,是小白最容易忽略的坑:真出事才发现快照没权限、脚本没人会跑。这样能减少手滑和故障恢复时间。
PROJECT_ID="$(gcloud config get-value project)"
printf '%sn' '1. 发布前:gcloud config list 确认项目。' '2. 备份:给系统盘做快照,记录快照名、时间、负责人。' '3. 检查:运行 ./daily-check.sh,看 CPU、错误日志、预算邮件。' '4. 恢复演练:每月用最近快照创建测试盘,记录能否挂载和耗时。' '5. 收尾:删掉临时资源,确认预算告警仍然开启。' | tee gcp-runbook.md
printf '%sn' '#!/usr/bin/env bash' 'set -e' 'PROJECT_ID="$(gcloud config get-value project)"' 'gcloud config list' 'gcloud logging read "severity=ERROR" --limit=20 --format="table(timestamp,textPayload)" --project="$PROJECT_ID"' 'gcloud compute disks list --format="table(name,zone.basename(),sizeGb,users,labels.list())"' 'gcloud compute snapshots list --format="table(name,diskSizeGb,creationTimestamp,labels.list())"' | tee daily-check.sh
chmod +x daily-check.sh
./daily-check.sh
gcloud logging buckets update _Default --location=global --retention-days=30 --project="$PROJECT_ID"
常见问题(FAQ)
零基础学 GCP 要先学 Linux 吗?
建议先会少量 Linux 命令和 SSH 登录,再边做 VM 边补网络、权限与账单概念。
学 GCP 会不会很贵?
先用免费额度和预算提醒,从小规格 VM 开始,用完及时停用或删除测试资源。
只做个人网站也需要学 GCP 吗?
如果只想省事,可用托管平台;想理解部署、监控、备份和扩容,GCP 很适合练手。
GCP 与其他云该先学哪个?
先学云的核心概念更重要,再按工作需求选择;概念通了,迁移到别的云会更快。
不想自己折腾 GCP?我们提供云平台代维护、上云迁移与账单代付服务,一对一技术支持。
