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

GCP 实作案例入门

TL;DR:用一台 Linux VM 串起建项目、配权限、部署网站、看日志和控成本,带小白读懂可复用的 GCP 实作案例。

它是什么:一个能照着做的 GCP 实作案例

把这个 GCP 实作案例 想成「搭一个最小但真能跑的网站」:一台 Compute Engine VM 跑 Linux 和 Nginx 负责出网页,再用 Cloud Storage 存一份配置与首页的压缩包当备份。不碰数据库、不碰负载均衡,就这两块,已经是最小的可运行网站架构。

动手前先认名词,比急着点控制台更稳。案例里的项目(记资源的账本)、VPC(VM 待的私有网络)、防火墙(决定 80 端口让不让进)、IAM(决定 VM 能不能写备份桶)、公网 IP(浏览器要访问的地址),全都是 GCP 资源,不是你本机的东西。小白最常踩的坑:Nginx 明明绿了,却忘了开防火墙,浏览器一直转圈;或者没留意当前项目,资源建到别处还到处找。

装好 gcloud 并登录后,下面直接复制。另一个坑:从没选过项目的话第一行会取到空值,先跑一次 gcloud init 再回来贴。固定区域是为了后面少写一堆 --zone,顺手开 API 则能避开「服务未启用」的红字:

export PROJECT_ID=$(gcloud config get-value project)
export ZONE=asia-east1-b
gcloud config set compute/zone $ZONE
gcloud services enable compute.googleapis.com storage.googleapis.com

接着建 VM、开端口、建桶,最后把公网 IP 打出来。为什么桶名要拼项目 ID?因为 Cloud Storage 桶名全球唯一,只叫 backup 必定被占用:

gcloud compute instances create web-demo 
  --machine-type=e2-micro 
  --image-family=debian-12 
  --image-project=debian-cloud 
  --tags=http-server 
  --boot-disk-size=10GB

gcloud compute firewall-rules create allow-http 
  --allow=tcp:80 --target-tags=http-server

gcloud storage buckets create gs://$PROJECT_ID-web-backup --location=asia-east1

gcloud compute instances describe web-demo --zone=$ZONE 
  --format='get(networkInterfaces[0].accessConfigs[0].natIP)'

把 IP 贴进浏览器前,先装 Nginx 并做第一次备份。--tags=http-server 必须和防火墙的 --target-tags 一模一样,写错就白开;备份直接借用 VM 自带的 IAM 身份写桶,不用传密钥,更安全:

gcloud compute ssh web-demo --zone=$ZONE --command="
  sudo apt-get update -qq &&
  sudo apt-get install -y nginx &&
  echo '<h1>我的第一个 GCP 站点</h1>' | sudo tee /var/www/html/index.html &&
  sudo systemctl enable --now nginx &&
  sudo tar czf /tmp/web.tgz /etc/nginx /var/www/html &&
  sudo chmod 644 /tmp/web.tgz &&
  gcloud storage cp /tmp/web.tgz gs://$PROJECT_ID-web-backup/
"

刷新看到标题就跑通了。但你拿到的不只是一个网页:「定项目 → 开网络 → 配权限 → 部署 → 留备份」这条顺序,本身就是一套运维流程。下次做测试环境,或给小型业务搭个落地页,把 web-demo 换个名字、区域一改,原样再贴一遍就能复用,不用重新摸一遍控制台。

解决什么问题:把抽象概念变成可验证结果

新手常是「文档都懂」:VPC、IAM、防火墙、虚拟机都能解释,一打开控制台却不知道先点哪里。一个「GCP 實作案例」不先背名词,而是排成一条能看见结果的路:建小机器、SSH 登录、安装 Nginx、开放 80 端口、查看访问页。最后看到 Welcome to nginx! 或 200 OK,就说明网络、权限、服务一起过关;哪步失败就查哪步。

在控制台右上角打开 Cloud Shell(已替你登录),确认顶部项目选对,再整段复制下面命令。它会启用 API、建 e2-micro、打标签、开 80,并通过 SSH 安装 Nginx;随后输出地址、发请求、读日志、建每日快照。把「访问页」后的地址贴到浏览器即可。标签别删:防火墙只作用于带 http-server 标签的实例,删了常见结果就是「有公网 IP,网页打不开」。

set -e
ZONE="asia-east1-b"
REGION="asia-east1"
VM="gcpok-demo-web"
TAG="http-server"

