GCP帳號註冊服務 GCP Kubernetes集群搭建入門教程:利用 GKE 快速部署容器化應用

谷歌雲GCP / 2026-09-01 14:36:10

第一章:为什么是 GKE,什么是你真正要搭建的东西

GCP帳號註冊服務 很多人第一次接触 Kubernetes,会把它想成“一套很复杂的工具”。其实你要搭建的并不是“工具”,而是一套可以稳定运行容器应用的基础设施:把容器放进集群,让它在故障时自动恢复,在流量来临时自动伸缩,还能用声明式方式持续更新。

在 GCP 上,最省心的选择就是 GKE(Google Kubernetes Engine)。你不需要自己手工管理控制平面,也不必处理底层节点的复杂性。你只要完成几个关键决策:选地区与网络、确定节点规模、准备容器镜像、编写 Kubernetes 资源并部署。

把目标说得更具体一点:你将完成以下结果。

  • 在 GCP 创建一个可运行的 GKE 集群
  • 部署一个示例容器化应用(例如 Web 服务)
  • 通过 Ingress 或 Service 将它对外暴露并验证访问
  • 理解日志、伸缩与滚动更新的基本操作

接下来我们一步一步做。你不需要先懂全部 Kubernetes 概念,但你需要愿意在每一步之后确认“发生了什么”。

第二章:准备工作——账号、项目、权限与本地环境

开始前,先确认你有一个有效的 GCP 账号和项目。建议每个练习用一个独立项目,方便管理配额与资源清理。

2.1 开启必要的 API

通常你会用到这些能力:

  • Kubernetes Engine API
  • Compute Engine API(因为节点在计算层面运行)
  • Container Registry 或 Artifact Registry(用于存放镜像)
  • Load Balancing 等(取决于你如何对外暴露应用)

GCP帳號註冊服務 在 GCP 控制台的“API 与服务”里开通即可。虽然具体名称可能随时间调整,但大方向一致。

2.2 获取所需权限

最初你可以用较宽松的权限快速跑通流程。等你确认一切稳定后,再收紧权限。

建议至少具备:

  • 创建和管理 GKE 集群的权限
  • GCP帳號註冊服務 读取/写入镜像仓库的权限(如果你要推送镜像)
  • 查看与管理网络相关资源的权限(与负载均衡有关)

2.3 安装本地工具

你至少需要:

  • gcloud CLI
  • kubectl

GCP帳號註冊服務 安装后,你要做一件事:登录并设置默认项目。

在终端执行类似命令(示意):

gcloud auth login
gcloud config set project 你的项目ID

然后你要准备好容器镜像。镜像可以来自你本地构建,也可以来自现成示例仓库。本文以你自己构建一个简单 Web 应用为例,便于理解整个链路。

第三章:创建 GKE 集群——把关键选项想明白

在 GKE 的创建过程中,你会遇到很多选项。对新手来说,并不是每个都要追到最细;但以下几个决策必须做清楚:集群模式、网络与节点规模。

3.1 选择区域:Regional 还是 Zonal

Zonal 集群更简单,部署在单个可用区;Regional 集群会跨多个可用区,更抗故障。新手学习阶段可以从 Zonal 开始,但如果你计划对外提供服务,Regional 更稳。

如果你不确定,优先选 Regional(代价是资源与成本略高)。

3.2 网络:默认 VPC 还是自定义

你可以用默认 VPC 快速跑通流程。自定义网络适合你有更严格的隔离或复杂路由需求。

对入门教程来说,使用默认 VPC 更快。关键点在于:你要理解后续对外访问需要负载均衡与 Ingress 配置,网络要能通。

3.3 节点:数量与机器规格

节点数决定可承载的工作负载。你只部署一个示例应用的话,最小配置通常就够。

建议先这样设定:

  • GCP帳號註冊服務 节点最小 1,最大 3(如果你用自动伸缩)
  • 机器类型选一个通用小规格

当你准备扩展时,再根据 CPU/内存使用率调整。

3.4 工作负载身份与安全性(可先默认,但要知道它在做什么)

GKE 在安全方面支持“工作负载身份”(Workload Identity),可以让 Pod 使用更安全的方式访问 Google 服务,减少对长效密钥的依赖。

