IT策士 10余年一线大厂经验,专注 IT 思维、架构、职场进阶。我会在各个平台持续发布最新文章,助你少走弯路。
Kubernetes 面试早已不是背几个 YAML 就能过关的时代。面试官越来越喜欢从一个简单的 Pod 创建,一路刨根问底到调度、网络、存储、安全乃至集群故障推演。下面我整理了 50 个高频问题,分成七大模块,每个问题都配上“为什么这么问”的解读和一线实战场景,帮你把零散的知识串成体系。
一、基础概念与架构
1. Kubernetes 是什么?用一句话概括它的核心价值。
解读:不要背书式罗列功能,要说出它对业务的意义。
例子:“K8s 是一个声明式的、自愈的容器编排平台,它把基础设施的复杂度抽象成 API 对象,让应用可以像‘期望状态’一样被驱动,而非手动执行每一步。比如你声明副本数=3,它就会持续调谐,确保始终有 3 个实例在跑。”
2. K8s 架构中有哪些核心组件?它们如何协同?
解读:清楚数据流向才能定位问题。
例子:用户kubectl apply提交 Deployment → API Server 写入 etcd → Deployment Controller 发现期望副本与当前不符,创建 ReplicaSet → ReplicaSet Controller 创建 Pod(pending)→ Scheduler 为 Pod 选择一个 Node 并绑定 → 对应 Node 上的 kubelet 收到事件,调用容器运行时启动容器 → kube-proxy 更新 iptables/IPVS 规则让 Service 指向新 Pod。中间任何一步卡住,都会表现为 Pod 长时间 Pending 或 CrashLoopBackOff。
3. etcd 在集群中的地位?它挂了会怎样?
解读:这道题考的是你对控制面故障半径的理解。
例子:etcd 是唯一有状态存储,所有资源对象的期望状态都存在里面。如果 etcd 不可用,API Server 无法读写,kubectl 报错connection refused,新 Pod 无法调度,但已运行的容器不受影响。生产上一定要做 etcd 定期备份(etcdctl snapshot save)和至少三个节点的高可用。
4. 什么是控制器模式(Controller Pattern)?举一个典型控制器。
解读:控制器是“调谐循环”的实现,它把当前状态向期望状态拉近。
例子:Deployment Controller 看到 ReplicaSet 只有 2 个 Pod,期望 3 个,它就会向 API Server 发送补丁,最终由 ReplicaSet Controller 去创建新 Pod。这个过程不是一次性命令,而是一个无限循环,每隔一段时间就对比 diff。
5. 简述 Kubernetes 对象的 Spec 和 Status 的含义。
解读:面试官想确认你是不是只懂 YAML 表面。
例子:Deployment 的 Spec 里写 replicas: 3,Status 里显示 readyReplicas: 2。控制器会不断检测这个差值,并作出动作,直到 Status 与 Spec 匹配。这就是声明式 API 的心脏。
二、Pod 与容器
6. 一个 Pod 里包含多个容器,它们的网络和存储如何共享?
解读:考 Pod 的本质是共享 Namespace。
例子:Pod 内所有容器共享同一个 Network Namespace(同一个 IP、端口空间)、IPC Namespace,还可以共享通过volumes字段声明的 Volume。比如 sidecar 日志采集容器和业务容器共享同一个emptyDir卷,业务写日志,sidecar 实时 tail 并发送到日志中心。
7. Init 容器有什么用?和普通容器有什么不同?
解读:Init 容器按顺序串行运行,且必须全部成功 Pod 才会启动普通容器,非常适合做前置依赖检查。
例子:部署一个需要数据库就绪的 Web 应用,Init 容器里跑while ! nc -z mysql 3306; do sleep 2; done,确保 MySQL 可达后才启动 Web 容器,避免应用崩溃重启。
8. Pod 的生命周期阶段有哪些?CrashLoopBackOff 是怎么形成的?
解读:Pending → Running → Succeeded / Failed,中间还有 ContainerCreating。CrashLoopBackOff 表示容器启动后很快退出,kubelet 按指数退避(10s, 20s, 40s…)不断重启。
例子:写了一个 Java 应用,JVM 堆内存不足直接 OOM kill,Exit Code 137,Pod 立即进入 CrashLoopBackOff。解决方法是调整resources.limits.memory或加 JVM 参数-Xmx。
9. 探针(Probe)有哪几种?如何设计才不会让服务频繁抖动?
解读:startupProbe(慢启动保护)、livenessProbe(死则重启)、readinessProbe(不摘流量)三者组合。
例子:一个 Java 应用启动需要 90 秒,若只配 liveness 的 initialDelaySeconds=30,Pod 刚启动就被连续探死而重启。加上 startupProbe 检测/actuator/health,在成功前不启用 liveness,可以完美解决。
10. 如何让 Pod 在指定节点上运行?给出两种以上方式。
解读:nodeSelector(简单)、nodeAffinity(丰富规则)、nodeName(绕过调度器直接指定,慎用)。
例子:GPU 任务需要运行在带gpu=true标签的节点上,先用nodeAffinity requiredDuringSchedulingIgnoredDuringExecution写硬亲和,再搭配tolerations容忍 GPU 节点的专属污点,确保不会误调度到普通节点。
三、调度与资源管理
11. requests 和 limits 的区别是什么?只设 limits 不设 requests 会怎样?
解读:requests 用于调度(决定 Pod 放到哪个 Node 的资源预留),limits 是上限。如果只设 limits,requests 默认等于 limits,Pod 会预留大量资源,导致节点可调度资源被浪费。
例子:一个日志解析器,平时只用 200m CPU,突发能到 1 核。合理设置 requests=200m, limits=1,这样调度时按 200m 预留,运行时允许突发到 1。
12. 资源服务质量(QoS)有哪几种?OOM 时按什么顺序杀 Pod?
解读:Guaranteed(requests==limits)、Burstable(requests<limits)、BestEffort(没设资源)。OOM 时 BestEffort 先被 kill,再是 Burstable 中内存使用超出 requests 部分较多的,最后才是 Guaranteed。
例子:生产上把核心支付服务的资源设为 Guaranteed(req=lim=4Gi),避免因其他 Pod 内存膨胀而连带被杀。
13. 污点与容忍(Taint & Toleration)有什么典型应用?
解读:Taint 排斥 Pod,Toleration 允许 Pod“忍得住”。常用于专属节点、故障隔离。
例子:集群中有三个高配节点只用于实时计算,打上 Taintreal-time=true:NoSchedule,Spark Driver Pod 加上对应的 Toleration,普通业务 Pod 就调度不上去,保证了资源独占。
14. 优先级与抢占(Priority & Preemption)是如何工作的?
解读:当高优先级 Pod 无法调度时,会驱逐低优先级 Pod。需要配合 PriorityClass。
例子:将监控 Agent 设为priorityClassName: system-cluster-critical,当集群资源紧张时,监控 Pod 可以踢走普通开发测试 Pod,保证监控链路不中断。
15. 调度器如何为 Pod 选择一个节点?
解读:分预选(过滤不满足条件的节点)和优选(给剩余节点打分),最终选最高分节点。
例子:Pod 要求 4Gi 内存且需要ssd=true。调度器先过滤出满足内存且带 ssd 标签的节点,再根据优选策略(LeastRequestedPriority、BalancedResourceAllocation 等)打分。你可以通过kubectl get events看到 Scheduling 失败的具体原因。
16. DaemonSet 的调度和 Deployment 有何不同?
解读:DaemonSet 保证每个节点运行一个 Pod 副本,会绕过通常的调度策略,但可以受 Taint/Toleration 影响。底层是通过给 Pod 加上nodeName直接绑定。
例子:用 DaemonSet 部署 Fluentd 日志采集器,确保新加入的节点也会自动运行一份,节点下线 Pod 随之消失。
17. Horizontal Pod Autoscaler (HPA) 的扩缩容依据是什么?一次性能扩多少?
解读:基于 CPU/内存/自定义指标,默认每隔 15s 检查,扩容每次最多翻倍,缩容有 5 分钟稳定窗口避免抖动。
例子:电商大促,下单服务 CPU 飙升到 80%,HPA 迅速将 Pod 从 10 扩到 20,再逐渐稳定到 15。设置--horizontal-pod-autoscaler-downscale-stabilization避免短时间反复缩容。
18. 如何避免 Pod 被驱逐(Eviction)?
解读:节点资源紧张时,kubelet 按 QoS 和优先顺序驱逐。可以通过设置合理的 Qos、优先级,以及 Pod Disruption Budget(PDD)来保护。
例子:数据库 StatefulSet 设置 PDBminAvailable: 1,确保即使节点维护,也至少有一个副本存活,不会同时驱逐导致服务完全中断。
四、服务发现与网络
19. ClusterIP、NodePort、LoadBalancer 和 ExternalName 四种 Service 类型的区别?
解读:从内部虚拟 IP 到外部流量的递进。
例子:内部微服务间调用用 ClusterIP(如order-svc:80);给集群外部暴露用 NodePort 或 LoadBalancer;要跨集群或指向外部 DNS 用 ExternalName,如将my-db指向rds.xxx.com。
20. Service 如何将流量路由到 Pod?kube-proxy 的三种模式比较。
解读:userspace(已淘汰)、iptables(默认,线性规则,大规模性能下降)、IPVS(性能好,支持多种负载均衡算法)。
例子:一个集群有 2000 个 Service,iptables 模式下更新规则会卡几十秒,改用 IPVS 后规则下发在毫秒级,并支持轮询、最少连接等算法。
21. Ingress 和 Service 有何不同?Ingress Controller 的工作流程。
解读:Service 是 L4 转发,Ingress 是 L7 路由,提供基于 HTTP Host/Path 的负载均衡及 SSL 终结。
例子:同一域名api.example.com下/user路由到用户服务,/order路由到订单服务,只需一条 Ingress 规则配多个 path,背后由 Nginx Ingress Controller 动态刷新 upstream。
22. 网络策略(NetworkPolicy)是如何实现微隔离的?
解读:通过标签选择器和命名空间控制 Pod 间的流入流出流量,需要 CNI 插件支持(如 Calico、Cilium)。
例子:只允许前端 Pod 调用后端 API 的 8080 端口,拒绝其他所有命名空间的入站流量。在敏感数据服务前面加上 NetworkPolicy,成为“零信任”内网的第一道门。
23. Pod 间通信为什么不需要 NAT?CNI 插件做了什么?
解读:CNI 确保每个 Pod 拥有唯一的集群可达 IP,跨节点时通过隧道或路由解决。
例子:Calico 基于 BGP 分发路由,使 Pod IP 在宿主机网络中直接可达,没有额外的隧道开销,适合对延迟敏感的应用。
24. CoreDNS 在集群中扮演什么角色?CoreDNS 挂了会怎样?
解读:集群 DNS 服务,解析 Service 名称。挂了之后,Pod 间通过 Service 名称调用会失败(除非使用 IP 或环境变量),默认返回 NXDOMAIN。
例子:生产上给 CoreDNS 配置 HPA,并搭配podAntiAffinity使其分散在不同节点,避免单点故障导致整个集群域名解析瘫痪。
25. Headless Service 和普通 Service 的区别,什么场景用?
解读:clusterIP 设为 None,DNS 直接返回 Pod IP 列表,而非一个虚拟 IP,适合有状态服务自主发现。
例子:Kafka StatefulSet 使用 Headless Service,客户端拿到所有 Broker Pod 的 IP,直接建立长连接,不受 Service 代理转发的限制。
26. 怎么排查 Service 无法访问 Pod 的问题?
解读:有固定的“四步走”定位法。
例子:一上线发现curl my-svc超时。第一步kubectl get endpoints确认后端 Pod IP 是否存在;第二步在相同命名空间起一个 busybox 直接 curl Pod IP,确认容器端口正常;第三步检查 kube-proxy 规则(iptables -t nat -L),是否被误刷;第四步检查 NetworkPolicy 是否丢弃了流量。最后发现是 NetworkPolicy 只放行了 8080 而实际监听 8081。
五、存储
27. Volume 有哪些常用类型?emptyDir、hostPath、PV/PVC 的差异。
解读:emptyDir 生命周期绑定 Pod,Pod 删数据丢;hostPath 挂载宿主机目录,调度到不同节点数据不在;PV/PVC 提供持久化,独立于 Pod 生命周期。
例子:用 emptyDir 做缓存或临时文件,同一 Pod 内两个容器共享;用 hostPath 挂载 Docker socket 实现 DinD;用 PVC 绑定云盘提供给 MySQL StatefulSet 持久化数据。
28. PV 的访问模式(AccessModes)有哪些?ReadWriteMany 底层通常需要什么存储?
解读:RWO(单节点读写)、ROX(多节点只读)、RWX(多节点读写)。RWX 需要支持多挂载的文件系统,如 NFS、CephFS、AWS EFS。
例子:多个 Ingress Controller 共享同一个 RWX 卷存放 TLS 证书,更新一次所有 Pod 即时生效。
29. StorageClass 和动态供给是如何工作的?
解读:StorageClass 定义“存储类”及 provisioner(如 AWS EBS、Ceph RBD),PVC 指定 storageClassName,provisioner 自动创建 PV 并绑定。
例子:开发者只需创建 PVCstorage: 10Gi, storageClassName: ssd,即可在 10 秒内获得一个 SSD 云盘,无需运维预先创建 PV。
30. StatefulSet 如何保证 Pod 的有序性和持久化标识?
解读:Pod 名称固定(如 mysql-0, mysql-1),按序号串行启动/终止,每个 Pod 可绑定独立 PVC。
例子:3 副本的 ZooKeeper,myid 通过 Pod 序号动态生成,每个节点数据写到自己的 PV,即使 Pod 被重调度到新节点,PVC 跟着 PV 重新挂载,数据不丢。
31. PV 处于 Released 状态无法被新 PVC 绑定的原因和解决方法。
解读:PV 的 Reclaim Policy 默认为 Delete/Retain,如果是 Retain,PVC 删除后 PV 变为 Released,需管理员手动清除 claimRef 后才能再次可用。
例子:生产上误删 PVC 后发现 PV Released,通过kubectl patch pv pv-name -p '{"spec":{"claimRef": null}}'让它回到 Available,再被新的 PVC 绑定,避免了数据丢失后重复创建。
32. 如何备份和恢复 etcd 以及 StatefulSet 数据?
解读:etcd 本身快照,业务数据用 CSI 快照或 Velero 等工具。
例子:定期在 cronJob 里执行etcdctl snapshot save /backup/etcd.db,业务层面用 Velero 每小时备份 PostgreSQL 的 PVC,误删整个命名空间后 10 分钟完成恢复。
六、安全
33. RBAC 中 Role 和 ClusterRole 的核心区别?
解读:Role 限于一个命名空间,ClusterRole 是集群级别或应用于所有命名空间。
例子:给开发组只读权限用 ClusterRoleview,通过 RoleBinding 绑定到各自命名空间;用 ClusterRole 允许查看所有节点的信息,这是一个非命名空间资源。
34. 什么是 ServiceAccount?Pod 如何自动获取其 Token?
解读:每个命名空间有默认 ServiceAccount,Pod 创建时会自动挂载/var/run/secrets/kubernetes.io/serviceaccount/token。
例子:应用通过读取该 token 调用 API Server,从而获取同一命名空间下的 ConfigMap 内容。从 1.24 起 Token 不再自动挂载为永不过期的 Secret,而是由 kubelet 投射出有时效的 Token,更安全。
35. SecurityContext 可以在哪些级别设置?举一个加固容器安全的例子。
解读:Pod 级和容器级。可设置runAsNonRoot: true、readOnlyRootFilesystem: true、capabilities.drop: ["ALL"]。
例子:一个 Node.js 应用只监听 8080,不需要写任何文件,就用readOnlyRootFilesystem: true,即使被攻破也无法植入恶意程序;用runAsUser: 1000禁止 root 运行。
36. Pod Security Standards (PSS) 是什么?如何替代 PSP?
解读:PSP 已在 1.25 移除,PSS 定义了 privileged、baseline、restricted 三级策略,可通过命名空间标签或 Admission Controller 执行。
例子:给prod命名空间打标签pod-security.kubernetes.io/enforce=restricted,凡是使用了 hostPath 或跑了特权容器的 Pod 都会被拒绝创建。
37. 如何给 Ingress 配置 TLS?证书如何自动管理?
解读:创建 Secret 存放证书,Ingress 引用tls字段。可以配合 cert-manager 自动从 Let’s Encrypt 申请并续期。
例子:创建一个 Issuer,通过 DNS-01 或 HTTP-01 验证,cert-manager 自动生成 Order 获取证书,续签完全透明,彻底告别证书过期引起的线上事故。
38. 镜像安全扫描和准入控制在生产是怎么连动的?
解读:镜像上传后触发扫描(如 Trivy),配合 OPA/Gatekeeper 等准入 webhook,扫描到高危 CVE 就拒绝部署。
例子:CI 流水线 push 镜像后,镜像仓库自动扫描,若 Critical 漏洞数 >0,则打上标签,集群内的 Gatekeeper 配置策略deny-images-with-critical,任何包含该标签的镜像部署都会被拦截。
七、监控、日志与排错
39. 怎么用一行命令实时查看集群所有 Pod 的资源使用?
解读:kubectl top pod --all-namespaces,依赖 Metrics Server。
例子:发现节点 CPU 飙高,kubectl top pod -A --sort-by=cpu列出前几位 CPU 大户,再结合kubectl describe pod看 requests/limits,决定是否需要调整 HPA。
40. 如果 Pod 一直 Pending,你从哪几个方向排查?
解读:资源不够、污点不匹配、PVC 未绑定、节点选择器错误、镜像拉取失败(还有 ImagePullBackOff 等)。
例子:用kubectl describe pod看 Events 中的 FailedScheduling 信息,若提示0/3 nodes are available: 3 Insufficient cpu,说明资源不足;若提示node(s) had taint {gpu=true: },说明缺少 Toleration。
41. CrashLoopBackOff 常见原因有哪些?如何获取容器上一次退出日志?
解读:启动命令错误、端口冲突、OOMKilled、探针失败、挂载卷权限等。可用kubectl logs --previous看容器上次崩溃的标准输出。
例子:Java 应用被 OOM kill,Exit Code 137,kubectl logs --previous看到 OutOfMemoryError,调整limits.memory后问题解决。
42. 集群某个节点的 NotReady,怎么系统性地恢复?
解读:先看kubectl describe node的 Conditions,常见原因:kubelet 挂掉、容器运行时不健康、磁盘空间满、网络分区。
例子:MemoryPressure或DiskPressure变为 True,ssh 到节点df -h发现 /var 满(Docker 镜像或日志),清理无用镜像docker system prune并配置 logrotate,节点自动恢复 Ready。
43. CoreDNS 解析超时或 5 秒延迟,可能的原因?
解读:常见的是 Linux 内核 conntrack 竞争导致 DNS 丢包,或使用 .svc.cluster.local 后缀的 5 秒查找问题。
例子:应用里配置的是mysql,实际请求会依次尝试搜索域,若有 ndots 问题,可用dnsConfig修改 Pod 的 ndots 为 2,或直接用 FQDNmysql.default.svc.cluster.local。
44. 如何追踪一个请求在集群中的完整链路?
解读:Service Mesh(Istio/Linkerd)注入 Sidecar 自动埋点,或应用内使用 OpenTelemetry,结合 Jaeger 可视化。
例子:一个下单请求经过 Ingress → 订单服务 → 库存服务 → 支付服务,通过 Jaeger 一眼看到库存服务耗时 300ms 占了整个链路的 80%,进而优化 SQL。
45. 如果 etcd 出现性能问题(高延迟),怎么定位?
解读:用etcdctl endpoint health和etcdctl endpoint status检查 leader 是否存在、DB 大小、fsync 延迟。
例子:突然 kubectl 卡顿,发现 etcd DB 已膨胀到 4GB 且频繁 compaction,原因是某个控制器频繁更新大量 status。通过限流该控制器,并定期etcdctl compact后恢复正常。
46. 如何安全的驱逐一个节点上的所有 Pod?
解读:kubectl drain <node> --ignore-daemonsets --delete-emptydir-data,它会先 cordon 节点不再调度,再驱逐 Pod。
例子:节点需要硬件维修,先 drain 节点,确认 StatefulSet Pod 在新节点上重新 Ready 且 PDB 未违反,再执行维修。
47. 有多个集群时,如何高效管理和切换上下文?
解读:用kubectx和kubens,或原生的kubectl config use-context,配合 alias 快速切换。
例子:集群 A 的生产、测试,集群 B 的生产,通过kubectx prod-a一秒切入,避免kubectl get pods跑到了错误集群的噩梦。
48. 描述一次你排查生产事故的过程(开放题)。
解读:面试官想看你的排查方法论,不是结果。
例子:从监控告警发现 5xx 飙升 → Grafana 看上游服务延迟正常,下游数据库慢查询增多 → 查 Deployment 刚做过滚动更新 → 对比新旧 Pod 日志发现新版本缓存未预热 → 紧急回滚 → 事后完善上线预热脚本,加 readiness gate 确保缓存就绪才接流量。
49. 怎么确保 Kubernetes 集群升级零停机?
解读:使用多副本高可用控制面,分批升级节点,配合 PodDisruptionBudget 和 preStop 钩子。
例子:升级工作节点时,先 cordon,drain,升级 kubelet,uncordon。对 API 敏感的应用,设置terminationGracePeriodSeconds: 60,并 hook preStopsleep 15,让 Service 端点下线先于容器退出。
50. 你认为 Kubernetes 未来在哪些场景下会进一步取代传统运维?
解读:开放式问题,展示你对云原生趋势的判断。
例子:边缘计算(K3s/KubeEdge)、AI/ML 工作负载调度(Volcano 对批处理任务的增强)、混合多云管理。有统一 API 的地方,K8s 就能成为“基础设施的操作系统”。
想了解更多还可以去各个平台搜索「IT策士」,一起升级 IT 思维 !