gcloud services enable compute.googleapis.com logging.googleapis.com monitoring.googleapis.com
gcloud compute instances create "$VM" --zone="$ZONE" --machine-type=e2-micro --image-family=debian-12 --image-project=debian-cloud --tags="$TAG" --labels=env=demo,cost=gcpok
gcloud compute firewall-rules create allow-http-80 --allow=tcp:80 --target-tags="$TAG" --description="Allow HTTP on port 80"
gcloud compute ssh "$VM" --zone="$ZONE" --quiet --command='set -e; sudo apt-get update; sudo apt-get install -y nginx; sudo systemctl enable --now nginx'
sleep 10
IP=$(gcloud compute instances describe "$VM" --zone="$ZONE" --format='get(networkInterfaces[0].accessConfigs[0].natIP)')
echo "访问页:http://$IP"
curl -I "http://$IP"
gcloud logging read 'resource.type="gce_instance"' --limit=5 --format='value(textPayload,jsonPayload.message)'
gcloud compute resource-policies create snapshot-schedule gcpok-daily-snapshot --region="$REGION" --schedule=daily --start-time=23:00 --max-retention-days=7
gcloud compute disks add-resource-policies "$VM" --resource-policies=gcpok-daily-snapshot --zone="$ZONE"

为什么这样验?SSH 成功只证明能登录,不代表 80 通;Nginx 启动只证明本机服务正常,不代表外部能访问;最后一条请求返回 HTTP/1.1 200 OK,才是网络放行、权限够用、服务在跑。小白易踩坑:把 http 写成 https、项目选错、没等防火墙生效、重复粘贴报「资源已存在」、没权限还乱改角色。报错先看 API、配额和 IAM,别盲目重试。

维护要在案例一开始就写进验收清单,避免只会上线不会维护:

  • 费用:先在「结算」的「预算与提醒」设小额预算和邮件提醒,练习完清理资源。
  • 日志:上面的日志读取命令先看实例操作记录,应用日志后续装 Ops Agent。
  • 告警:在「监控」的「提醒」建 CPU、磁盘、网页可用性告警并填邮箱。
  • 备份:每日快照保留 7 天,同时写清恢复步骤。

练习完执行清理;若提示不存在可忽略,若已生成快照还要到快照页删除,否则会继续计费:

gcloud compute disks remove-resource-policies gcpok-demo-web --resource-policies=gcpok-daily-snapshot --zone=asia-east1-b --quiet
gcloud compute instances delete gcpok-demo-web --zone=asia-east1-b --quiet
gcloud compute firewall-rules delete allow-http-80 --quiet
gcloud compute resource-policies delete gcpok-daily-snapshot --region=asia-east1 --quiet

怎么上手:从零到可访问页面

先做项目、预算、API,再开 VM,顺序别反:没绑账单或没启用 Compute Engine API,创建实例会直接报错。下面整段在 Cloud Shell 复制执行;项目 ID 全局唯一,所以用时间戳,别改成中文、空格或大写。没有账单账号先去控制台开通结算;若提示权限不足,换有「结算管理员」权限的账号。

gcloud billing accounts list
export BILLING_ACCOUNT_ID="$(gcloud billing accounts list --format='value(name)' --limit=1 | sed 's#billingAccounts/##')"
export PROJECT_ID="gcpok-demo-$(date +%s)"
gcloud projects create "$PROJECT_ID" --name="GCP Case Demo"
gcloud billing projects link "$PROJECT_ID" --billing-account="$BILLING_ACCOUNT_ID"
gcloud config set project "$PROJECT_ID"

然后到控制台「结算 > 预算和提醒」建预算:金额填能接受的上限,阈值勾 50%、90%、100% 邮件提醒。预算提醒只是提前喊你,不会自动停机;VM 开着就计费,这是小白最常忘的坑。

gcloud services enable compute.googleapis.com

API 生效可能等几十秒。这个最小 GCP 實作案例里,用户在亚洲先选 asia-east1-b(台湾),近就延迟低;e2-micro 便宜,静态页够用;Ubuntu 22.04 LTS 资料多。注意免费额度不是全球都有,亚洲区多按量计费,所以别跳过预算。

export ZONE="asia-east1-b"
export REGION="asia-east1"
export VM_NAME="web-demo"
gcloud compute networks create demo-vpc --subnet-mode=custom
gcloud compute networks subnets create demo-subnet --network=demo-vpc --region="$REGION" --range=10.0.0.0/24
gcloud compute firewall-rules create demo-allow-ssh --network=demo-vpc --allow=tcp:22 --source-ranges="$(curl -fsS https://api.ipify.org || curl -fsS https://ipinfo.io/ip)/32" --target-tags=web-demo
gcloud compute firewall-rules create demo-allow-http --network=demo-vpc --allow=tcp:80 --source-ranges=0.0.0.0/0 --target-tags=web-demo
gcloud compute instances create "$VM_NAME" --zone="$ZONE" --machine-type=e2-micro --image-family=ubuntu-2204-lts --image-project=ubuntu-os-cloud --network=demo-vpc --subnet=demo-subnet --tags=web-demo

这里新建自定义 VPC,不用 default 网络,是因为 default 自带多条规则;我们只放 tcp:22、tcp:80,不放通全部端口。查公网 IP 要和后面 SSH 在同一环境跑,否则来源写错;换 Wi-Fi 也会连不上,要更新来源。HTTP 必须对 0.0.0.0/0 开。标签 web-demo 忘填,规则不生效;重跑报「已存在」就先删同名资源。控制台建 VM 路径是「Compute Engine > 虚拟机实例 > 创建实例」,参数照抄;登录仍用下面命令,浏览器 SSH 按钮可能被当前 IP 规则挡住。