新手阶段你可能直接使用默认方案也能成功部署。但你要有意识:如果你后续要读写镜像仓库、访问数据库,最好走更安全的身份机制。

3.5 创建并获取集群凭据

集群创建完成后,使用 gcloud 获取 kubectl 可用的凭据。

gcloud container clusters get-credentials 你的集群名 --region 你的区域

接着验证:

kubectl get nodes

你会看到节点列表。看到节点正常 Ready,说明基础层就绪。

第四章:准备容器镜像——让应用从“能跑”到“能部署”

Kubernetes 不是神秘的魔法,它只是让“容器”在集群上运行。你要先把容器镜像准备好,并确保集群可以拉取它。

4.1 一个最简单的示例应用

你可以用任何语言写一个简单 HTTP 服务,例如输出“Hello”。Dockerfile 的关键是:让容器监听 8080(或你自定义端口),并保持前台运行。

如果你用 Node.js/Express、Python/Flask、Go,都可以。本文不拘泥语言,重点放在后面的 Kubernetes 资源。

4.2 构建并推送镜像到镜像仓库

GCP帳號註冊服務 镜像仓库可以用 Artifact Registry。推送流程大同小异:

  • 在仓库创建一个 repo
  • 构建本地镜像
  • 标记镜像 tag
  • 推送到仓库

一个典型流程示意:

docker build -t <镜像名>:v1 .
docker tag <镜像名>:v1 <仓库URL>/<镜像名>:v1
docker push <仓库URL>/<镜像名>:v1

推送成功后,你需要记录镜像完整地址。后续 Kubernetes Deployment 会引用它。

4.3 镜像拉取失败怎么办

新手最常见的坑之一:镜像仓库权限没配好,导致 Pod 一直 Pending 或 ImagePullBackOff。

你可以通过以下思路排查:

  • 检查镜像地址是否拼写正确
  • 检查镜像仓库是否存在于同一项目/权限范围
  • 检查服务账号(ServiceAccount)是否有拉取镜像的权限

如果你启用了 Workload Identity,要确认映射关系正确。

第五章:部署应用到 GKE——从 Deployment 到对外访问

部署应用时,你需要三件套:Deployment(管理副本与滚动更新)、Service(提供稳定网络访问)、Ingress 或 LoadBalancer(对外暴露)。

5.1 编写 Deployment:声明你要跑什么

Deployment 的核心是:指定副本数、容器镜像、容器端口,以及可选的资源请求与探针。

下面给一个示例(你把镜像地址替换成你的即可)。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-demo
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-demo
  template:
    metadata:
      labels:
        app: web-demo
    spec:
      containers:
      - name: web
        image: <你的镜像地址>
        ports:
        - containerPort: 8080

解释一下它在做什么:

  • replicas: 2:确保同时运行两个副本
  • selector / matchLabels:让 Deployment 找到它管理的 Pod
  • template.labels:Pod 上会打上 app=web-demo,Service 会用这个标签选中它
  • containerPort:说明容器监听的端口,便于 Service 转发

5.2 应用探针:让“健康”这件事变得可控

入门时你可以先不加探针,但你很快会遇到一个现实:服务不一定永远在“就绪状态”。探针能让 Kubernetes 知道何时可以接流量。

推荐做两种探针:

  • livenessProbe:判断容器是否卡死,需要重启
  • readinessProbe:判断容器是否准备好接收请求

示例(你按自己的路径调整):

        readinessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 5
          periodSeconds: 10
        livenessProbe:
          httpGet:
            path: /health
            port: 8080
          initialDelaySeconds: 15
          periodSeconds: 20

记得让应用真的提供 /health 返回 200,否则会一直“未就绪”。

5.3 创建 Service:让 Pod 有“门牌号”

Pod 是短暂的。你不能直接让外部流量随机打到某个 Pod IP 上。Service 提供一个稳定的访问入口,并把流量转发给匹配标签的 Pod。

创建一个 ClusterIP 类型的 Service(内部可访问):

apiVersion: v1
kind: Service
metadata:
  name: web-demo-svc
spec:
  selector:
    app: web-demo
  ports:
  - name: http
    port: 80
    targetPort: 8080
  type: ClusterIP

说明:

  • selector:选择 app=web-demo 的 Pod
  • port 80:Service 对外端口
  • targetPort 8080:转到容器实际端口

