公司动态

运维校招笔试全解析:从Linux到Kubernetes调用containerd链路

📅 2026/8/31 15:23:25
运维校招笔试全解析:从Linux到Kubernetes调用containerd链路
前阵子我完整复盘了一份互联网公司校招运维工程师的笔试真题看下来印象很深。早年运维校招的笔试风格和现在完全是两个物种背一背Linux命令、记一下TCP状态码可能就能过现在一张卷子几乎是把操作系统、网络、中间件、容器、脚本编程、故障排查全部串在一起考还要求你在有限时间内写出能落地的方案而不是背出某个孤立的知识点。今天我把这套题的类型和考点拆开聊一聊再把其中最有代表性的几类题目展开讲透尤其会把Kubernetes调用containerd的完整链路单独拿出来梳理一遍。这篇文章适合正在准备运维工程师校招的同学也适合刚转行做运维、想系统梳理自己技术栈的朋友。1. 运维笔试到底在考什么从一份真题看能力模型在看具体题目之前先想清楚一个问题校招笔试不是为难你而是在用最短的时间筛出适合做运维的人。所以整张卷子的出题逻辑本质上是一份岗位能力模型的反向推导。考核维度可以拆成五块。第一是操作系统基本功进程调度、内存管理、文件系统、Linux常见命令这些是运维吃饭的家伙。第二是网络知识从TCP三次握手到HTTP状态码再到DNS解析流程网络不通是运维日常最常遇到的故障场景。第三是中间件与存储Redis、MySQL、Nginx、消息队列互联网公司的基础组件基本就围绕这几个方向出题。第四是容器与云原生Docker、Kubernetes、containerd这是最近几年笔试权重提升最明显的一块也是区分度最高的部分。第五是脚本编程与自动化Shell和Python至少得会一个笔试里会直接让你手写一段脚本解决某个实际问题。我整理了一下这类笔试的考核维度和对应题型分布方便你对照自测考核维度典型题型考察的核心能力操作系统与Linux进程状态分析、端口排查、文件系统管理基础命令熟练度 系统原理理解网络基础TCP状态机、HTTP状态码、DNS流程网络链路理解 排障思路中间件与存储Redis缓存策略、MySQL索引、消息队列选型组件原理 生产场景应用容器与云原生K8s Pod调度、CRI调用链、镜像构建云原生体系认知 动手排查能力脚本编程Shell/Python脚本实现监控、日志分析编码能力 自动化思维故障排查场景题CPU飙高、磁盘满、接口变慢排查方法论 书面表达从表格不难看出笔试里没有纯死记硬背的送分题每道题背后都挂着一个真实的生产场景。答的时候如果只是把知识点罗列出来得分很有限更好的答法是把思路写清楚让面试官看到你有完整的排查链路。另外网易有道的业务以在线教育、智能硬件、AI产品为主运维场景兼具高并发Web服务和新技术栈的双重特征所以卷子里容器和自动化相关的内容占比会比传统互联网公司更高。2. 操作系统与Linux笔试里最容易被低估的基础盘很多同学复习运维笔试喜欢直接冲K8s和容器结果在操作系统和Linux题上翻了车。实际上这块才是筛人的第一道关口因为它能最快看出你有没有真实操作过服务器而不是只看过书。2.1 进程与文件系统的高频考点笔试题里几乎必考进程状态。常见的有TASK_RUNNING、TASK_INTERRUPTIBLE、TASK_UNINTERRUPTIBLE、TASK_STOPPED、TASK_ZOMBIE这几种但不会直接问你定义而是给你一个场景比如“服务器负载突然升高top里看到大量D状态进程可能的原因是什么”D状态即不可中断睡眠通常是进程在做磁盘IO或者等待某些内核资源如果长时间不消失大概率是存储系统出问题了比如NFS挂载点失联、磁盘硬件故障。答这种题的关键是状态和场景要对应起来光写定义拿不到分写出排查方向才能得分。文件系统也是重灾区。软链接和硬链接的区别几乎每年都考但很多人只会写“硬链接不能跨文件系统、不能链接目录”没有讲透本质。硬链接本质是同一个inode的多个目录项软链接则是一个独立的文件里面存的是目标路径。笔试里如果让你“在/tmp下创建一个软链接指向某个配置文件并验证”你得知道ln -s和ln的区别还得知道ls -l查看链接指向、readlink读链接路径这些验证手法。2.2 Linux命令组合的答题套路还有一类是“给你一个故障机器用什么命令排查”的实操题。这种题要写的是组合拳不是单个命令。比如找CPU占用最高的进程很多人的答案就是top但实际上面试官想看的是能不能把问题定位到具体线程。我比较推荐的做法是四步走先top看一眼整体负载和CPU占用最高的几个PID再top -Hp PID找到这个进程下具体的线程然后用printf %x\n 线程PID把线程号转成十六进制最后通过jstack或者cat /proc/PID/task/线程ID/stack 去看线程栈。这套流程在笔试里写成文字答案得分会明显高过只写“用top看”的一行字答案。类似的还有端口排查。问“某个服务端口起不来怎么排查”答题顺序应该是ss -lntp确认端口有没有被监听再确认防火墙规则然后是SELinux是否拦截最后查服务日志。顺序本身也是一种得分点因为它体现了你排查问题是有逻辑的而不是乱试。注意做端口和进程类笔试题时一定要把命令的具体参数写出来比如ss -lntp而不是只写ss比如ps -ef而不是只写ps。参数错了会显得你没实操过。3. 网络与中间件构建排障的链路思维网络题和中间件题是运维笔试里最容易“一知半解”的部分。很多同学能背出TCP三次握手是SYN、SYNACK、ACK但问为什么需要第三次握手就卡住了这其实就是做题和做事之间的落差。3.1 TCP和HTTP的必考细节第三次握手的作用本质是防止历史连接请求突然到达服务端导致服务端建立无效连接并浪费资源。笔试如果出到这个点把“防止已失效的连接请求报文突然又传到服务端从而产生错误”写出来就够了最好再补一句“通过确认序号来同步双方初始序列号”这样答案就完整了。HTTP状态码也是必考但考的层次不一样。像502 Bad Gateway和504 Gateway Timeout的区别就是高频题前者是网关从上游收到了无效响应后者是网关在限定时间内没等到上游响应。放到Nginx场景里502通常意味着后端PHP-FPM或Java应用崩了504则意味着后端服务还活着但响应太慢把超时时间耗光了。两个状态码直接对应两种不同的排查方向这比单纯背状态码含义高一个层级。3.2 中间件题的生产场景化Redis和MySQL基本是校招笔试的常客。Redis这边缓存穿透、缓存击穿、缓存雪崩三兄弟是出题重灾区但大家答得都很空。比如缓存穿透布隆过滤器确实是一种解法但笔试里最好把思路说完整参数校验、缓存空值、布隆过滤器三层逐步递进这才是一个工程化的回答。缓存击穿则要说清楚互斥锁和逻辑过期两种方案的取舍以及热点key过期瞬间的高并发场景。MySQL这边索引失效和慢查询最常考。问“为什么建立了索引查询还是很慢”就不要只答“没走索引”要展开可能性索引列上做了函数运算、隐式类型转换导致索引失效、查询条件用了LIKE %xx、优化器估算后选择了全表扫描、数据区分度太低索引选择性差等。答出三到四个点区分度立刻就出来了。再有就是explain至少要会看type、key、rows、Extra这四列type出现ALL或者Extra出现Using filesort都是典型的优化切入点。3.3 链路思维是中间件题的核心把网络和中间件串起来看笔试真正想考察的是链路思维。一个用户请求从DNS解析、经过Nginx、到达应用服务、再访问Redis和MySQL中间任何一个环节出问题表象可能都是用户端“页面打不开”但排查路径完全不同。准备这类题的时候建议自己画一张完整的请求链路图把每一层的超时设置、负载均衡策略、主从切换逻辑都标上去笔试遇到“某一个接口突然变慢”之类的题目时你的解题思路自然就有层次了。4. 容器与Kubernetes把K8s调用containerd的原理讲透容器和K8s是近年运维笔试的重点也是最容易出现拉分题的地方。我见过不少同学能背出Pod、Deployment、Service的概念但问到“Kubernetes到底是怎么把容器跑起来的”就答不上来。这其实是面试官很看重的点因为它直接反映你对运行时链路的理解深度。4.1 从kubelet到containerd的完整调用链路Kubernetes本身不直接创建容器它只是负责编排和调度。真正干活的是节点上的容器运行时。kubelet是Kubernetes在每个节点上的代理负责管理Pod的生命周期但它和容器运行时打交道的方式是通过CRI也就是Container Runtime Interface一套基于gRPC的接口规范。完整的调用链大概是这样的API Server把Pod的定义下发给kubeletkubelet经过一系列校验和资源检查后调用CRI接口的RunPodSandbox拉起一个Pod沙箱再调用CreateContainer创建容器最后调用StartContainer启动容器。而CRI接口的实现者在大多数生产环境中就是containerd。containerd内部有一套自己的架构它对外提供gRPC服务但真正实现CRI的是containerd里的cri-plugin插件。这个插件把CRI请求转换成containerd内部的原生对象调用比如把CreateContainerRequest转换成containerd的container和task对象再交给containerd的core模块去处理。containerd本身不直接创建进程它通过containerd-shim进程拉起一个真正的低层运行时来干活这个低层运行时通常是runc。runc是OCI运行时规范的一个参考实现它负责真正调用Linux内核的能力通过namespace做隔离、通过cgroup做资源限制最终把容器进程启动起来。所以完整的调用链可以写成这样kubelet - CRI gRPC接口 - containerd cri-plugin - containerd核心 - containerd-shim-runc-v2 - runc - Linux内核namespace和cgroup这条链路笔试里如果能完整写出来基本就能拿到这部分的分数。如果再能补一句“containerd-shim的作用是在runc退出后仍保持容器标准输入输出和退出状态的管理并支持容器进程重新挂载”就更显功底了。4.2 为什么K8s抛弃dockershim改用containerd还有一个扩容知识点Kubernetes在1.24版本正式移除了dockershim。很多人以为这是Kubernetes和Docker闹掰了其实背后的逻辑很清晰。Docker本身是一套大而全的容器工具链它除了提供运行时还包含镜像构建、网络、存储、日志、Swarm集群等一大堆能力但对Kubernetes来说真正需要的只是一个符合CRI标准的容器运行时。dockershim只是Kubernetes为了兼容Docker而专门写的一个中间适配层这层适配一方面增加了维护成本另一方面也绕过了CRI标准导致Kubernetes在容器操作上无法直接利用Docker的一些新特性。containerd则是Docker从自身剥离出来、后来捐赠给CNCF的轻量级容器运行时它本身就实现了CRI且只关注容器的执行、镜像管理和存储挂载没有多余的功能。用containerd替代Docker调用链从kubelet到docker到containerd再到runc缩短为kubelet到containerd再到runc少了一层适配通信开销更低故障节点也更少。这也是生产环境普遍迁移到containerd的核心原因。笔试里把“当dockershim移除后节点上不再需要Docker daemonKubernetes直接通过CRI与containerd交互”这个演进逻辑写出来比单纯背版本号要有用得多。4.3 生产环境中排查容器创建失败的方法容器相关命题不仅考原理还喜欢结合排障出题。比如问“Pod一直处于ContainerCreating状态你如何排查”这类题答好了能一次性展示你对容器生态的熟悉程度。第一步是kubectl describe pod来看有没有Event级别的错误提示常见的是镜像拉取失败、存储卷挂载失败、CNI网络插件配置不对。第二步是登录到节点上用crictl ps -a确认容器实际状态crictl是containerd自带的命令行工具和docker ps的用法类似。第三步是crictl logs 查看容器日志重点看有没有panic、permission denied、not found之类的关键字。第四步是排查kubelet的systemd日志journalctl -u kubelet -n 200看看kubelet调用CRI时有没有报错。第五步才是考虑CNI网络问题检查/var/lib/cni目录和网络插件Pod是否正常。这套排查顺序体现的思路是从Kubernetes层的事件信息开始逐步下探到容器运行时、到进程、到网络插件每一层都有对应的工具和日志。笔试中答出这样的层次感面试官很容易看出你有真实排障经验。注意在写容器相关答案时用crictl而不是docker命令是加分项。因为生产环境已经迁移到containerd之后docker CLI默认是无法直接管理容器的这一点容易暴露你是“背过题”还是“实操过”。5. 脚本编程与自动化笔试手写题的得分套路校招笔试里的编程题占比不高但绝对是拉开差距的地方。通常不会让你写复杂算法而是让写一个小脚本解决运维场景里的实际问题比如批量查看服务器磁盘使用率、分析Nginx日志里Top IP、清理过期文件等。5.1 一道典型的Shell脚本题及写法举个例子题目可能是“写一个脚本监控所有分区使用率超过80%就打印告警并将结果写入日志”。如果直接甩一段代码出来只能拿基础分更好的做法是先把思路捋清楚再写代码。思路是用df -P列出所有文件系统使用率排除tmpfs和devtmpfs提取使用率数字与阈值做比较匹配到超限分区就拼接告警信息最后统一写日志。代码我给一个可直接用的版本#!/bin/bash THRESHOLD80 LOGFILE/var/log/disk_check.log DATE$(date %Y-%m-%d %H:%M:%S) df -P | awk NR1 $1!tmpfs $1!devtmpfs {print $5, $6} | tr -d % | while read usage mountpoint; do if [ $usage -ge $THRESHOLD ]; then echo [$DATE] WARN: $mountpoint usage ${usage}% ${THRESHOLD}% $LOGFILE fi done这段脚本里有几个细节是笔试得分点。第一个是df -P用-P保证输出格式不换行不会因为设备名太长导致后续字段错位。第二个是排除tmpfs和devtmpfs避免把内存文件系统的使用率误报出来。第三个是tr -d %把百分号去掉再用整数比较。第四个是把告警写入独立日志文件而不是简单输出到终端这符合生产脚本的可追溯要求。5.2 Python版本更适合复杂逻辑Shell适合处理文本和命令组合但业务逻辑一多就写得很费劲笔试中如果涉及简单文本处理完全可以改用Python。比如需要统计Nginx日志里访问量Top 10的IPPython版写起来会更清晰用正则提取IP、用Counter计数、再排序输出前10一气呵成。笔试时如果你时间充裕优先写Python因为代码可读性更好面试官审查起来也更轻松。写Python脚本时一定要注意异常捕获比如读取日志文件时文件不存在代码不能直接崩掉要用try/except包住。这看起来是一个小细节却体现了工程素养。很多同学的脚本在本地能跑放到笔试环境就跑挂差的就是这部分健壮性处理。5.3 脚本题的隐藏加分项脚本题拿高分的核心不只是“能跑”而是体现了运维工程的思维习惯。比如脚本里加了set -euo pipefail就能在变量未定义时报错、管道中间命令失败时立即退出这在生产环境里是保命符。笔试中写出这个说明你了解线上脚本的严谨性要求。另外脚本最好支持命令行参数而不是把阈值写死在代码里。用getopts接收参数或者给变量设默认值这看起来是小事在面试官眼里却是“这个人是写生产脚本的”和“这个人只在本地写过脚本”的本质区别。6. 故障排查题最接近真实工作的一类题目故障排查题是运维笔试的压轴题型也是最难临时抱佛脚的环节。它通常给你一个场景描述要求你说出排查思路和解决方案。这类题没有标准答案但有一套大家公认的答题框架先确认现象、再评估影响范围、然后提出假设并逐步验证、定位根因、恢复服务、最后做复盘总结。6.1 CPU飙高场景的排查思路比如场景题“某业务服务器CPU使用率持续飙高用户反馈接口响应变慢如何排查”。按框架来推导先确认现象通过top确认是用户态CPU高还是内核态CPU高用户态高通常是业务进程代码问题内核态高可能是上下文切换频繁、系统调用过多、或者软中断异常。再用ps -eo pid,ppid,%cpu,%mem,cmd --sort-%cpu找出CPU占用最高的前几个进程。如果是Java应用继续用jstack导出线程栈把线程PID转十六进制后在栈文件里搜索定位到具体代码行。这一步是整个排查的分水岭很多人能查到进程这一层但到不了线程和代码行这一层写出来自然就差了一截。6.2 磁盘空间满的隐藏坑点磁盘空间满看起来简单但笔试里会埋一个隐藏坑。真正的生产故障往往是“df -h显示还有空间但应用报磁盘满”原因是inode耗尽了。所以面试官希望你不仅会看df -h还要会看df -i。删除文件时如果文件被进程占用文件不会真正释放空间需要通过lsof | grep deleted找到占用进程再处理。能答出这两个细节这道题基本就立于不败之地了。6.3 接口变慢的链路排查接口变慢的场景题现在出题人喜欢把链路拉长。题目会告诉你服务架构涉及Nginx、应用、Redis和MySQL让你排查瓶颈。答这个题要靠前后端分离的思路逐步收窄先确认是单机问题还是集群问题如果单机问题看负载和带宽如果是集群问题再逐层排查先看接入层Nginx是不是过载连接数有没有到上限再看应用层线程池是否耗尽日志里有没有Timeout异常再查Redis慢日志和命中率最后看MySQL慢查询和锁等待情况。排查过程最忌讳眉毛胡子一把抓。我笔试时习惯在答题开头先写一句“我倾向于先缩小范围再定位具体瓶颈”这句话一下就框定了整个答案的走向面试官看到这句话就知道你有方法论的底子。下面整理一个高频故障场景速查表方便你考前快速过一遍故障现象首选排查命令高频根因处理动作CPU用户态高top, jstack, pidstat业务代码死循环、GC频繁导出线程栈定位代码优化或重启CPU内核态高vmstat, sar -w上下文切换过多、软中断异常调整内核参数排查网卡多队列磁盘空间满df -h, du -sh日志文件太大、临时文件未清理定位大文件配置日志轮转磁盘inode满df -i小文件数量过多find按数量找目录批量清理接口RT变长tracing工具、慢日志数据库慢查询、Redis大key优化索引拆分大keyPod创建失败kubectl describe, crictl ps镜像拉取失败、存储挂载失败修复镜像仓库检查PV配置7. 给准备运维校招的同学的几点实在建议说完了题目类型最后聊聊备考策略。这不是套话而是我自己带过校招生、也当过面试官之后的真实感受。第一简历上写的技术栈和笔试答出的内容必须一致。很多人简历里写“熟悉Kubernetes”结果遇到“Pod调度失败如何排查”这类基础题只能挤出一两句话面试官对简历的信任度会瞬间归零。宁可简历写“了解Kubernetes”把containerd的调用链、Pod生命周期答得足够扎实也好过写得很大但一戳就破。第二笔试答题一定要分清优先级。卷子通常题量大、时间紧我的策略是先把故障排查题和脚本题写完因为这类题是采分大项评分是按点给分写了就有分。名词解释和概念题放到后面能写几行就写几行不要在一道题上耗太久。第三练手环境一定要自己搭。只刷题是不行的建议自己在本地或云上搭一套K8s集群不用太复杂三个节点即可然后亲手把运行时从Docker切到containerd再用crictl走一遍拉镜像、查容器、看日志的流程。这个过程不用太久但做完之后你对CRI的理解和对命令的熟悉度是刷题给不了的。第四平时多积累“排查手记”。运维是一个经验学科笔试里的故障排查题本质上是在考察你见过的故障多不多。建议准备一个笔记每次遇到线上问题都按“现象、排查过程、根因、处理方式、复盘优化”五个维度记录下来考前过一遍比看任何辅导书都管用。最后再提醒一句校招笔试只是第一关它筛选的未必是现在技术最牛的人而是有潜力在真实生产环境里快速成长的人。所以答得不完美没关系只要思路清晰、层次分明、能体现你的工程素养就有很大概率能进入下一轮。保持这个心态把每一道题都当作一次和面试官的提前对话你会发现准备笔试这件事本身就是一个查漏补缺、快速提升的过程。