01 它是干嘛的
GKE 是谷歌云上托管的容器编排服务。它来源于谷歌内部运行海量服务的经验,把「怎么在一大堆机器上安排成百上千个程序、保证它们正常运行」这件事自动化。你只需写下期望状态,系统负责把它实现并持续维持,出问题自动修复,机器不够自动加。
02 为什么会有它
2015 年之前:几千个程序跑在几万台机器上,靠人盯着根本管不过来
应用拆成很多小服务后,运维就变成一场灾难。你得手工决定哪个程序放在哪台机器、机器坏了上面的程序往哪搬、流量涨了怎么加机器、某个程序卡死了怎么重启。几百个服务乘以几千台机器,靠人写脚本和维护文档,几乎不可能不出错。
谷歌内部早就面对这个规模,为此自研了一套叫 Borg 的调度系统,把公司内部成千上万的服务统一安排到机房里,自动处理故障、扩容、发版。这套系统运行了十多年,积累了极其宝贵的经验。
2014 年,谷歌把这套经验重新设计后开源,命名为 Kubernetes,并在 2015 年与第一版正式发布一同推出托管服务 GKE。它带来了一个关键思想的转变:不再由人下命令「把 A 挪到 B 机器」,而是让用户写下「我想要三个这个程序的副本一直在跑」,剩下的全部交给系统。系统会不断对比「现在实际是什么样」和「你期望是什么样」,不一致就动手把现实拉回期望。这个「声明式期望状态 + 控制器持续调谐」的思路,是理解 Kubernetes 的钥匙。
03 它怎么工作
用户提交一份描述期望状态的文件,系统把这份描述存进一个统一的「账本」,再由一组常驻的控制器反复比对现实与期望,不断采取行动把两者对齐。
写下期望状态之后,系统是怎么一步步把它变成现实的
- 1① 提交声明式配置
用户写一份配置文件,说明「要跑哪个程序、几个副本、暴露哪个端口」,而不是逐步的操作命令。这份配置就是期望状态。
- 2② 存入统一的期望账本
配置被存进集群的中央存储,成为唯一的事实来源。所有组件都以这份账本为准,避免各自为政。
- 3③ 调度器挑选运行位置
调度器读取账本后,结合各台机器的剩余资源与约束条件,为每个程序副本挑选合适的机器。
- 4④ 节点代理拉起程序
目标机器上的代理程序负责拉取镜像、启动容器,并持续向中央汇报这个程序是否还活着。
- 5⑤ 控制器持续调谐
控制器不断对比账本里的期望与现实的状况:程序崩了就重启,副本少了就补一个,机器不够就申请扩容。这就是「调谐循环」,也是它能自愈的根本原因。
04 谁在用它
把一个应用拆成的几十个服务统一编排,各自独立扩缩容与发版,互不影响。
大促或活动期间流量暴涨时自动增加副本,闲时自动收缩,资源不浪费。
某个副本崩溃或某台机器失联时,系统自动把程序在别处重新拉起来,服务不中断。
按比例逐步把新版本放出来,观察指标正常再扩大,出问题快速切回旧版本。
开发、测试、生产用同一套配置描述,避免「本地能跑线上不行」的差异。
05 怎么用
需要懂一点容器与命令行,配好集群后主要靠一份份配置文件来管理应用。
- 01在云控制台创建一个集群,选择机器规格与节点数量,等待几分钟集群就绪。
- 02在本地配置好命令行工具,让它连接到刚创建的集群。
- 03编写一份部署配置,写明用哪个镜像、要几个副本、需要哪些资源。
- 04把配置提交给集群,观察它自动把副本调度到各台机器上跑起来。
- 05用命令行查看程序状态、扩缩容副本数、查看日志,并在需要时更新镜像版本完成发版。
# 1. 创建集群(也可在控制台完成)
gcloud container clusters create my-cluster --num-nodes=3 --zone=us-central1-a
# 2. 把本地的命令行工具指向这个集群
gcloud container clusters get-credentials my-cluster --zone=us-central1-a
# 3. 部署应用:声明期望状态为「3 个副本」
kubectl create deployment web --image=nginx --replicas=3
# 4. 观察它自动把 3 个副本调度并启动
kubectl get pods -w
# 5. 需要扩容时,只改期望副本数,系统自动补齐
kubectl scale deployment web --replicas=6避坑提示
- !一定要给每个程序设置资源请求与上限,否则某个程序吃光机器资源会影响同机器上的其他程序。
- !副本数要按业务的容错需求设置,只跑一个副本时,这个副本出问题就是服务中断。
- !不要手工去改集群里的实际状态,所有变化都应通过修改配置文件完成,否则会被调谐循环纠正回来。
06 关键概念
- 容器
- 把程序和它依赖的运行环境一起打包成的小盒子,换台机器也能一模一样地跑。
- 声明式
- 你只描述「最终要什么」,不描述「一步步怎么做」,具体实现交给系统。
- 调谐循环
- 不断对比期望状态与现实状态、发现不一致就修正的持续过程,是自愈的来源。
- 副本(Replica)
- 同一个程序的多个相同实例,多跑几份是为了分担流量并互为备份。