5.4 部署:kubectl apply 与验证

把 Deployment 和 Service 保存为 YAML 文件,然后执行:

kubectl apply -f deployment.yaml
kubectl apply -f service.yaml

验证副本是否就绪:

kubectl get pods
kubectl get deploy
kubectl describe pod <pod名>

如果 Pod 一直重启,重点看容器日志:

kubectl logs <pod名>

日志是定位问题最快的方式。

5.5 对外暴露:用 Ingress 走 HTTP 入口

当你要从集群外访问应用时,常见方式是 Ingress(结合负载均衡)。新手阶段你可以把 Ingress 配置当成“告诉集群:哪些域名/路径要转发到哪个 Service”。

Ingress 示例(取决于你是否使用 GCE/GKE Ingress Controller 以及 IngressClass)。先给一个通用思路:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: web-demo-ing
spec:
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: web-demo-svc
            port:
              number: 80

部署 Ingress:

kubectl apply -f ingress.yaml

验证是否拿到外部地址:

kubectl get ingress

如果 external IP 或 hostname 还没出现,通常是资源创建/负载均衡还在配置中。你可以持续等待几分钟。

5.6 最小可行路径:从“能部署”到“能访问”

你最终需要确认两件事:

  • 浏览器能访问到你的服务(返回预期内容)
  • Ingress 转发到 Service,再转发到 Pod(可以通过服务日志或访问日志验证)

如果访问失败,优先查 Ingress、Service 端口映射是否正确,再查 Pod 是否就绪、探针是否导致流量被排除。

第六章:滚动更新与版本管理——把“改代码”变成“改配置”

当你更新应用时,你最不想看到的是:把整个集群推倒重来。Kubernetes 的优势之一就是滚动更新。

6.1 更新镜像并触发滚动更新

假设你把镜像从 v1 推送为 v2,那么 Deployment 的 image tag 更新即可。

GCP帳號註冊服務 两种方式:

  • 手动编辑 YAML 后 apply
  • 用 kubectl set image 快速替换

示例(把容器名与镜像替换成你的实际值):

kubectl set image deployment/web-demo web=<你的镜像地址>:v2

然后观察滚动状态:

kubectl rollout status deployment/web-demo
kubectl get pods -w

你会看到 Pod 一批一批更新,旧 Pod 不会立刻消失,直到新 Pod 就绪。

6.2 必须掌握的回滚

更新失败时你要能快速回退。Kubernetes 保留了 rollout 历史。

kubectl rollout history deployment/web-demo
kubectl rollout undo deployment/web-demo

这对生产环境非常关键。即使你现在只是做入门,也要养成习惯。

6.3 版本与不可变镜像(Tag 设计)

GCP帳號註冊服務 建议使用不可变镜像标签策略:v1、v2 或带 git commit 的短 hash。不要只用 latest 这种标签,否则回滚与定位会变得困难。

当你需要可追溯性,镜像名和版本规划比你想象的重要。

第七章:监控与日志——你需要的是“可定位问题”的能力

部署能跑是第一步,真正让你活得轻松的是监控与日志。GKE 与 Cloud Monitoring、Cloud Logging 集成,能把日志和指标统一起来。

7.1 先用 kubectl 定位,再接入控制台看全局

你可以先用:

  • kubectl logs 看容器输出
  • kubectl describe 看事件与状态
  • kubectl get events 查看最近事件

例如:

kubectl describe pod <pod名>
kubectl get events --sort-by=.metadata.creationTimestamp

这些信息能告诉你:是拉镜像失败、探针失败,还是资源调度问题。

GCP帳號註冊服務 7.2 在业务层加入健康检查与可观测性

别把健康检查做成形式主义。/health 应该真实反映依赖是否可用。比如数据库连接失败,就返回非 200,让流量不要打到一个“假活着”的实例。

同时,在应用层输出结构化日志(即使是简单 JSON),将请求路径、状态码、耗时记录下来。后续排障会少掉大量猜测。

GCP帳號註冊服務 第八章:伸缩与资源管理——从“能跑”到“跑得稳、成本可控”

当流量增长,你不希望手工加节点。Kubernetes 提供自动伸缩能力,你要理解它背后的逻辑。

8.1 Horizontal Pod Autoscaler(HPA)基础理解

