第十部分:面试题库与进阶路径
系统化的知识检验与职业发展指南
目录
原理类面试题
Linux 基础(20题)
1. 进程调度
Q1: 解释 CFS 调度器的 vruntime 机制
点击查看答案
核心原理:
- vruntime = 实际运行时间 × 1024 / 进程权重
- 权重由 nice 值决定:weight = 1024 / (1.25 ^ nice)
- CFS 总是选择 vruntime 最小的进程运行
- 保证所有进程获得公平的 CPU 时间
示例:
# 进程A: nice=0, weight=1024
# 运行1ms后 vruntime = 1 × 1024 / 1024 = 1ms
# 进程B: nice=5, weight=335
# 运行1ms后 vruntime = 1 × 1024 / 335 = 3.06ms
面试加分点:
- 提到红黑树数据结构
- 提到 NUMA-aware 调度
- 提到 CPU throttling 问题
Q2: Go 语言的 GMP 模型如何工作?
点击查看答案
组件:
- G (Goroutine): 用户态协程
- M (Machine): 系统线程
- P (Processor): 逻辑处理器,数量 = GOMAXPROCS
调度流程:
- 每个 M 必须绑定一个 P 才能执行 G
- P 维护本地队列(最多256个G)
- 全局队列作为后备
- Work Stealing:空闲的 P 会从其他 P 偷取 G
关键优化:
- 避免频繁的系统调用切换
- 本地队列减少锁竞争
- 网络 I/O 使用 netpoller(epoll)
面试加分点:
- 提到系统调用时的 M 切换
- 提到 sysmon 监控线程
- 提到 spinning thread 机制
2. 内存管理
Q3: 解释 Linux 虚拟内存的工作原理
点击查看答案
多级页表:
- x86_64: 4级页表(PGD → PUD → PMD → PTE)
- 页大小:默认 4KB,支持大页(2MB/1GB)
缺页中断处理:
- 访问未映射的虚拟地址
- CPU 触发 Page Fault
- 内核分配物理页
- 建立页表映射
- 返回用户空间继续执行
内存分配路径:
malloc()
→ glibc ptmalloc
→ brk() [小于128KB]
→ mmap() [大于128KB]
→ 内核 buddy 系统
→ 物理页分配
面试加分点:
- TLB(Translation Lookaside Buffer)
- Copy-on-Write 机制
- Transparent Huge Pages(THP)
Q4: OOM Killer 如何选择要杀死的进程?
点击查看答案
选择算法:
oom_score = (RSS + Swap) / 总内存 × 1000 + oom_score_adj
关键因素:
- 内存使用量(RSS + Swap)
- oom_score_adj 调整值(-1000 到 1000)
- 特权进程(root)有轻微保护
查看和调整:
# 查看 OOM 分数
cat /proc/<pid>/oom_score
# 调整分数(需要 root)
echo -500 > /proc/<pid>/oom_score_adj
Kubernetes 中的应用:
- Guaranteed: oom_score_adj = -997
- Burstable: oom_score_adj = min(max(2, 1000 - memory_request/memory_limit × 1000), 999)
- BestEffort: oom_score_adj = 1000
面试加分点:
- 容器级 OOM vs 系统级 OOM
- cgroup memory.oom_control
- oom_kill_allocating_task 参数
3. 网络栈
Q5: 数据包在 Linux 网络栈中的完整路径?
点击查看答案
接收路径:
网卡 → DMA → Ring Buffer → 硬中断 → 软中断(NET_RX_SOFTIRQ)
→ netif_receive_skb() → IP 层 → TCP 层 → Socket Buffer
→ 用户空间 recv()
发送路径:
用户空间 send() → Socket Buffer → TCP 层 → IP 层
→ 路由选择 → Netfilter(iptables) → 网卡驱动
→ DMA → 网卡发送
关键数据结构:
- sk_buff:网络数据包结构
- net_device:网络设备
- socket:套接字
面试加分点:
- GRO(Generic Receive Offload)
- TSO(TCP Segmentation Offload)
- XDP(eXpress Data Path)
Q6: iptables 的表和链执行顺序?
点击查看答案
5张表(优先级):
- raw:连接跟踪前
- mangle:修改报文
- nat:地址转换
- filter:过滤
- security:SELinux
5条链:
- PREROUTING:路由前
- INPUT:本地接收
- FORWARD:转发
- OUTPUT:本地发出
- POSTROUTING:路由后
数据包流向:
入站:
PREROUTING (raw → mangle → nat)
→ 路由决策
→ INPUT (mangle → filter)
→ 本地进程
转发:
PREROUTING (raw → mangle → nat)
→ 路由决策
→ FORWARD (mangle → filter)
→ POSTROUTING (mangle → nat)
出站:
OUTPUT (raw → mangle → nat → filter)
→ 路由决策
→ POSTROUTING (mangle → nat)
面试加分点:
- conntrack 状态(NEW/ESTABLISHED/RELATED)
- SNAT vs DNAT
- iptables vs nftables
Kubernetes 核心(30题)
4. 架构与组件
Q7: 描述 Kubernetes 控制平面的核心组件及其作用
点击查看答案
核心组件:
kube-apiserver
- 唯一与 etcd 交互的组件
- 提供 RESTful API
- 认证、授权、准入控制
- 所有组件通信的枢纽
etcd
- 分布式键值存储
- 存储集群所有数据
- 使用 Raft 协议保证一致性
kube-scheduler
- 监听未调度的 Pod
- Filter/Score/Bind 三阶段
- 将 Pod 分配到合适的节点
kube-controller-manager
- Node Controller:节点健康检查
- Deployment Controller:副本管理
- Service Controller:Endpoint 管理
- 等 40+ 控制器
cloud-controller-manager
- 与云平台交互
- LoadBalancer 创建
- Volume 挂载
- Node 生命周期管理
面试加分点:
- Leader Election 机制
- Watch 机制原理
- Informer/Reflector 架构
Q8: Pod 创建的完整流程?
点击查看答案
详细流程:
用户提交
kubectl create -f pod.yamlAPI Server 处理
- 认证(Authentication)
- 授权(Authorization)
- 准入控制(Admission Control)
- 写入 etcd
Scheduler 调度
- Watch 到未调度 Pod
- Filter:过滤不符合条件的节点
- Score:给节点打分
- Bind:绑定到最优节点
Kubelet 创建
- Watch 到分配给自己的 Pod
- 调用 CRI 创建容器
- 创建 Sandbox(Pause 容器)
- 创建业务容器
- 调用 CNI 配置网络
- 调用 CSI 挂载存储
状态更新
- Kubelet 持续上报状态
- API Server 更新 etcd
时间线:
0s - kubectl 提交
0.1s - API Server 验证并存储
0.2s - Scheduler 调度完成
0.3s - Kubelet 开始创建
2s - 镜像拉取(缓存命中时更快)
3s - 容器启动
5s - 健康检查通过
5.5s - Pod Ready
面试加分点:
- InitContainer 执行时机
- Static Pod 的特殊性
- Pod Preemption 抢占机制
5. 网络模型
Q9: Kubernetes 网络模型的三大要求?
点击查看答案
三大要求:
Pod 间直接通信
- 任意两个 Pod 可以直接通过 IP 通信
- 不需要 NAT
- 跨节点也可以
Pod 与 Node 通信
- Node 可以直接访问 Pod IP
- Pod 可以直接访问 Node IP
- 双向透明
Pod 看到的自己的 IP = 其他 Pod 看到的 IP
- 不存在 IP 伪装
- 避免端口冲突问题
实现方式:
- Overlay 网络(Flannel VXLAN)
- 路由方式(Calico BGP)
- Underlay 网络(Macvlan)
面试加分点:
- Service 的 ClusterIP 虚拟性
- Pod CIDR 与 Service CIDR 分配
- 网络策略的实现原理
Q10: Service 的 iptables 模式是如何工作的?
点击查看答案
工作流程:
Service 创建
apiVersion: v1 kind: Service metadata: name: web spec: clusterIP: 10.96.1.100 ports: - port: 80 selector: app: webkube-proxy 生成 iptables 规则
# DNAT 规则 -A KUBE-SERVICES -d 10.96.1.100/32 -p tcp -m tcp --dport 80 \ -j KUBE-SVC-XXXXX # 负载均衡规则(假设2个后端) -A KUBE-SVC-XXXXX -m statistic --mode random --probability 0.5 \ -j KUBE-SEP-AAAA -A KUBE-SVC-XXXXX -j KUBE-SEP-BBBB # 后端 Pod 规则 -A KUBE-SEP-AAAA -p tcp -m tcp \ -j DNAT --to-destination 10.244.1.10:80 -A KUBE-SEP-BBBB -p tcp -m tcp \ -j DNAT --to-destination 10.244.2.20:80数据包流向
客户端 → ClusterIP:80 → iptables DNAT → 随机选择后端 Pod IP → Pod 处理请求 → 响应原路返回(SNAT)
性能问题:
- 规则数量:O(Services × Endpoints)
- 更新时延:全量刷新
- 连接不平衡:概率负载均衡
IPVS 模式优势:
- 规则数量:O(Services + Endpoints)
- 更新增量式
- 负载均衡算法丰富(rr/lc/dh等)
面试加分点:
- Cilium eBPF 模式的革新
- SessionAffinity 的实现
- ExternalTrafficPolicy 的影响
6. 存储管理
Q11: PV、PVC、StorageClass 的关系?
点击查看答案
三者关系:
PVC (用户需求)
↓ 匹配
PV (存储资源) ← 动态创建 ← StorageClass (存储模板)
静态供应流程:
- 管理员手动创建 PV
- 用户创建 PVC
- 控制器自动绑定(根据容量、AccessMode、Label 匹配)
- Pod 使用 PVC
动态供应流程:
- 管理员创建 StorageClass
- 用户创建 PVC(指定 storageClassName)
- Provisioner 自动创建 PV
- 自动绑定
- Pod 使用 PVC
示例:
# StorageClass
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: fast-ssd
provisioner: kubernetes.io/aws-ebs
parameters:
type: gp3
iops: "3000"
---
# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: data-pvc
spec:
storageClassName: fast-ssd
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
面试加分点:
- Reclaim Policy(Retain/Delete/Recycle)
- Volume Expansion 扩容
- CSI Driver 架构
实战类面试题
场景题(30题)
Q12: Pod 一直处于 Pending 状态,如何排查?
点击查看答案
排查步骤:
查看 Pod 详情
kubectl describe pod <pod-name>常见原因及解决方案:
原因1:资源不足
Events:
Warning FailedScheduling pod has unbound immediate PersistentVolumeClaims
解决:
# 检查节点资源
kubectl top nodes
kubectl describe nodes
# 增加节点或降低资源请求
原因2:PVC 未绑定
Events:
Warning FailedScheduling pod has unbound PersistentVolumeClaims
解决:
# 检查 PVC 状态
kubectl get pvc
# 检查 PV 是否可用
kubectl get pv
# 检查 StorageClass
kubectl get sc
原因3:节点亲和性不满足
Events:
Warning FailedScheduling 0/3 nodes are available: 3 node(s) didn't match node selector
解决:
# 检查节点标签
kubectl get nodes --show-labels
# 检查 Pod 的 nodeSelector/nodeAffinity
kubectl get pod <pod> -o yaml | grep -A10 nodeSelector
原因4:污点与容忍
Events:
Warning FailedScheduling 0/3 nodes are available: 3 node(s) had taints that the pod didn't tolerate
解决:
# 检查节点污点
kubectl describe nodes | grep Taints
# 添加容忍或移除污点
kubectl taint nodes <node> key=value:NoSchedule-
面试加分点:
- 提到 Scheduler 的 Filter 阶段
- 提到 Pod Priority 和 Preemption
- 能够快速定位问题根因
Q13: 应用突然大量 OOMKilled,如何分析和解决?
点击查看答案
分析流程:
确认 OOM 事件
# 查看 Pod 事件 kubectl describe pod <pod> # 查看容器退出码 kubectl get pod <pod> -o jsonpath='{.status.containerStatuses[0].lastState.terminated}' # 退出码 137 = OOMKilled区分 OOM 类型
容器级 OOM(cgroup):
# 查看内存限制
kubectl get pod <pod> -o yaml | grep -A5 resources
# 查看实际使用
kubectl top pod <pod>
节点级 OOM(系统):
# 查看系统日志
dmesg | grep -i oom
journalctl -k | grep -i oom
# 查看节点内存
kubectl top nodes
- 根因分析
原因1:内存泄漏
# 启用 pprof
kubectl port-forward <pod> 6060:6060
# 收集内存 profile
curl http://localhost:6060/debug/pprof/heap > heap.prof
# 分析
go tool pprof heap.prof
原因2:limits 设置过小
# 对比 requests 和 limits
kubectl get pod <pod> -o jsonpath='{.spec.containers[0].resources}'
# 查看历史使用峰值(需要监控系统)
原因3:突发流量
# 查看 QPS 趋势
# 检查是否有流量突增
- 解决方案
临时方案:
# 增加 memory limits
kubectl set resources deployment <name> -c=<container> --limits=memory=2Gi
长期方案:
# 1. 修复内存泄漏(代码层面)
# 2. 合理设置资源
resources:
requests:
memory: 1Gi
limits:
memory: 2Gi # limits = requests × 1.5~2
# 3. 启用 VPA 自动调整
apiVersion: autoscaling.k8s.io/v1
kind: VerticalPodAutoscaler
metadata:
name: app-vpa
spec:
targetRef:
apiVersion: apps/v1
kind: Deployment
name: app
updatePolicy:
updateMode: "Auto"
面试加分点:
- 提到 memory.oom_control
- 提到 oom_score_adj 优先级
- 提到监控告警的重要性
Q14: 网络不通问题的系统化排查方法?
点击查看答案
排查流程:
第1层:Pod 状态
# 检查 Pod 是否 Ready
kubectl get pods -o wide
# 检查 IP 是否分配
kubectl describe pod <pod> | grep IP
第2层:Pod 间连通性
# 测试 Pod IP 直连
kubectl exec <pod-a> -- ping <pod-b-ip>
# 如果不通:
# 1. 检查 CNI
kubectl get pods -n kube-system | grep -E 'calico|flannel|cilium'
# 2. 检查路由
kubectl exec <pod> -- ip route show
# 3. 检查 NetworkPolicy
kubectl get networkpolicy
kubectl describe networkpolicy <policy>
第3层:Service 访问
# 测试 Service
kubectl exec <pod> -- curl http://<service-name>
# 如果不通:
# 1. 检查 Service
kubectl get svc <service>
kubectl describe svc <service>
# 2. 检查 Endpoints
kubectl get endpoints <service>
# 3. 检查 kube-proxy
kubectl get pods -n kube-system -l k8s-app=kube-proxy
kubectl logs -n kube-system <kube-proxy-pod>
第4层:DNS 解析
# 测试 DNS
kubectl exec <pod> -- nslookup kubernetes.default
# 如果失败:
# 1. 检查 CoreDNS
kubectl get pods -n kube-system -l k8s-app=kube-dns
kubectl logs -n kube-system <coredns-pod>
# 2. 检查 DNS 配置
kubectl exec <pod> -- cat /etc/resolv.conf
第5层:外部访问
# 测试 Ingress
curl http://<ingress-host>
# 如果失败:
# 1. 检查 Ingress Controller
kubectl get pods -n ingress-nginx
# 2. 检查 Ingress 规则
kubectl get ingress
kubectl describe ingress <ingress>
# 3. 检查证书(HTTPS)
kubectl get secret <tls-secret>
高级排查:
# 抓包分析
kubectl exec <pod> -- tcpdump -i any -w /tmp/capture.pcap port 80
# 查看 iptables 规则
kubectl exec <pod> -- iptables-save | grep <service-name>
# 查看 conntrack 表
kubectl exec <pod> -- conntrack -L | grep <ip>
面试加分点:
- 分层排查思路清晰
- 了解每层的关键组件
- 能使用工具定位问题
架构设计题
Q15: 设计一个支持10万 QPS 的微服务架构
点击查看答案
整体架构:
┌─────────────┐
Internet ──────────────►│ CDN │
└──────┬──────┘
│
┌────────────┐
│ WAF/DDoS │
└──────┬──────┘
│
┌─────────────┐
│ LoadBalancer│
│ (Layer 4) │
└──────┬───────┘
│
┌───────────────┴───────────────┐
│ │
┌────────────┐ ┌─────────────┐
│ Ingress │ │ Ingress │
│ (NGINX) │ │ (NGINX) │
└──────┬──────┘ └───────┬──────┘
│ │
┌─────────┴─────────────────────────────┴──────┐
│ │
┌───────┐ ┌────────┐ ┌─────────┐ ┌──────────┐ │
│API GW │ │ Auth │ │Business │ │ Worker │ │
│(50 pod)│ │(20 pod)│ │(100 pod)│ │ (30 pod) │ │
└───┬────┘ └────┬───┘ └────┬────┘ └─────┬────┘ │
│ │ │ │ │
└────────────┴───────────┴──────────────┘ │
│ │
┌───────────────┐ │
│ Redis │ │
│ (Cluster) │ │
└───────┬────────┘ │
│ │
┌───────────────┐ │
│ MySQL │ │
│ (Master+ │ │
│ Slaves) │ │
└────────────────┘ │
关键技术点:
1. 接入层
# Ingress 配置
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: api-ingress
annotations:
nginx.ingress.kubernetes.io/rate-limit: "1000" # 限流
nginx.ingress.kubernetes.io/enable-cors: "true"
nginx.ingress.kubernetes.io/ssl-redirect: "true"
spec:
rules:
- host: api.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-gateway
port:
number: 80
2. API Gateway 层
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-gateway
spec:
replicas: 50
template:
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
topologyKey: kubernetes.io/hostname
containers:
- name: gateway
image: api-gateway:v1
resources:
requests:
cpu: 2
memory: 2Gi
env:
- name: GOMAXPROCS
value: "2"
---
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: api-gateway-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: api-gateway
minReplicas: 50
maxReplicas: 200
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70
3. 缓存层
# Redis Cluster
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: redis
spec:
replicas: 6 # 3 master + 3 slave
template:
spec:
containers:
- name: redis
image: redis:7-alpine
resources:
requests:
cpu: 2
memory: 4Gi
limits:
memory: 4Gi
volumeMounts:
- name: data
mountPath: /data
volumeClaimTemplates:
- metadata:
name: data
spec:
accessModes: ["ReadWriteOnce"]
storageClassName: fast-ssd
resources:
requests:
storage: 50Gi
4. 数据库层
# MySQL Master-Slave (使用 Operator)
apiVersion: mysql.presslabs.org/v1alpha1
kind: MysqlCluster
metadata:
name: my-cluster
spec:
replicas: 3 # 1 master + 2 slaves
secretName: mysql-secret
volumeSpec:
persistentVolumeClaim:
storageClassName: fast-ssd
accessModes: ["ReadWriteOnce"]
resources:
requests:
storage: 500Gi
podSpec:
resources:
requests:
cpu: 4
memory: 16Gi
limits:
memory: 16Gi
性能优化点:
- 连接池:合理配置数据库连接池(max=100)
- 缓存:热点数据缓存命中率 > 95%
- 异步处理:消息队列解耦(Kafka/RabbitMQ)
- 读写分离:MySQL Proxy 实现
- 分库分表:Sharding-JDBC
容量规划:
- 单 Pod QPS: 200
- 需要 Pod 数: 100000 / 200 = 500 个
- 考虑冗余: 500 × 1.5 = 750 个
- 节点数(8C16G): 750 / 10 = 75 个节点
面试加分点:
- 提到限流、降级、熔断
- 提到链路追踪(Jaeger)
- 提到灰度发布策略
进阶学习路径
学习路线图
基础阶段(1-3个月)
├─ Linux 基础
│ ├─ 进程、内存、网络
│ ├─ Shell 脚本
│ └─ 容器技术(Docker)
│
├─ Kubernetes 基础
│ ├─ Pod、Deployment、Service
│ ├─ kubectl 命令
│ └─ YAML 编写
│
└─ 网络基础
├─ TCP/IP
├─ DNS
└─ HTTP/HTTPS
进阶阶段(3-6个月)
├─ Kubernetes 深入
│ ├─ 调度器原理
│ ├─ 网络模型(CNI)
│ ├─ 存储管理(CSI)
│ └─ 安全机制(RBAC)
│
├─ 可观测性
│ ├─ Prometheus + Grafana
│ ├─ ELK/EFK 日志
│ └─ Jaeger 链路追踪
│
└─ CI/CD
├─ GitLab CI / Jenkins
├─ ArgoCD
└─ Helm
高级阶段(6-12个月)
├─ 云原生生态
│ ├─ Service Mesh (Istio)
│ ├─ Serverless (Knative)
│ └─ eBPF 技术
│
├─ Operator 开发
│ ├─ Kubebuilder
│ ├─ Operator SDK
│ └─ 自定义 CRD
│
└─ 多集群管理
├─ Cluster API
├─ KubeFed
└─ Rancher/OpenShift
专家阶段(12个月+)
├─ 内核深入
│ ├─ eBPF 编程
│ ├─ 内核调优
│ └─ 性能分析
│
├─ 大规模集群
│ ├─ 5000+ 节点管理
│ ├─ 多租户隔离
│ └─ 成本优化
│
└─ 开源贡献
├─ Kubernetes 社区
├─ CNCF 项目
└─ 技术博客/演讲
推荐学习资源
官方文档
- Kubernetes 官方文档:https://kubernetes.io/docs/
- CNCF Landscape:https://landscape.cncf.io/
- Linux Kernel 文档:https://www.kernel.org/doc/
在线课程
- Kubernetes CKA/CKD 认证课程
- Linux Performance(Brendan Gregg)
- eBPF Summit 视频
书籍推荐
基础
- 《Kubernetes in Action》
- 《Docker Deep Dive》
进阶
- 《Programming Kubernetes》
- 《Systems Performance》
高级
- 《BPF Performance Tools》
- 《Kubernetes Patterns》
实践项目
- 个人博客部署(基础)
- 微服务商城(进阶)
- CI/CD 流水线(进阶)
- 监控告警系统(高级)
- 自定义 Operator(专家)
认证与资源
官方认证
| 认证 | 级别 | 考试时长 | 通过率 | 有效期 |
|---|---|---|---|---|
| CKA (Certified Kubernetes Administrator) | 中级 | 2小时 | ~60% | 3年 |
| CKAD (Certified Kubernetes Application Developer) | 中级 | 2小时 | ~65% | 3年 |
| CKS (Certified Kubernetes Security Specialist) | 高级 | 2小时 | ~50% | 2年 |
考试准备
CKA 考试重点:
- 集群部署(kubeadm)
- 故障排查
- 网络配置
- 存储管理
- RBAC 配置
学习建议:
- 熟练掌握 kubectl 命令
- 多做实验(至少100小时)
- 使用 killer.sh 模拟考试
- 掌握 Vim/命令行技巧
- 学会查阅官方文档
社区资源
GitHub 项目:
- kubernetes/kubernetes
- cncf/landscape
- kelseyhightower/kubernetes-the-hard-way
技术博客:
- Kubernetes Blog
- CNCF Blog
- Brendan Gregg's Blog
社区活动:
- KubeCon + CloudNativeCon
- Kubernetes Meetup
- CNCF Webinars