如何在谷歌云(Google Cloud)上部署 Kubernetes 集群

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 创建

  1. 在 Console 中进入「Kubernetes Engine」→「集群」页面,点击「创建集群」。
  2. 选择集群类型:标准集群(Standard)或 Autopilot 集群。对于生产环境,推荐使用标准集群以获得更灵活的配置;对于快速上手,Autopilot 可以自动管理节点。
  3. 配置集群基本信息:
    • 名称:例如 my-k8s-cluster
    • 区域(Region):选择离你用户最近的区域,例如 asia-east1(台湾)
    • 版本:选择最新的稳定版本
  4. 配置节点池:
    • 节点数量:建议至少 3 个节点以保证高可用
    • 机器类型:根据负载选择,例如 e2-medium(2 vCPU,4GB 内存)
    • 磁盘大小:默认 100GB 即可
  5. 点击「创建」,等待数分钟即可完成集群创建。

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 timeout
  • error: You must be logged in to the server (Unauthorized)
  • context was not found for specified context

原因分析:

  1. 凭据过期 :gcloud 的认证令牌过期,导致 kubectl 无法通过 GKE 认证。
  2. 上下文错误:kubectl 当前使用的 context 不是目标集群,或 context 已被删除。
  3. 网络不通:本地网络无法访问集群的 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>,长时间无法访问服务。

原因分析:

  1. 配额不足:项目的外部 IP 配额已用尽,无法为 LoadBalancer 分配公网 IP。
  2. 服务类型错误 :Service 未设置为 LoadBalancer 类型,或 YAML 配置有误。
  3. 区域限制:所选区域暂时无法分配外部 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 无法正常调度。

原因分析:

  1. 磁盘压力 :节点磁盘使用率过高,触发 DiskPressure,节点被标记为不可调度。
  2. 资源不足 :节点 CPU 或内存耗尽,触发 MemoryPressure 或 PIDPressure。
  3. 节点异常:节点虚拟机本身出现故障,或 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 集群的全流程:

  1. 准备工作:注册账号、创建项目、启用 API、安装工具
  2. 创建集群:通过 Console 或命令行创建 GKE 集群
  3. 部署应用:使用 kubectl 部署 Nginx 并暴露服务
  4. 访问控制:配置 kubectl 和 RBAC 权限
  5. 运维管理:自动扩缩容、监控日志、版本升级
  6. 资源清理:删除集群避免费用

GKE 作为 Kubernetes 的「原产地」服务,在稳定性、生态和运维体验上都处于领先地位。掌握以上流程后,你就可以在谷歌云上轻松运行生产级 Kubernetes 工作负载了。如果在实践中遇到问题,欢迎在评论区交流讨论。

相关推荐
xiaoligangting1 小时前
太原岗亭款式齐全
云原生
guo_wen_qiang1 小时前
docker安装常见软件集合
运维·docker·容器
程序员清风12 小时前
Docker、Nginx 与 Kubernetes 部署 AI 后端服务
nginx·docker·kubernetes
Zhu75813 小时前
离线二进制部署-Kubernetes-v1.36.4
容器·贪心算法·kubernetes
天衍四九-15 小时前
Docker容器实战系列(八):Docker生产最佳实践与避坑指南,系列终章
运维·docker·容器
Zhou14113616 小时前
Docker_03_DockerCompose多容器编排
运维·docker·容器
程序猿阿越17 小时前
containerd如何拉取镜像
后端·kubernetes·源码阅读
Elastic 中国社区官方博客17 小时前
Kubernetes attributes processor v1:它对 EDOT Collector 意味着什么
java·大数据·elasticsearch·搜索引擎·贪心算法·kubernetes·全文检索
啊哈一半醒18 小时前
Docker 底层知识:从 Namespace 到 UnionFS
运维·docker·容器