容器编排与监控面试核心问题解析:K8s与Prometheus技术要点全梳理

一、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

控制器工作模式采用”控制循环”机制:

  1. for {
  2. desiredState := getDesiredState() // 从API Server获取期望状态
  3. currentState := getCurrentState() // 通过Informer获取实际状态
  4. if !reflect.DeepEqual(desiredState, currentState) {
  5. reconcile(desiredState, currentState) // 执行调和操作
  6. }
  7. time.Sleep(reconcileInterval)
  8. }

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状态时,排查流程应包含:

  1. 检查节点资源是否充足(kubectl describe node
  2. 验证镜像是否存在(docker imagescrictl images
  3. 查看kubelet日志(journalctl -u kubelet

2.2 服务负载均衡实现

kube-proxy通过三种模式实现Service负载均衡:

  • userspace模式:最早实现,性能较差但兼容性好
  • iptables模式:基于内核规则转发,性能较好
  • IPVS模式:支持更丰富的调度算法(如rr/wrr/sh)

配置建议:在节点数量超过500时,推荐使用IPVS模式以获得更好性能。可通过修改kube-proxy启动参数启用:

  1. apiVersion: kubeproxy.config.k8s.io/v1alpha1
  2. kind: KubeProxyConfiguration
  3. mode: "ipvs"
  4. ipvs:
  5. 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表达式与触发条件组成,典型配置示例:

  1. groups:
  2. - name: node-alerts
  3. rules:
  4. - alert: NodeCPUUsageHigh
  5. expr: 100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 90
  6. for: 10m
  7. labels:
  8. severity: critical
  9. annotations:
  10. summary: "CPU使用率过高 {{ $labels.instance }}"
  11. 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无法调度时,可通过以下步骤排查:

  1. 检查节点资源:kubectl top nodes
  2. 查看事件日志:kubectl get events --sort-by='.metadata.creationTimestamp'
  3. 验证污点配置:kubectl describe nodes | grep Taint
  4. 检查调度器日志:kubectl logs -n kube-system kube-scheduler

4.2 监控数据缺失

遇到指标采集失败时,排查流程应包含:

  1. 验证Service/Pod的端口暴露是否正确
  2. 检查Annotation配置:prometheus.io/scrape: "true"
  3. 验证网络策略是否阻止监控访问
  4. 检查Prometheus配置中的relabel_configs规则

4.3 高基数问题处理

当Label组合导致指标数量激增时,解决方案包括:

  1. 合并低区分度Label(如将多个状态码合并为status_class
  2. 使用Recording Rules预计算常用聚合指标
  3. 调整--storage.tsdb.retention.time减少历史数据

本文通过系统梳理Kubernetes核心组件原理与Prometheus监控体系架构,为开发者提供了完整的技术认知框架。掌握这些知识点不仅有助于应对技术面试,更能帮助在实际工作中构建高可用的容器化平台与监控系统。建议结合官方文档与生产环境实践,持续深化对容器编排与监控技术的理解。