一、Kubernetes核心组件面试问题解析
1.1 调度系统工作原理
kube-scheduler作为集群调度核心组件,其核心职责是通过多维度算法为Pod分配最优节点。调度过程分为预选(Predicates)和优选(Priorities)两个阶段:
- 预选阶段:基于资源请求(CPU/内存)、节点标签、污点容忍等硬性条件过滤不匹配节点
- 优选阶段:通过优先级函数(如资源使用率、镜像拉取速度、节点亲和性)计算节点得分
- 绑定阶段:将Pod与得分最高的节点进行绑定,并更新etcd中的分配状态
典型面试问题延伸:如何自定义调度策略?可通过实现Scheduler Extender接口或编写自定义调度器插件实现。例如某金融系统通过扩展调度器,将数据库Pod强制调度到配备NVMe SSD的节点。
1.2 控制器管理机制
kube-controller-manager通过多个控制器协同工作维持集群期望状态,关键控制器包括:
- ReplicationController:确保Pod副本数符合定义
- DeploymentController:管理滚动更新与回滚策略
- StatefulSetController:维护有状态应用的稳定网络标识
- DaemonSetController:保证每个节点运行指定Pod
控制器工作模式采用”控制循环”机制:
for {desiredState := getDesiredState() // 从API Server获取期望状态currentState := getCurrentState() // 通过Informer获取实际状态if !reflect.DeepEqual(desiredState, currentState) {reconcile(desiredState, currentState) // 执行调和操作}time.Sleep(reconcileInterval)}
1.3 分布式存储架构
etcd作为集群元数据存储引擎,其设计要点包括:
- Raft共识算法:通过Leader选举与日志复制保证数据一致性
- Watch机制:支持客户端监听特定Key变化,实现配置热更新
- Lease API:为Pod提供存活探测与租约管理
生产环境优化建议:
- 部署3节点或5节点etcd集群
- 配置
--quota-backend-bytes限制存储空间 - 定期执行
etcdctl compact进行历史数据压缩
二、节点组件技术深度
2.1 Pod生命周期管理
kubelet作为节点代理,其核心职责包括:
- Pod状态同步:通过CRI(Container Runtime Interface)与容器运行时交互
- 健康检查:实现Liveness/Readiness探针机制
- 资源管理:通过cgroups限制容器资源使用
典型问题场景:当Pod处于Pending状态时,排查流程应包含:
- 检查节点资源是否充足(
kubectl describe node) - 验证镜像是否存在(
docker images或crictl images) - 查看kubelet日志(
journalctl -u kubelet)
2.2 服务负载均衡实现
kube-proxy通过三种模式实现Service负载均衡:
- userspace模式:最早实现,性能较差但兼容性好
- iptables模式:基于内核规则转发,性能较好
- IPVS模式:支持更丰富的调度算法(如rr/wrr/sh)
配置建议:在节点数量超过500时,推荐使用IPVS模式以获得更好性能。可通过修改kube-proxy启动参数启用:
apiVersion: kubeproxy.config.k8s.io/v1alpha1kind: KubeProxyConfigurationmode: "ipvs"ipvs:scheduler: "rr" # 轮询算法
三、Prometheus监控体系面试要点
3.1 监控数据模型
Prometheus采用时序数据库存储指标数据,其核心数据结构包含:
- Metric名称:如
http_requests_total - Label集合:如
{method="GET", path="/api"} - Timestamp:毫秒级时间戳
- Sample值:浮点数值
最佳实践建议:
- 指标命名遵循
<namespace>_<subsystem>_<measurement>格式 - 避免使用高基数Label(如用户ID)
- 合理设置
--storage.tsdb.retention.time参数(默认15天)
3.2 告警规则设计
告警规则由PromQL表达式与触发条件组成,典型配置示例:
groups:- name: node-alertsrules:- alert: NodeCPUUsageHighexpr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90for: 10mlabels:severity: criticalannotations:summary: "CPU使用率过高 {{ $labels.instance }}"description: "当前CPU使用率 {{ $value }}%,持续10分钟"
设计原则:
- 避免频繁抖动告警(合理设置
for持续时间) - 告警消息应包含足够上下文信息
- 使用分级告警策略(warning/critical)
3.3 监控系统集成
在Kubernetes环境中,Prometheus通常通过以下方式采集指标:
- ServiceMonitor:通过Prometheus Operator自动发现Service
- PodMonitor:直接监控Pod暴露的指标端点
- 自定义Exporter:将非标准指标转换为Prometheus格式
生产环境部署建议:
- 采用联邦集群架构处理大规模指标
- 配置
--web.route-prefix解决多实例路径冲突 - 使用Thanos或Cortex实现长期存储与全局查询
四、典型故障排查场景
4.1 调度失败分析
当Pod无法调度时,可通过以下步骤排查:
- 检查节点资源:
kubectl top nodes - 查看事件日志:
kubectl get events --sort-by='.metadata.creationTimestamp' - 验证污点配置:
kubectl describe nodes | grep Taint - 检查调度器日志:
kubectl logs -n kube-system kube-scheduler
4.2 监控数据缺失
遇到指标采集失败时,排查流程应包含:
- 验证Service/Pod的端口暴露是否正确
- 检查Annotation配置:
prometheus.io/scrape: "true" - 验证网络策略是否阻止监控访问
- 检查Prometheus配置中的
relabel_configs规则
4.3 高基数问题处理
当Label组合导致指标数量激增时,解决方案包括:
- 合并低区分度Label(如将多个状态码合并为
status_class) - 使用Recording Rules预计算常用聚合指标
- 调整
--storage.tsdb.retention.time减少历史数据
本文通过系统梳理Kubernetes核心组件原理与Prometheus监控体系架构,为开发者提供了完整的技术认知框架。掌握这些知识点不仅有助于应对技术面试,更能帮助在实际工作中构建高可用的容器化平台与监控系统。建议结合官方文档与生产环境实践,持续深化对容器编排与监控技术的理解。