尧图精选

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

🕒 发布时间:2026/10/2 12:36:10 📁 来源:尧图网络
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在项目中启用以下 APIKubernetes Engine APICloud Resource Manager APICompute Engine API可以在 Console 的「API 和服务」→「库」中搜索并启用。2.4 安装命令行工具本地需要安装以下工具# 安装 Google Cloud SDK# macOS 用户可使用 brewbrewinstall--caskgoogle-cloud-sdk# 初始化并登录gcloud init gcloud auth login# 安装 kubectlKubernetes 命令行工具gcloud componentsinstallkubectl安装完成后验证工具是否就绪gcloud--versionkubectl version--client3. 创建 GKE 集群在动手创建集群之前先通过下面的架构图了解 GKE 集群的核心组件与数据流向kubectl / gcloud管理管理管理外部流量用户 / 开发者GKE 控制面(API Server)节点 1(kubelet)节点 2(kubelet)节点 3(kubelet)Nginx PodNginx PodNginx PodService(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-medium2 vCPU4GB 内存磁盘大小默认 100GB 即可点击「创建」等待数分钟即可完成集群创建。3.2 通过命令行创建如果你更喜欢命令行操作可以使用gcloud命令快速创建集群# 设置项目 IDgcloud configsetproject YOUR_PROJECT_ID# 创建标准集群gcloud container clusters create my-k8s-cluster\--regionasia-east1\--num-nodes3\--machine-type e2-medium# 获取集群凭据配置 kubectlgcloud container clusters get-credentials my-k8s-cluster\--regionasia-east1创建完成后验证集群状态kubectl get nodes3.3 两种创建方式对比为了帮助你根据自身情况选择合适的创建方式下面从多个维度对 Console 创建与命令行创建进行对比对比维度Console 创建命令行创建适用场景快速上手、可视化操作、一次性配置批量创建、自动化部署、生产环境操作难度低图形界面引导无需记忆命令较高需要熟悉gcloud命令及参数可重复性较低手动点击步骤多难以复用高命令可保存为脚本重复执行适合人群初学者、运维经验较少的开发者熟悉 CLI 的开发者、DevOps 工程师配置灵活性受界面选项限制部分高级参数需额外配置高可通过参数精细控制集群配置错误排查界面提示直观但定位问题较慢命令行报错信息详细便于快速定位自动化集成难以集成到 CI/CD 流程易于集成到脚本和 CI/CD 流水线简要说明Console 创建适合初次接触 GKE 或需要直观确认配置的场景操作门槛低但难以复用命令行创建虽然需要一定的学习成本但命令可脚本化、可重复执行更适合生产环境和自动化运维。建议初学者先用 Console 熟悉流程再逐步过渡到命令行操作。如果看到 3 个节点处于Ready状态说明集群创建成功。4. 部署第一个应用集群就绪后我们来部署一个简单的 Nginx 应用验证整个链路是否通畅。4.1 创建 Deploymentkubectl create deployment nginx-demo\--imagenginx:latest\--replicas3查看 Deployment 和 Pod 状态kubectl get deployments kubectl get pods4.2 暴露服务kubectl expose deployment nginx-demo\--typeLoadBalancer\--port80\--target-port80等待外部 IP 分配kubectl get services4.3 使用 Ingress 暴露服务LoadBalancer 类型的 Service 会为每个服务分配一个独立的外部 IP适合服务数量少、需要直接暴露的场景但当服务数量增多时每个服务都占用一个公网 IP成本高且管理不便。Ingress 则作为集群的「流量入口」通过一个统一的入口通常是一个负载均衡器根据域名或路径将请求路由到不同的 Service更适合多服务、多域名的生产场景。下面以 nginx-ingress 为例部署一个 Ingress 资源将外部流量路由到nginx-demo服务apiVersion:networking.k8s.io/v1kind:IngressClassmetadata:name:nginxspec:controller:k8s.io/ingress-nginx---apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:nginx-demo-ingressspec:ingressClassName:nginxrules:-host:demo.example.comhttp:paths:-path:/pathType:Prefixbackend:service:name:nginx-demoport:number:80除了 nginx-ingressGKE 还提供了内置的 GKE Ingress基于 Google Cloud HTTP(S) Load Balancing无需额外部署 Ingress Controller即可直接使用。下面是一个使用 GKE 内置 Ingress 的 YAML 示例包含静态 IP 绑定和 TLS 证书配置apiVersion:networking.k8s.io/v1kind:Ingressmetadata:name:gke-demo-ingressannotations:# 绑定已预留的全局静态 IP需提前创建kubernetes.io/ingress.global-static-ip-name:my-global-static-ip# 启用 HTTP 到 HTTPS 的重定向kubernetes.io/ingress.allow-http:falsespec:tls:-secretName:demo-tls-secretrules:-host:demo.example.comhttp:paths:-path:/pathType:Prefixbackend:service:name:nginx-demoport:number:80使用前需要先创建 TLS 证书 Secret 和预留全局静态 IP# 1. 创建 TLS 证书 Secret证书文件需提前申请kubectl create secret tls demo-tls-secret\--certpath/to/tls.crt\--keypath/to/tls.key# 2. 预留全局静态 IPGKE Ingress 要求使用全局 IPgcloud compute addresses create my-global-static-ip\--global# 3. 应用 Ingress 资源kubectl apply-fgke-ingress.yaml# 4. 查看 Ingress 状态确认 ADDRESS 已分配kubectl get ingress适用场景差异nginx-ingress 需要自行部署和维护 Ingress Controller适合需要高度自定义路由规则如重写路径、限流、灰度发布或已在其他集群使用 nginx 生态的场景GKE Ingress 由谷歌云托管开箱即用、免运维适合希望快速上线 HTTPS、依赖 Google Cloud 负载均衡能力如全球负载均衡、Cloud CDN 集成的场景但自定义能力相对受限。若仅需简单的域名/路径路由推荐优先使用 GKE 内置 Ingress。应用 Ingress 资源并验证# 应用 IngressClass 和 Ingress 资源kubectl apply-fingress.yaml# 查看 Ingress 状态确认 ADDRESS 已分配kubectl get ingress说明使用 Ingress 前需要先在集群中部署 Ingress Controller如 nginx-ingressGKE 也提供了内置的 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 角色控制访问# 为成员授予集群查看权限gcloud projects add-iam-policy-binding YOUR_PROJECT_ID\--memberuser:colleagueexample.com\--roleroles/container.clusterViewer6. 集群管理与监控6.1 自动扩缩容GKE 支持节点自动扩缩容可以根据负载动态调整节点数量# 为现有节点池启用自动扩缩容gcloud container clusters update my-k8s-cluster\--regionasia-east1\--enable-autoscaling\--min-nodes1\--max-nodes106.2 监控与日志GKE 与 Cloud Monitoring 和 Cloud Logging 深度集成无需额外配置即可查看集群监控面板Console 中「Kubernetes Engine」→「集群」→「观察性」日志查询Console 中「日志」→「日志浏览器」可按 Pod 名称过滤日志6.3 升级集群GKE 支持滚动升级可以在 Console 中一键升级集群版本也可以使用命令行# 升级集群控制面Master到指定版本gcloud container clusters upgrade my-k8s-cluster\--clustermy-k8s-cluster\--regionasia-east1\--master\--cluster-version1.30.5-gke.1010# 升级节点池到指定版本若需要gcloud container clusters upgrade my-k8s-cluster\--clustermy-k8s-cluster\--regionasia-east1\--node-pool default-pool\--cluster-version1.30.5-gke.1010升级完成后验证集群版本和状态# 查看集群详情确认版本和状态gcloud container clusters describe my-k8s-cluster\--regionasia-east1# 查看节点版本和状态kubectl get nodes-owide说明升级前建议先查看当前集群版本gcloud container clusters describe my-k8s-cluster --region asia-east1 --formatvalue(currentMasterVersion)并确认目标版本可用。控制面升级通常需要几分钟节点升级会逐个滚动进行期间服务不会中断。7. 成本优化建议GKE 的计费主要来自节点虚拟机、外部 IP 和持久化磁盘。对于长期运行或实验性质的集群合理优化可以显著降低费用。下面从几个维度给出具体建议。7.1 使用 Preemptible 节点抢占式虚拟机Preemptible 节点抢占式虚拟机的价格通常比普通实例低 60%80%适合无状态、可容忍中断的工作负载如批处理、CI 构建、数据处理。GKE 会在资源紧张时回收这类节点因此不建议把关键服务部署在抢占式节点池上。创建抢占式节点池# 为现有集群新增抢占式节点池gcloud container node-pools create spot-pool\--clustermy-k8s-cluster\--regionasia-east1\--num-nodes2\--machine-type e2-medium\--preemptible说明在 Console 中创建节点池时勾选「使用抢占式虚拟机Preemptible」即可。建议将抢占式节点池与普通节点池混合使用关键服务跑在普通节点上弹性任务跑在抢占式节点上。7.2 设置资源请求与限制requests/limits未设置资源请求requests的 Pod 可能被调度到任意节点导致资源分配不均、节点过载未设置资源限制limits则可能让单个 Pod 无限占用 CPU 或内存。合理配置可以避免资源浪费也能提升节点利用率。在 Deployment 中为容器设置资源请求与限制apiVersion:apps/v1kind:Deploymentmetadata:name:nginx-demospec:replicas:3template:spec:containers:-name:nginximage:nginx:latestresources:requests:cpu:250mmemory:256Milimits:cpu:500mmemory:512Mi说明requests决定 Pod 被调度到哪个节点limits限制 Pod 的最大资源占用。建议先通过监控观察实际用量再据此设置合理的请求与限制避免「申请过多、用得太少」造成节点闲置。7.3 利用自动扩缩容与节点自动修复减少闲置节点GKE 的节点自动扩缩容Cluster Autoscaler会根据 Pod 的调度需求动态增减节点负载低时自动缩容避免空闲节点持续计费。节点自动修复Node Auto-Repair则会在节点异常时自动重建减少人工介入和资源浪费。# 为现有节点池启用自动扩缩容最小 1 个、最大 5 个节点gcloud container clusters update my-k8s-cluster\--regionasia-east1\--enable-autoscaling\--min-nodes1\--max-nodes5# 查看节点池自动扩缩容状态gcloud container node-pools describe default-pool\--clustermy-k8s-cluster\--regionasia-east1\--formatvalue(autoscaling)说明在 Console 中进入「Kubernetes Engine」→「集群」→「节点池」勾选「启用自动扩缩容」并设置最小/最大节点数即可。节点自动修复默认开启无需额外配置。7.4 定期清理未使用的静态 IP 和持久化磁盘外部静态 IP 和持久化磁盘即使未被使用也会持续计费。定期清理闲置资源是控制成本的重要一环。# 1. 列出所有静态 IP找出未绑定实例的地址gcloud compute addresses list\--filterstatusRESERVED AND users:[]# 2. 释放不再使用的静态 IPgcloud compute addresses delete STATIC_IP_NAME\--regionasia-east1# 3. 列出所有持久化磁盘找出未挂载的磁盘gcloud compute disks list\--filter-users:*# 4. 删除未挂载的持久化磁盘gcloud compute disks delete DISK_NAME\--regionasia-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 enabledAPI 未启用 **原因分析** 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-small7.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 端点。排查与解决步骤# 1. 查看当前 kubectl 上下文kubectl config current-context# 2. 查看所有可用上下文kubectl config get-contexts# 3. 重新获取集群凭据刷新认证令牌并重建 contextgcloud container clusters get-credentials my-k8s-cluster\--regionasia-east1# 4. 若仍失败先重新登录 gcloudgcloud auth login# 5. 验证连接kubectl cluster-info7.3 LoadBalancer 外部 IP 长时间未分配错误现象执行kubectl get services后EXTERNAL-IP一直显示pending长时间无法访问服务。原因分析配额不足项目的外部 IP 配额已用尽无法为 LoadBalancer 分配公网 IP。服务类型错误Service 未设置为LoadBalancer类型或 YAML 配置有误。区域限制所选区域暂时无法分配外部 IP。解决方法# 1. 查看 Service 详情确认类型和事件kubectl describeservicenginx-demo# 2. 确认 Service 类型为 LoadBalancerkubectl getservicenginx-demo-oyaml|greptype# 3. 若类型不对删除后重新创建kubectl deleteservicenginx-demo kubectl expose deployment nginx-demo\--typeLoadBalancer\--port80\--target-port80# 4. 检查项目外部 IP 配额# 在 Console 中进入「IAM 与管理」→「配额」筛选「External IP addresses」# 若配额不足申请提升或释放不再使用的静态 IP7.4 节点 NotReady 状态错误现象执行kubectl get nodes时节点状态显示NotReadyPod 无法正常调度。原因分析磁盘压力节点磁盘使用率过高触发DiskPressure节点被标记为不可调度。资源不足节点 CPU 或内存耗尽触发MemoryPressure或PIDPressure。节点异常节点虚拟机本身出现故障或 kubelet 服务异常。排查与修复命令# 1. 查看节点状态及异常原因kubectl describenodeNODE_NAME# 2. 查看节点上的系统事件kubectl get events --field-selectorinvolvedObject.nameNODE_NAME# 3. 若为磁盘压力登录节点清理磁盘空间# 通过 SSH 登录节点后执行# df -h # 查看磁盘使用率# docker system prune -af # 清理无用容器和镜像# 4. 若为资源压力可临时删除部分高负载 Pod 释放资源kubectl delete pod POD_NAME# 5. 若节点持续异常可手动删除该节点让 GKE 自动重建kubectl deletenodeNODE_NAME提示GKE 的节点池通常开启了自动修复功能节点异常时系统会自动重建。若节点长时间处于NotReady建议优先在 Console 的「Kubernetes Engine」→「集群」→「节点」页面查看节点健康状态。7. 清理资源为避免产生不必要的费用实验完成后请及时清理资源# 删除集群会同时删除所有节点和 Podgcloud container clusters delete my-k8s-cluster\--regionasia-east1# 删除项目彻底清理所有资源# 在 Console 中进入「项目设置」→「关闭项目」8. 总结本文从零开始完整演示了在谷歌云上部署 Kubernetes 集群的全流程准备工作注册账号、创建项目、启用 API、安装工具创建集群通过 Console 或命令行创建 GKE 集群部署应用使用 kubectl 部署 Nginx 并暴露服务访问控制配置 kubectl 和 RBAC 权限运维管理自动扩缩容、监控日志、版本升级资源清理删除集群避免费用GKE 作为 Kubernetes 的「原产地」服务在稳定性、生态和运维体验上都处于领先地位。掌握以上流程后你就可以在谷歌云上轻松运行生产级 Kubernetes 工作负载了。如果在实践中遇到问题欢迎在评论区交流讨论。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →