跳过正文
运维工程师的技术成长:从执行者到架构者的路径规划

运维工程师的技术成长:从执行者到架构者的路径规划

·413 字·2 分钟·
目录

一个让我印象深刻的对比
#

几年前,我和同组两位工程师都在处理同一个问题: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 工具嵌入运维工作流(告警分析、根因推断)

最后
#

运维这个领域有一个特别之处:它同时需要广度(了解整个技术栈)和深度(能深入某个组件的底层)。这使得它既难学又有价值——能把这两者结合好的人,在任何技术团队里都是稀缺的。

成长的路没有捷径,但有方向。带着问题学习,在生产上验证,把经验写下来——这三件事坚持做,不会让你失望。

Wenzhuo Huang
作者
Wenzhuo Huang
搞运维的工程师,写代码的运维人。专注 Kubernetes、AWS、GitOps 与基础设施可靠性。这个博客既是我的技术笔记本,也是我踩过的坑的受害者档案。

相关文章

SRE 实践心得:从运维到 SRE 的思维转变

·531 字·3 分钟
SRE 不是换了个头衔的运维,而是一套用软件工程思维解决可靠性问题的方法论。这篇文章记录了我在实践过程中最有感触的几个转变。

故障排查方法论:从现象到根因

·622 字·3 分钟
好的排查不靠直觉,靠方法。这篇文章总结了我在多次生产故障中提炼出的排查框架:从时间线构建到假设优先级,再到认知陷阱的识别与规避。

Python 自动化运维:从脚本到完整工具的工程化实践

·1559 字·8 分钟
系统梳理 Python 运维自动化的工程化方法:boto3 操作 AWS 资源、Kubernetes Python SDK 使用、Click/Typer CLI 框架选型、数据库批量运维脚本、钉钉 Webhook 集成,以及类型注解与错误处理的实践经验。