一个让我印象深刻的对比#
几年前,我和同组两位工程师都在处理同一个问题:K8s 集群的 Pod 频繁 OOMKilled。
A 的处理方式:把 memory limit 从 512Mi 调到 1Gi,问题消失,关单。
B 的处理方式:先跑了 pprof,发现是某个接口的处理逻辑每次请求都在反序列化一个大对象,没有复用,内存分配量随并发线性增长。改了几行代码,memory limit 反而从 512Mi 降到了 256Mi,并发能力提升了 3 倍。
两年后,A 还在做同类型的工作,只是工具换了一批。B 已经在主导新业务的架构设计。
他们的差距不是努力程度,也不是工作时间,而是处理问题时所处的认知层次。
三个阶段:执行层、理解层、设计层#
执行层:会用工具#
这个阶段的特征是:给我一个问题,我知道用哪个命令、哪个工具处理。
# 这类操作是执行层能力的典型代表
kubectl get pods -A | grep CrashLoopBackOff
helm upgrade myapp ./chart -f values-prod.yaml
ansible-playbook deploy.yml -i inventory/prod
执行层能力是入门必需的,但如果停留在这里,就会面临一个残酷的现实:所有工具都会被更新、替换、淘汰。Helm 有 Kustomize 竞争,Ansible 有 Terraform 竞争,Jenkins 被各种云原生 CI 替代。会用工具的人,每隔几年都要重新学一批工具。
执行层的另一个局限:面对没见过的问题,会卡住。排查一个陌生的故障,要靠搜索相似案例,而不是靠分析推导。
理解层:懂原理#
理解层的转变通常有一个标志性的时刻:某次故障让你不得不去读文档、读代码、理解底层机制。
我自己印象最深的是某次 K8s 节点 NotReady,表面原因是网络插件出问题,但深挖下去发现是 Terway CNI 在 IP 池耗尽时的边界处理有 bug,触发了 IP 泄漏,进而导致 DiskPressure、Pod Eviction,最终整个节点不可用。
这个排查过程让我理解了:
- K8s Node 的 condition 类型和触发逻辑
- CNI 插件分配 IP 的内部机制
- kubelet 驱逐策略的决策流程
- 阿里云 Terway 的具体实现和限制
这些理解是工具无关的。下次遇到类似问题,我有了分析框架,不需要靠运气碰到相似案例。
理解层的核心能力是:看到一个现象,能推断出可能的原因范围;调整一个参数,能预测它的影响。
设计层:做架构#
设计层不只是「会搭复杂系统」,更是在约束条件下做权衡的能力。
设计一个日志系统,选 EFK 还是 Loki?这不是有标准答案的题目,取决于:
- 现有团队对 Elasticsearch 运维的熟悉程度
- 日志量级和查询模式(全文检索还是标签过滤)
- 成本预算
- 是否需要长期存储
理解层的人能说清楚两者的技术差异,设计层的人能在给定约束下给出有说服力的推荐,并且在新信息出现时(比如团队成本压力变大)调整方案。
从理解层到设计层,需要的不只是更多技术深度,还需要系统思维——能看到组件之间的依赖、权衡不同方案的全局影响。
「会用 kubectl」到「理解 K8s 架构」的跨越#
这个跨越我认为有几个关键的「顿悟点」:
1. 理解 control plane 和 data plane 的分离
API Server、Scheduler、Controller Manager、etcd 组成 control plane,kubelet 和 kube-proxy 是 data plane。control plane 挂掉后,已有的 Pod 还会继续运行,只是不再处理新的变更。
这个理解很重要:生产故障里,API Server 不可用和 kubelet 不可用是完全不同的影响范围。
2. 理解 Reconcile Loop
K8s 的所有 Controller 都遵循同一个模式:for { actualState := get(); desiredState := spec(); reconcile(actual, desired) }。这个模式是声明式的本质。
当你理解了这个模式,就能理解为什么 kubectl apply 是幂等的,为什么 Deployment 的回滚是「创建新的 ReplicaSet」而不是「回退旧的操作」,为什么 GitOps 是可行的。
3. 动手写一个简单的 Operator
这是理解 K8s 扩展机制最快的方式。哪怕只是一个监听 ConfigMap 变化、自动重启相关 Deployment 的简单 Operator,写完之后对 informer、watch、reconciler 的理解会完全不同。
// 一个极简 reconciler 的骨架
func (r *MyReconciler) Reconcile(ctx context.Context, req reconcile.Request) (reconcile.Result, error) {
// 1. 获取当前状态
obj := &myv1.MyResource{}
if err := r.Get(ctx, req.NamespacedName, obj); err != nil {
return reconcile.Result{}, client.IgnoreNotFound(err)
}
// 2. 对比期望状态,执行变更
// ...
// 3. 更新状态
return reconcile.Result{RequeueAfter: time.Minute}, nil
}
编程能力:为什么运维工程师要学 Go 和 Python#
这个问题我被问过很多次。我的答案是:不是为了「会编程」这个头衔,而是为了扩大你能解决的问题边界。
Python 适合:
- 自动化脚本(巡检、数据处理、报告生成)
- 工具原型(快速验证一个想法)
- 对接各类 API(云厂商、监控系统、第三方平台)
Go 适合:
- 运维工具开发(K8s Operator、自定义 exporter、CLI 工具)
- 读懂 K8s、Prometheus、Etcd 的源码(它们都是 Go 写的)
- 性能要求高的场景
学编程的边界是:能写出能维护的代码,能读懂别人的代码。不需要成为纯软件工程师,但需要有足够的编程素养,在必要时能动手解决「现有工具解决不了」的问题。
一个实际案例:我们的日志系统需要把特定字段脱敏后再写入 Elasticsearch。现成的工具没有满足需求的配置,与其花大量时间研究 Logstash 的复杂 filter 配置,不如写 200 行 Python 处理器,嵌入 Vector pipeline 里,既简单又可维护。
技术深度 vs 广度:先 T 型,再 π 型#
刚入行时,我倾向于广度——各种工具都要会用。后来发现这个策略在求职时管用(简历上能写很多),但在解决深层问题时经常卡壳。
我后来的策略:先在一个方向打深,打深之后自然会带动相关方向的理解。
以 K8s 为例,深入理解 K8s 网络之后,你会自然地去理解 Linux 网络(iptables、namespace、veth)、CNI 插件机制、Service Mesh(istio 的 sidecar 注入原理),这些知识点之间有内在联系,一点通则其他点的学习成本大幅降低。
T 型:一个方向有深度,其他方向有基础广度。
π 型:两个方向有深度,之间有连接。比如「K8s 运维」+「可观测性」,或者「基础设施」+「编程开发」。
π 型是运维工程师往高级职位走的必要条件,因为复杂的架构问题往往跨越多个领域。
学习方法:生产踩坑才是最好的教材#
视频课程和书可以建立知识框架,但让认知真正固化的是在生产环境踩坑。
有几个具体的建议:
1. 每次处理完故障,写故障复盘
不是为了交差,而是为了自己留档。格式简单:现象 → 排查过程 → 根因 → 修复 → 预防措施。坚持半年,会发现自己建立了一套系统性的故障分析框架。
2. 读源码的时机:在你有具体问题的时候
带着「这个行为是怎么实现的」的问题去读源码,比从头通读效率高得多。比如:「为什么 kubectl apply 有时候会删掉我没有声明的字段?」带着这个问题去读 strategic merge patch 的实现,理解会非常深刻。
3. 在 staging 环境模拟生产问题
主动制造故障:把 etcd 某个节点 kill 掉看集群怎么反应,把节点打满内存看 HPA 和 OOMKiller 的行为,故意填错 CNI 配置看网络故障现象。主动踩坑比等着被动踩坑学到的多。
开源和写博客:是输出也是输入#
参与开源项目的最大价值不是「贡献了代码」,而是强迫你把模糊的理解变成精确的表达。给一个开源项目提 PR,你必须理解它的设计,写清楚改动理由,通过代码审查。这个过程会暴露你理解中的盲区。
写博客同理。我发现写作过程中最有价值的时刻是「写到某个地方发现说不清楚,去查资料,发现之前的理解是错的」。写博客的价值不在于写出来的文章,在于写作过程中的自我检验。
要避开的惯性陷阱#
陷阱一:把「会用工具」当核心竞争力
配置能力(会写 Prometheus 规则、会配 Grafana dashboard、会写 Helm chart)是重要的,但不是护城河。工具会变,配置语法会更新,SaaS 化之后甚至不需要手动配置。真正的护城河是理解工具背后解决的问题,这样换了工具也能快速上手。
陷阱二:只做重复性工作,等待机会
「先把手头的事做好,机会自然来」是一个温水煮青蛙的逻辑。重复性工作能让你做得更熟练,但不会让你进阶。进阶需要主动找到边界:去做那些「稍微超出当前能力」的事。
陷阱三:技术广度的焦虑
技术社区里总有新东西:新的 CNCF 项目、新的编程范式、新的云服务。盲目追新会让人陷入永远在学基础、没有深度的循环。选择性忽略是一种能力——知道什么东西值得现在学,什么东西等成熟了再看。
2026 年运维工程师的关键技能栈#
结合我自己的判断,值得深入投入的方向:
基础设施层
- Kubernetes 深度运维(不只是用,要能排查 control plane 问题)
- eBPF(Cilium、Pixie、Tetragon,这个方向会改变网络和可观测性)
- GitOps(ArgoCD/Flux,声明式运维的基础)
可观测性
- OpenTelemetry(统一 traces/metrics/logs 的标准,正在成为默认选择)
- 日志分析能力(Loki、OpenSearch,以及基于 AI 的日志异常检测)
编程能力
- Go(读 K8s 生态源码,写 Operator)
- Python(自动化、数据处理、AI 工具集成)
平台工程
- Internal Developer Platform 的概念和实践
- Backstage 或类似的开发者门户
- 成本优化(FinOps,云账单越来越大,懂成本的工程师很稀缺)
AI 辅助运维
- 不是「用 ChatGPT 写脚本」,而是理解 LLM 在 AIOps 场景的真实能力和局限
- 能把 AI 工具嵌入运维工作流(告警分析、根因推断)
最后#
运维这个领域有一个特别之处:它同时需要广度(了解整个技术栈)和深度(能深入某个组件的底层)。这使得它既难学又有价值——能把这两者结合好的人,在任何技术团队里都是稀缺的。
成长的路没有捷径,但有方向。带着问题学习,在生产上验证,把经验写下来——这三件事坚持做,不会让你失望。