gcloud compute ssh "$VM_NAME" --zone="$ZONE" --command='sudo apt-get update && sudo apt-get upgrade -y && sudo apt-get install -y nginx && echo "<h1>你好,GCP 實作案例</h1>" | sudo tee /var/www/html/index.html > /dev/null && sudo systemctl enable --now nginx && sudo systemctl is-active nginx'

这条是远程登录后更新软件包、装 Nginx、写首页并启动服务,不是在你自己电脑上装。看到输出 active 才算成功;若卡在 apt,多半是 API 或网络还没好,等一会重试。

gcloud compute ssh "$VM_NAME" --zone="$ZONE" --command='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 tee /etc/google-cloud-ops-agent/config.yaml > /dev/null <<EOF
logging:
  receivers:
    nginx_access:
      type: nginx_access
    nginx_error:
      type: nginx_error
  service:
    pipelines:
      nginx:
        receivers:
          - nginx_access
          - nginx_error
EOF
sudo systemctl restart google-cloud-ops-agent'

Cloud Logging 默认不自动收集 Nginx 的 access.log,所以装 Ops Agent 并指定 Nginx 接收器;日志通常有 1~2 分钟延迟,下面先等一分钟再读。

export EXTERNAL_IP="$(gcloud compute instances describe "$VM_NAME" --zone="$ZONE" --format='value(networkInterfaces[0].accessConfigs[0].natIP)')"
echo "浏览器打开:http://$EXTERNAL_IP"
curl -I "http://$EXTERNAL_IP"
sleep 60
gcloud logging read "logName="projects/$PROJECT_ID/logs/nginx_access" OR logName="projects/$PROJECT_ID/logs/nginx_error"" --limit=20 --format="table(timestamp,textPayload)" --project="$PROJECT_ID"

看到 HTTP/1.1 200 OK 就说明外部 IP 可访问;也可在「Logging > 日志浏览器」选 GCE VM 看同样记录。curl 超时先查 80 规则和 Nginx 状态;读完别忘停止或删除实例,别让账单偷偷跑。

与替代方案对比:什么时候别用 VM

先说结论:VM 不是「更高级的部署」,而是「给你一台完整 Linux」。学系统用它合适;只把网站或 API 放上线,常有更省心的选择。

和 Cloud Run 比,VM 能 SSH 进去看进程、改端口、重启服务,最贴近 Linux 运维教学,适合练「服务起没起、端口通不通」。在 Debian/Ubuntu 镜像的 SSH 窗口先复制这两条观察,别急着重启:

sudo systemctl status ssh
sudo ss -tulpen

第一条看 SSH 服务状态,第二条看监听端口。常见坑:机器里开了 80,浏览器仍打不开,因为 GCP 还有一层 VPC 防火墙。Cloud Run 则反过来,你只给镜像,平台管机器和扩容,更适合无服务器部署;所以别为简单接口开台 VM 长跑,忘关就一直按量计费。

和本地虚拟机比,GCP 的公网 IP、快照备份、权限审计都现成。先确认当前项目,再列实例、快照和 IAM:

gcloud config list
gcloud compute instances list
gcloud compute snapshots list --limit=5
gcloud projects get-iam-policy "$(gcloud config get-value project)"

第二条命令会显示 ZONE、EXTERNAL_IP、STATUS;看到 RUNNING 就要记得关停实例。快照列表确认备份真建过,IAM 策略看「谁能进机器」。坑:点「停止」多半只停 CPU,磁盘仍收费;没设 project 时先跑第一行,别审计错账号。

和 AWS、Azure 同类 VM 比,GCP 控制台和 gcloud 上手更简洁,查网络、镜像、防火墙基本一条命令:

gcloud compute networks list
gcloud compute images list --limit=5
gcloud compute firewall-rules list

迁移别照搬:安全组、NSG 和 GCP 防火墙不是一回事,镜像家族、默认网络、IAM 写法也不同。先看防火墙的 ALLOWED 列,再配合前面的 IAM 策略逐项核对,别把旧脚本原样复制过来跑。

最佳实践:上线后也要省心

常见问题(FAQ)

没有 Linux 基础能完成这个 GCP 实作案例吗?

可以,先照命令操作,再理解用户、权限、端口和服务四个概念即可。

练习会产生很多费用吗?

选低规格 VM、设置预算提醒,练完关停或删除资源,通常成本可控。

一定要用 gcloud 吗?

不必须,控制台更直观;熟悉后用 gcloud 更适合重复和自动化。

网站上线前还要做什么?

至少补上 HTTPS、域名、备份、监控告警和最小权限检查。

VM 和 Cloud Run 怎么选?

想学 Linux 运维选 VM;只想快速托管代码选 Cloud Run。

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

查看代维服务 →

发表评论