DevOps工程师面试和落地到底考什么?我拆了37份JD、面了12家公司后的真实答案

🔑 关键词:DevOps工程师, Kubernetes, CI/CD, 平台工程, SRE

📖 摘要:不是工具清单。用37份JD、12场面试和一个4周落地案例,讲DevOps工程师怎么从YAML工具人变成用DORA和SLO说话的人。

先说我自己的样本:37 份 JD、12 场面试,DevOps 早就不是一个岗位

图片

2024 年 3 月到 6 月,我一边上班一边面了 12 家公司,有 70 人的 SaaS、300 人的跨境电商、两家云原生创业公司。顺手把 37 份 DevOps/平台工程/SRE 的 JD 丢进表格里数关键词:CI/CD 出现 35 次,Kubernetes 32 次,Terraform 28 次,云厂商 30 次,监控告警 24 次,脚本 27 次,安全 13 次,平台工程 11 次。面试里 8 家问 K8s,6 家让我现场设计流水线,5 家问故障排查,4 家追 Terraform state,3 家问云成本。

我的独立观点可能有点刺耳:DevOps 工程师的核心产出不是 YAML、不是 Jenkinsfile、也不是几套 Helm chart,而是把“从代码合并到用户可用”的等待时间,和“生产故障到恢复”的时间压下去。你写 800 行 K8s manifest,如果发布还要等 40 分钟、回滚靠人登机器,那不叫 DevOps,叫用新工具做传统运维。

四个角色别混为一谈,我面试时踩过坑

图片

角色 典型目标 常用指标 容易踩的坑
传统运维 机器别挂 可用性、工单量 把变更当风险,审批链太长
DevOps 工程师 加速交付且可恢复 DORA 四指标、SLO 变成工具链管理员,所有流水线都自己写
SRE 用工程手段控制可靠性 SLO、错误预算、MTTR 只盯可用性,忽略交付速度
平台工程 给开发者铺黄金路径 开发者等待时间、采用率、NPS 做了一堆没人用的门户

我面过一家 300 人公司,JD 写 DevOps,进去后 70% 时间在修 Jenkins 插件冲突,30% 在帮开发改 Dockerfile。二面我问:你们有 SLO 吗?面试官说“监控大盘有 CPU 和内存”。那一刻我知道这不是我要的岗位。另一个极端是创业公司,只有 3 个环境、8 个服务,却上了两个 K8s 集群,结果没人会排查 CoreDNS,发布窗口全靠创始人手动点。

所以我现在的判断标准很土:问三个数字。一天部署几次?变更失败率多少?MTTR 多少?答不上来,说明 DevOps 还停留在工具采购阶段。答得出来,哪怕没有 K8s,也值得聊。

图片

如果让我带一个 8 人后端团队,4 周只做这些

第 1 周做资产盘点,不写代码。把 8 个服务、3 套环境、6 个定时任务、4 个数据库、2 个缓存列清楚。每个服务标记负责人、语言版本、部署方式、回滚命令。Go 服务记 1.22,Node 记 20,Postgres 记 15,Redis 记 7.2。没有负责人就写“未知”,别假装有。

第 2 周只铺一条黄金路径。CI 用 GitLab CI 或 GitHub Actions 都行,阶段固定为 lint、test、build、scan、deploy。缓存 key 用 go-$CI_COMMIT_REF_SLUG,不要带 commit SHA,否则基本不命中。Runner 从 2C4G 升到 4C8G,并发从 1 调到 3。我们那条 Go 流水线从 14 分钟降到 5 分 40 秒,p95 是 4 分 12 秒。镜像用 Trivy 扫,CVSS >=7.0 直接阻断,镜像体积压到 300MB 以下,非 root,只读 rootfs。

图片

第 3 周加可观测性,别一上来搭 20 块大盘。先给一个核心接口定 SLO 99.9%,月度错误预算 43 分 12 秒。Prometheus 告警分两级:burn rate >14.4 且窗口 1 小时,发 page;burn rate >6 且窗口 6 小时,发 ticket。K8s 里 CPU requests 100m、limits 500m,内存 requests 128Mi、limits 256Mi 只适合小服务;Java 服务要把 -XX:MaxRAMPercentage=75 写上,否则 limits 256Mi 很容易 OOMKilled。HPA 设 min 2、max 10、target CPU 65%,PDB 设 minAvailable 1。

第 4 周做回滚演练。Argo CD 用 automated、prune true、selfHeal true,retry limit 5、backoff 5s,sync timeout 180s。数据库迁移用 expand-contract:先加列、双写、回填,再切读,最后删旧列。回滚命令写进 runbook:kubectl rollout undo deployment/foo --to-revision=3。演练一次,把 MTTR 从 42 分钟压到 11 分钟。做不到 11 分钟也别编,先记录真实值。

图片

面试被问“怎么做 CI/CD”,我现在的答法

别背“持续集成是频繁合并代码”。我会先反问:你们一天部署几次?变更失败率多少?回滚谁做?然后讲一个我自己的项目。S:8 个 Go 服务,Jenkins 单节点,构建 14 分钟,每周发 2 次。T:目标 p95 小于 6 分钟,失败率低于 15%。A:升 runner 到 4C8G,加 Docker layer cache 和 go mod cache,测试并行 4,Trivy 只扫变更镜像,Argo CD 自动同步。R:p95 4 分 12 秒,部署频率从每周 2 次到每天 1.8 次,失败率从 22% 降到 9%,MTTR 从 42 分钟到 11 分钟。

这套答法比“熟悉 Kubernetes、Docker、Jenkins”有用,因为面试官能继续追问:为什么失败率不是 0?因为数据库迁移和第三方支付回调就是会出问题,目标不是 0,而是可恢复。为什么不用蓝绿?因为 8 个服务里 3 个有状态,蓝绿成本高于滚动加 PDB。为什么 Argo CD 开 selfHeal?因为有人手动改过 prod 的 replica,结果 HPA 和 Git 状态打架。

图片

最后说点得罪人的

如果你现在只会写 Dockerfile 和 kubectl apply,别急着背 CKAD。花 2 周把一条流水线的 p95 等待时间从 18 分钟压到 6 分钟,比多考一张证有用。再花 1 周给一个服务加 SLO 和 burn rate 告警,最后写一份回滚 runbook 并真的演练一次。CKA 我考过,但真正让我拿到 offer 的,是一次 OOMKilled 排查和一次数据库迁移回滚方案。

DevOps 工程师的“深”,不是 YAML 写得长,也不是能背出 30 个 CNCF 项目。是你敢在事故群里说:先回滚到 revision 3,数据库迁移已经兼容旧代码,11 分钟后恢复。然后第二天把这次故障变成一条自动化检查、一个告警阈值、一段 runbook。工具会换,K8s 会换,Jenkins 会死,但这个循环不会。

🏷️ 标签: