K8s 面试题集:从六个问题收口
属于 S7 K8s 容器编排 · 收口篇 上一篇:高可用与故障排查
K8s 的高频问题,每题练到连续追问三层。
Q1:为什么 Pod 是最小调度单位,而不是直接调度容器?
同 Pod 的容器共享网络(同一个 IP/端口空间)和存储卷,适合"强耦合、同生共死"的组合(主容器 + 边车);调度、扩缩容、健康检查都以 Pod 为单位。
追问:什么时候一个 Pod 里放多个容器? 强耦合且要共享生命周期,如主服务 + 日志采集 sidecar、主服务 + 本地缓存代理。
追问:Pod 之间怎么通信? 每个 Pod 有集群内唯一 IP,直接互通(CNI 实现),跨 Node 也一样,不需要 NAT。
Q2:Deployment 滚动更新是怎么做的?
生成新的 ReplicaSet,逐步"起新删旧"交替进行,受 maxUnavailable(最多几个旧实例不可用)和 maxSurge(最多超配几个新实例)约束。
追问:怎么保证新版本不把流量打崩? readiness 探针就绪才接流量,就绪失败自动暂停发布。
追问:怎么回滚? kubectl rollout undo deployment/<name>,回到上一个 ReplicaSet。
Q3:Service 怎么找到 Pod?
label selector 选中一组 Pod,IP 列表写进 Endpoints;kube-proxy 把 Service 规则转成 iptables/IPVS 规则,流量到达任意 Node 都能转发到目标 Pod。
追问:Service 有哪几种类型? ClusterIP(集群内虚拟 IP)、NodePort(节点固定端口对外)、LoadBalancer(云厂商 LB 挂 NodePort)。
追问:Pod 挂了 Service 会怎样? Endpoints 自动剔除该 Pod,流量只发给健康 Pod,客户端无感。
Q4:三种探针的区别?
livenessProbe 管"活不活"(死了重启),readinessProbe 管"能不能接客"(暂时摘流量不重启),startupProbe 管"慢启动保护"(给足启动时间防误杀)。
追问:为什么滚动更新一定要 readiness? 新 Pod 没就绪就接流量会 502,readiness 失败会自动从 Service 摘除。
追问:探针怎么实现? httpGet(请求 HTTP 路径)、tcpSocket(探测端口)、exec(执行命令看退出码)。
Q5:requests 和 limits 的区别?
requests 是最低资源需求,是调度依据;limits 是使用上限——CPU 超限被限速,内存超限被 OOMKilled。
追问:内存超 limits 会怎样? 容器被杀(exit code 137),kubelet 重启它,反复崩溃就成了 CrashLoopBackOff。
追问:Go 服务怎么避免 OOM? GOMEMLIMIT 设为容器 limits 的 70~80%,给 Go 运行时和其他开销留余量。
Q6:K8s 集群怎么做到高可用?
多个 API Server 挂 LB;etcd 3-5 节点 Raft 多数派;Controller Manager / Scheduler 多副本 + leader 选举。
追问:etcd 挂一个节点会怎样? 3 节点容忍挂 1 个,5 节点容忍挂 2 个;挂超半数集群只读不写。
追问:控制面挂了业务还跑吗? 存量 Pod 照跑,但无法变更、无法自愈(控制器读不到状态就没法补 Pod)。
自测清单
六题 + 追问全答上,S7 过关。至此后端技术栈从存储、缓存、消息、微服务到工程化底座 K8s 全部收口。