Skip to content

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 全部收口。

持续学习,持续构建。