1. 引言
Kubernetes(简称 K8s)已经成为容器编排领域的事实标准,而谷歌云(Google Cloud Platform,简称 GCP)作为 Kubernetes 的发源地,提供了最成熟、最完整的托管 Kubernetes 服务------Google Kubernetes Engine(简称 GKE)。本文将带你从零开始,在谷歌云上部署一个生产可用的 Kubernetes 集群,涵盖环境准备、集群创建、应用部署、访问配置等完整流程。
2. 准备工作
在开始之前,你需要完成以下准备工作:
2.1 注册谷歌云账号
访问 Google Cloud 官网,使用 Google 账号注册并开通云服务。新用户通常可以获得一定的免费额度,可用于体验 GKE 等云服务。
2.2 创建项目
登录 Google Cloud Console 后,点击顶部导航栏的项目下拉框,选择「新建项目」,为你的 Kubernetes 部署创建一个独立项目,便于资源管理和权限隔离。
2.3 启用必要 API
在项目中启用以下 API:
- Kubernetes Engine API
- Cloud Resource Manager API
- Compute Engine API
可以在 Console 的「API 和服务」→「库」中搜索并启用。
2.4 安装命令行工具
本地需要安装以下工具:
bash
# 安装 Google Cloud SDK
# macOS 用户可使用 brew
brew install --cask google-cloud-sdk
# 初始化并登录
gcloud init
gcloud auth login
# 安装 kubectl(Kubernetes 命令行工具)
gcloud components install kubectl
安装完成后,验证工具是否就绪:
bash
gcloud --version
kubectl version --client
3. 创建 GKE 集群
在动手创建集群之前,先通过下面的架构图了解 GKE 集群的核心组件与数据流向:
#mermaid-svg-WRW5verBs5FiwqTg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-WRW5verBs5FiwqTg .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-WRW5verBs5FiwqTg .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-WRW5verBs5FiwqTg .error-icon{fill:#552222;}#mermaid-svg-WRW5verBs5FiwqTg .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-WRW5verBs5FiwqTg .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-WRW5verBs5FiwqTg .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-WRW5verBs5FiwqTg .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-WRW5verBs5FiwqTg .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-WRW5verBs5FiwqTg .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-WRW5verBs5FiwqTg .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-WRW5verBs5FiwqTg .marker{fill:#333333;stroke:#333333;}#mermaid-svg-WRW5verBs5FiwqTg .marker.cross{stroke:#333333;}#mermaid-svg-WRW5verBs5FiwqTg svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-WRW5verBs5FiwqTg p{margin:0;}#mermaid-svg-WRW5verBs5FiwqTg .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-WRW5verBs5FiwqTg .cluster-label text{fill:#333;}#mermaid-svg-WRW5verBs5FiwqTg .cluster-label span{color:#333;}#mermaid-svg-WRW5verBs5FiwqTg .cluster-label span p{background-color:transparent;}#mermaid-svg-WRW5verBs5FiwqTg .label text,#mermaid-svg-WRW5verBs5FiwqTg span{fill:#333;color:#333;}#mermaid-svg-WRW5verBs5FiwqTg .node rect,#mermaid-svg-WRW5verBs5FiwqTg .node circle,#mermaid-svg-WRW5verBs5FiwqTg .node ellipse,#mermaid-svg-WRW5verBs5FiwqTg .node polygon,#mermaid-svg-WRW5verBs5FiwqTg .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-WRW5verBs5FiwqTg .rough-node .label text,#mermaid-svg-WRW5verBs5FiwqTg .node .label text,#mermaid-svg-WRW5verBs5FiwqTg .image-shape .label,#mermaid-svg-WRW5verBs5FiwqTg .icon-shape .label{text-anchor:middle;}#mermaid-svg-WRW5verBs5FiwqTg .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-WRW5verBs5FiwqTg .rough-node .label,#mermaid-svg-WRW5verBs5FiwqTg .node .label,#mermaid-svg-WRW5verBs5FiwqTg .image-shape .label,#mermaid-svg-WRW5verBs5FiwqTg .icon-shape .label{text-align:center;}#mermaid-svg-WRW5verBs5FiwqTg .node.clickable{cursor:pointer;}#mermaid-svg-WRW5verBs5FiwqTg .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-WRW5verBs5FiwqTg .arrowheadPath{fill:#333333;}#mermaid-svg-WRW5verBs5FiwqTg .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-WRW5verBs5FiwqTg .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-WRW5verBs5FiwqTg .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WRW5verBs5FiwqTg .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-WRW5verBs5FiwqTg .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WRW5verBs5FiwqTg .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-WRW5verBs5FiwqTg .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-WRW5verBs5FiwqTg .cluster text{fill:#333;}#mermaid-svg-WRW5verBs5FiwqTg .cluster span{color:#333;}#mermaid-svg-WRW5verBs5FiwqTg div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-WRW5verBs5FiwqTg .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-WRW5verBs5FiwqTg rect.text{fill:none;stroke-width:0;}#mermaid-svg-WRW5verBs5FiwqTg .icon-shape,#mermaid-svg-WRW5verBs5FiwqTg .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-WRW5verBs5FiwqTg .icon-shape p,#mermaid-svg-WRW5verBs5FiwqTg .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-WRW5verBs5FiwqTg .icon-shape .label rect,#mermaid-svg-WRW5verBs5FiwqTg .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-WRW5verBs5FiwqTg .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-WRW5verBs5FiwqTg .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-WRW5verBs5FiwqTg :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} kubectl / gcloud
管理
管理
管理
外部流量
用户 / 开发者
GKE 控制面
(API Server)
节点 1
(kubelet)
节点 2
(kubelet)
节点 3
(kubelet)
Nginx Pod
Nginx Pod
Nginx Pod
Service
(LoadBalancer)
互联网用户
组件说明 :用户通过
kubectl或gcloud命令访问 GKE 控制面(API Server),控制面负责调度和管理集群内的所有节点。Nginx Pod 运行在节点上,通过 LoadBalancer 类型的 Service 将流量负载均衡到各个 Pod,最终对外提供统一访问入口。
3.1 通过 Console 创建
3. 创建 GKE 集群
3.1 通过 Console 创建
- 在 Console 中进入「Kubernetes Engine」→「集群」页面,点击「创建集群」。
- 选择集群类型:标准集群(Standard)或 Autopilot 集群。对于生产环境,推荐使用标准集群以获得更灵活的配置;对于快速上手,Autopilot 可以自动管理节点。
- 配置集群基本信息:
- 名称:例如
my-k8s-cluster - 区域(Region):选择离你用户最近的区域,例如
asia-east1(台湾) - 版本:选择最新的稳定版本
- 名称:例如
- 配置节点池:
- 节点数量:建议至少 3 个节点以保证高可用
- 机器类型:根据负载选择,例如
e2-medium(2 vCPU,4GB 内存) - 磁盘大小:默认 100GB 即可
- 点击「创建」,等待数分钟即可完成集群创建。
3.2 通过命令行创建
如果你更喜欢命令行操作,可以使用 gcloud 命令快速创建集群:
bash
# 设置项目 ID
gcloud config set project YOUR_PROJECT_ID
# 创建标准集群
gcloud container clusters create my-k8s-cluster \
--region asia-east1 \
--num-nodes 3 \
--machine-type e2-medium
# 获取集群凭据(配置 kubectl)
gcloud container clusters get-credentials my-k8s-cluster \
--region asia-east1
创建完成后,验证集群状态:
bash
kubectl get nodes
3.3 两种创建方式对比
为了帮助你根据自身情况选择合适的创建方式,下面从多个维度对 Console 创建与命令行创建进行对比:
| 对比维度 | Console 创建 | 命令行创建 |
|---|---|---|
| 适用场景 | 快速上手、可视化操作、一次性配置 | 批量创建、自动化部署、生产环境 |
| 操作难度 | 低,图形界面引导,无需记忆命令 | 较高,需要熟悉 gcloud 命令及参数 |
| 可重复性 | 较低,手动点击步骤多,难以复用 | 高,命令可保存为脚本,重复执行 |
| 适合人群 | 初学者、运维经验较少的开发者 | 熟悉 CLI 的开发者、DevOps 工程师 |
| 配置灵活性 | 受界面选项限制,部分高级参数需额外配置 | 高,可通过参数精细控制集群配置 |
| 错误排查 | 界面提示直观,但定位问题较慢 | 命令行报错信息详细,便于快速定位 |
| 自动化集成 | 难以集成到 CI/CD 流程 | 易于集成到脚本和 CI/CD 流水线 |
简要说明:Console 创建适合初次接触 GKE 或需要直观确认配置的场景,操作门槛低但难以复用;命令行创建虽然需要一定的学习成本,但命令可脚本化、可重复执行,更适合生产环境和自动化运维。建议初学者先用 Console 熟悉流程,再逐步过渡到命令行操作。
如果看到 3 个节点处于 Ready 状态,说明集群创建成功。
4. 部署第一个应用
集群就绪后,我们来部署一个简单的 Nginx 应用,验证整个链路是否通畅。
4.1 创建 Deployment
bash
kubectl create deployment nginx-demo \
--image=nginx:latest \
--replicas=3
查看 Deployment 和 Pod 状态:
bash
kubectl get deployments
kubectl get pods
4.2 暴露服务
bash
kubectl expose deployment nginx-demo \
--type=LoadBalancer \
--port=80 \
--target-port=80
等待外部 IP 分配:
bash
kubectl get services
4.3 使用 Ingress 暴露服务
LoadBalancer 类型的 Service 会为每个服务分配一个独立的外部 IP,适合服务数量少、需要直接暴露的场景;但当服务数量增多时,每个服务都占用一个公网 IP,成本高且管理不便。Ingress 则作为集群的「流量入口」,通过一个统一的入口(通常是一个负载均衡器)根据域名或路径将请求路由到不同的 Service,更适合多服务、多域名的生产场景。
下面以 nginx-ingress 为例,部署一个 Ingress 资源,将外部流量路由到 nginx-demo 服务:
yaml
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: nginx-demo-ingress
spec:
ingressClassName: nginx
rules:
- host: demo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-demo
port:
number: 80
除了 nginx-ingress,GKE 还提供了内置的 GKE Ingress(基于 Google Cloud HTTP(S) Load Balancing),无需额外部署 Ingress Controller,即可直接使用。下面是一个使用 GKE 内置 Ingress 的 YAML 示例,包含静态 IP 绑定和 TLS 证书配置:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: gke-demo-ingress
annotations:
# 绑定已预留的全局静态 IP(需提前创建)
kubernetes.io/ingress.global-static-ip-name: my-global-static-ip
# 启用 HTTP 到 HTTPS 的重定向
kubernetes.io/ingress.allow-http: "false"
spec:
tls:
- secretName: demo-tls-secret
rules:
- host: demo.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: nginx-demo
port:
number: 80
使用前需要先创建 TLS 证书 Secret 和预留全局静态 IP:
bash
# 1. 创建 TLS 证书 Secret(证书文件需提前申请)
kubectl create secret tls demo-tls-secret \
--cert=path/to/tls.crt \
--key=path/to/tls.key
# 2. 预留全局静态 IP(GKE Ingress 要求使用全局 IP)
gcloud compute addresses create my-global-static-ip \
--global
# 3. 应用 Ingress 资源
kubectl apply -f gke-ingress.yaml
# 4. 查看 Ingress 状态,确认 ADDRESS 已分配
kubectl get ingress
适用场景差异 :nginx-ingress 需要自行部署和维护 Ingress Controller,适合需要高度自定义路由规则(如重写路径、限流、灰度发布)或已在其他集群使用 nginx 生态的场景;GKE Ingress 由谷歌云托管,开箱即用、免运维,适合希望快速上线 HTTPS、依赖 Google Cloud 负载均衡能力(如全球负载均衡、Cloud CDN 集成)的场景,但自定义能力相对受限。若仅需简单的域名/路径路由,推荐优先使用 GKE 内置 Ingress。
应用 Ingress 资源并验证:
bash
# 应用 IngressClass 和 Ingress 资源
kubectl apply -f ingress.yaml
# 查看 Ingress 状态,确认 ADDRESS 已分配
kubectl get ingress
说明 :使用 Ingress 前需要先在集群中部署 Ingress Controller(如 nginx-ingress),GKE 也提供了内置的 GKE Ingress(基于 HTTP(S) Load Balancing)。配置完成后,通过
kubectl get ingress查看ADDRESS字段,待其变为可用后,即可通过http://demo.example.com访问服务。当
EXTERNAL-IP变为可用后,在浏览器中访问http://EXTERNAL-IP,即可看到 Nginx 的欢迎页面。
5. 配置 kubectl 与访问控制
5.1 使用 Cloud Shell
如果你不想在本地安装工具,可以直接使用 Google Cloud Console 自带的 Cloud Shell,它已经预装了 gcloud 和 kubectl,开箱即用。
5.2 配置 RBAC 权限
对于团队协作场景,建议为不同成员配置独立的 Kubernetes 权限。GKE 默认与 Google Cloud IAM 集成,可以通过 IAM 角色控制访问:
bash
# 为成员授予集群查看权限
gcloud projects add-iam-policy-binding YOUR_PROJECT_ID \
--member="user:colleague@example.com" \
--role="roles/container.clusterViewer"
6. 集群管理与监控
6.1 自动扩缩容
GKE 支持节点自动扩缩容,可以根据负载动态调整节点数量:
bash
# 为现有节点池启用自动扩缩容
gcloud container clusters update my-k8s-cluster \
--region asia-east1 \
--enable-autoscaling \
--min-nodes 1 \
--max-nodes 10
6.2 监控与日志
GKE 与 Cloud Monitoring 和 Cloud Logging 深度集成,无需额外配置即可查看:
- 集群监控面板:Console 中「Kubernetes Engine」→「集群」→「观察性」
- 日志查询:Console 中「日志」→「日志浏览器」,可按 Pod 名称过滤日志
6.3 升级集群
GKE 支持滚动升级,可以在 Console 中一键升级集群版本,也可以使用命令行:
bash
# 升级集群控制面(Master)到指定版本
gcloud container clusters upgrade my-k8s-cluster \
--cluster my-k8s-cluster \
--region asia-east1 \
--master \
--cluster-version 1.30.5-gke.1010
# 升级节点池到指定版本(若需要)
gcloud container clusters upgrade my-k8s-cluster \
--cluster my-k8s-cluster \
--region asia-east1 \
--node-pool default-pool \
--cluster-version 1.30.5-gke.1010
升级完成后,验证集群版本和状态:
bash
# 查看集群详情,确认版本和状态
gcloud container clusters describe my-k8s-cluster \
--region asia-east1
# 查看节点版本和状态
kubectl get nodes -o wide
说明 :升级前建议先查看当前集群版本
gcloud container clusters describe my-k8s-cluster --region asia-east1 --format="value(currentMasterVersion)",并确认目标版本可用。控制面升级通常需要几分钟,节点升级会逐个滚动进行,期间服务不会中断。
7. 成本优化建议
GKE 的计费主要来自节点虚拟机、外部 IP 和持久化磁盘。对于长期运行或实验性质的集群,合理优化可以显著降低费用。下面从几个维度给出具体建议。
7.1 使用 Preemptible 节点(抢占式虚拟机)
Preemptible 节点(抢占式虚拟机)的价格通常比普通实例低 60%~80%,适合无状态、可容忍中断的工作负载(如批处理、CI 构建、数据处理)。GKE 会在资源紧张时回收这类节点,因此不建议把关键服务部署在抢占式节点池上。
创建抢占式节点池:
bash
# 为现有集群新增抢占式节点池
gcloud container node-pools create spot-pool \
--cluster my-k8s-cluster \
--region asia-east1 \
--num-nodes 2 \
--machine-type e2-medium \
--preemptible
说明:在 Console 中创建节点池时,勾选「使用抢占式虚拟机(Preemptible)」即可。建议将抢占式节点池与普通节点池混合使用,关键服务跑在普通节点上,弹性任务跑在抢占式节点上。
7.2 设置资源请求与限制(requests/limits)
未设置资源请求(requests)的 Pod 可能被调度到任意节点,导致资源分配不均、节点过载;未设置资源限制(limits)则可能让单个 Pod 无限占用 CPU 或内存。合理配置可以避免资源浪费,也能提升节点利用率。
在 Deployment 中为容器设置资源请求与限制:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-demo
spec:
replicas: 3
template:
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: "250m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
说明 :
requests决定 Pod 被调度到哪个节点,limits限制 Pod 的最大资源占用。建议先通过监控观察实际用量,再据此设置合理的请求与限制,避免「申请过多、用得太少」造成节点闲置。
7.3 利用自动扩缩容与节点自动修复减少闲置节点
GKE 的节点自动扩缩容(Cluster Autoscaler)会根据 Pod 的调度需求动态增减节点,负载低时自动缩容,避免空闲节点持续计费。节点自动修复(Node Auto-Repair)则会在节点异常时自动重建,减少人工介入和资源浪费。
bash
# 为现有节点池启用自动扩缩容(最小 1 个、最大 5 个节点)
gcloud container clusters update my-k8s-cluster \
--region asia-east1 \
--enable-autoscaling \
--min-nodes 1 \
--max-nodes 5
# 查看节点池自动扩缩容状态
gcloud container node-pools describe default-pool \
--cluster my-k8s-cluster \
--region asia-east1 \
--format="value(autoscaling)"
说明:在 Console 中进入「Kubernetes Engine」→「集群」→「节点池」,勾选「启用自动扩缩容」并设置最小/最大节点数即可。节点自动修复默认开启,无需额外配置。
7.4 定期清理未使用的静态 IP 和持久化磁盘
外部静态 IP 和持久化磁盘即使未被使用也会持续计费。定期清理闲置资源是控制成本的重要一环。
bash
# 1. 列出所有静态 IP,找出未绑定实例的地址
gcloud compute addresses list \
--filter="status=RESERVED AND users:[]"
# 2. 释放不再使用的静态 IP
gcloud compute addresses delete STATIC_IP_NAME \
--region asia-east1
# 3. 列出所有持久化磁盘,找出未挂载的磁盘
gcloud compute disks list \
--filter="-users:*"
# 4. 删除未挂载的持久化磁盘
gcloud compute disks delete DISK_NAME \
--region asia-east1
说明:在 Console 中进入「VPC 网络」→「IP 地址」可查看并释放静态 IP;进入「计算引擎」→「磁盘」可查看并删除未挂载的磁盘。建议定期(如每月)检查一次,避免资源长期闲置产生费用。
gcloud container clusters upgrade my-k8s-cluster
--region asia-east1
--master
## 7. 常见问题与故障排查
在实际部署过程中,你可能会遇到各种问题。下面整理了最常见的四类故障及其排查方法。
### 7.1 集群创建失败
**错误现象**:执行 `gcloud container clusters create` 时,命令报错并终止,常见错误信息包括:
- `PERMISSION_DENIED`:权限不足
- `QUOTA_EXCEEDED`:配额不足
- `API not enabled`:API 未启用
**原因分析**:
1. **API 未启用**:创建集群依赖 Kubernetes Engine API、Compute Engine API 等,未启用会导致权限错误。
2. **资源配额不足**:项目默认的 CPU、磁盘或 IP 配额可能不够创建 3 个节点。
3. **项目未正确设置**:`gcloud` 当前使用的项目 ID 与预期不符。
**解决方法**:
```bash
# 1. 确认当前项目 ID 是否正确
gcloud config get-value project
# 2. 启用所需 API(若未启用)
gcloud services enable container.googleapis.com \
compute.googleapis.com \
cloudresourcemanager.googleapis.com
# 3. 查看并申请提升配额
# 在 Console 中进入「IAM 与管理」→「配额」,找到 CPU/磁盘配额并点击「申请增加配额」
# 4. 若配额暂时无法提升,可先减少节点数量或改用更小的机器类型重试
gcloud container clusters create my-k8s-cluster \
--region asia-east1 \
--num-nodes 1 \
--machine-type e2-small
7.2 kubectl 无法连接集群
错误现象 :执行 kubectl get nodes 时提示:
Unable to connect to the server: dial tcp ... i/o timeouterror: You must be logged in to the server (Unauthorized)context was not found for specified context
原因分析:
- 凭据过期 :
gcloud的认证令牌过期,导致 kubectl 无法通过 GKE 认证。 - 上下文错误:kubectl 当前使用的 context 不是目标集群,或 context 已被删除。
- 网络不通:本地网络无法访问集群的 API Server 端点。
排查与解决步骤:
bash
# 1. 查看当前 kubectl 上下文
kubectl config current-context
# 2. 查看所有可用上下文
kubectl config get-contexts
# 3. 重新获取集群凭据(刷新认证令牌并重建 context)
gcloud container clusters get-credentials my-k8s-cluster \
--region asia-east1
# 4. 若仍失败,先重新登录 gcloud
gcloud auth login
# 5. 验证连接
kubectl cluster-info
7.3 LoadBalancer 外部 IP 长时间未分配
错误现象 :执行 kubectl get services 后,EXTERNAL-IP 一直显示 <pending>,长时间无法访问服务。
原因分析:
- 配额不足:项目的外部 IP 配额已用尽,无法为 LoadBalancer 分配公网 IP。
- 服务类型错误 :Service 未设置为
LoadBalancer类型,或 YAML 配置有误。 - 区域限制:所选区域暂时无法分配外部 IP。
解决方法:
bash
# 1. 查看 Service 详情,确认类型和事件
kubectl describe service nginx-demo
# 2. 确认 Service 类型为 LoadBalancer
kubectl get service nginx-demo -o yaml | grep type
# 3. 若类型不对,删除后重新创建
kubectl delete service nginx-demo
kubectl expose deployment nginx-demo \
--type=LoadBalancer \
--port=80 \
--target-port=80
# 4. 检查项目外部 IP 配额
# 在 Console 中进入「IAM 与管理」→「配额」,筛选「External IP addresses」
# 若配额不足,申请提升或释放不再使用的静态 IP
7.4 节点 NotReady 状态
错误现象 :执行 kubectl get nodes 时,节点状态显示 NotReady,Pod 无法正常调度。
原因分析:
- 磁盘压力 :节点磁盘使用率过高,触发
DiskPressure,节点被标记为不可调度。 - 资源不足 :节点 CPU 或内存耗尽,触发
MemoryPressure或PIDPressure。 - 节点异常:节点虚拟机本身出现故障,或 kubelet 服务异常。
排查与修复命令:
bash
# 1. 查看节点状态及异常原因
kubectl describe node NODE_NAME
# 2. 查看节点上的系统事件
kubectl get events --field-selector involvedObject.name=NODE_NAME
# 3. 若为磁盘压力,登录节点清理磁盘空间
# 通过 SSH 登录节点后执行:
# df -h # 查看磁盘使用率
# docker system prune -af # 清理无用容器和镜像
# 4. 若为资源压力,可临时删除部分高负载 Pod 释放资源
kubectl delete pod POD_NAME
# 5. 若节点持续异常,可手动删除该节点,让 GKE 自动重建
kubectl delete node NODE_NAME
提示 :GKE 的节点池通常开启了自动修复功能,节点异常时系统会自动重建。若节点长时间处于
NotReady,建议优先在 Console 的「Kubernetes Engine」→「集群」→「节点」页面查看节点健康状态。
7. 清理资源
为避免产生不必要的费用,实验完成后请及时清理资源:
bash
# 删除集群(会同时删除所有节点和 Pod)
gcloud container clusters delete my-k8s-cluster \
--region asia-east1
# 删除项目(彻底清理所有资源)
# 在 Console 中进入「项目设置」→「关闭项目」
8. 总结
本文从零开始,完整演示了在谷歌云上部署 Kubernetes 集群的全流程:
- 准备工作:注册账号、创建项目、启用 API、安装工具
- 创建集群:通过 Console 或命令行创建 GKE 集群
- 部署应用:使用 kubectl 部署 Nginx 并暴露服务
- 访问控制:配置 kubectl 和 RBAC 权限
- 运维管理:自动扩缩容、监控日志、版本升级
- 资源清理:删除集群避免费用
GKE 作为 Kubernetes 的「原产地」服务,在稳定性、生态和运维体验上都处于领先地位。掌握以上流程后,你就可以在谷歌云上轻松运行生产级 Kubernetes 工作负载了。如果在实践中遇到问题,欢迎在评论区交流讨论。