HPA 根据指标(如 CPU 利用率或自定义指标)调整 Deployment 的副本数。

它解决的问题是:实例数量跟随负载变化。

当你设置 HPA 时,你至少需要:

  • 目标 Deployment
  • 最小副本数与最大副本数
  • 指标与目标阈值

8.2 Cluster Autoscaler:节点也会跟着变

Pod 数量增加不等于节点自动可用。Cluster Autoscaler 负责在需要时增加节点,在空闲时减少节点(在配置允许的情况下)。

如果你只开了 HPA,但节点数固定,副本再怎么扩也可能调度失败。

8.3 资源请求与限制:别让系统靠运气

建议你给容器设置 requests 和 limits:

  • requests:调度所依据的“最低保证”
  • limits:容器能用的“上限”

否则系统可能无法正确分配资源,导致某些 Pod 被频繁重启或性能抖动。

第九章:常见坑与排查思路——把时间花在正确的地方

你在入门阶段很可能遇到这些问题。别慌,按优先级排查。

9.1 Pod 一直 Pending

常见原因:

  • 资源配额不足(CPU/内存额度耗尽)
  • 节点资源类型不匹配
  • 调度约束(亲和/污点)导致无法落到节点

排查方式:

kubectl describe pod <pod名>

看 Events 里给出的提示。

9.2 ImagePullBackOff

常见原因:

  • 镜像地址错
  • 镜像仓库权限不足
  • 网络访问限制

排查方式:

kubectl describe pod <pod名>
kubectl logs <pod名> --previous

9.3 探针导致一直不就绪

表现通常是:Pod Running 但 Service 不转发,或者 Ingress 返回 502/503。

原因常见:

  • health 路径与应用不一致
  • 端口不一致
  • 初始延迟太短,服务还没启动就被判定失败

9.4 Ingress 外部访问失败

通常是端口映射或 Ingress 控制器配置问题。你可以按顺序检查:

  • Ingress 是否已分配外部地址
  • Service 是否正确选择到了 Pod(selector 标签是否匹配)
  • Pod 是否就绪(readiness 是否通过)

必要时使用:

kubectl get endpoints web-demo-svc -o wide

看 Service 的 endpoints 是否有地址。

第十章:清理资源与后续学习路线——让每次练习都不浪费

GCP帳號註冊服務 你在学习过程中会创建很多资源。为了避免账单持续增长,最后一定要清理。

10.1 删除不需要的 Kubernetes 资源

如果你只是在实验,可以删除 Deployment、Service、Ingress:

kubectl delete ingress web-demo-ing
kubectl delete service web-demo-svc
deloyment/web-demo

(注意大小写与资源名,建议直接按你实际 YAML 文件删除。)

10.2 删除集群或降低节点数量

集群本身是成本大头。如果确定不需要,直接删除集群最干净。

如果你希望保留环境用于后续练习,可以把节点数降到最小或按自动伸缩策略运行。

10.3 下一步你应该学什么

当你完成本教程,你已经掌握了一个可用系统的基本闭环。下一步可以按目标继续:

  • 把应用拆成多个微服务,用 NetworkPolicy 做隔离
  • 引入 ConfigMap/Secret 管理配置与敏感信息
  • 使用 Helm 或 Kustomize 管理复杂资源
  • 学习 CI/CD(例如用 Cloud Build 或 GitHub Actions 推送镜像并自动更新)
  • 深入监控告警:CPU、延迟、错误率、HPA 指标

GCP帳號註冊服務 不要急着学“所有 Kubernetes”。先把一个应用稳定跑起来,你会更快理解它为何存在,也更能把知识用在真实项目里。

结语:把入门做成可复用的方法

搭建 GKE Kubernetes 集群并部署容器化应用,本质上是把一条链路串起来:集群与网络提供运行环境,镜像提供可部署内容,Deployment 与 Service 定义应用如何被调度与访问,Ingress 让外部流量进入,监控与日志让你能快速定位问题。你只要每一步都“验证”,就不会在复杂度里迷路。

当你再次遇到新应用时,流程会越来越顺:换镜像、改端口、补探针、加资源限制、接入 Ingress,剩下的就是迭代与优化。你真正建立的是一套可复用的工程方法。

Telegram售前客服
客服ID
@cloudcup
联系
Telegram售后客服
客服ID
@yanhuacloud
联系