k8s与Prometheus技术面试高频问题解析

一、etcd核心机制与生产场景应用

1.1 etcd技术架构解析

etcd作为分布式键值存储系统,采用Raft一致性算法实现多节点数据同步。其核心设计包含三大组件:

  • Raft日志模块:通过Leader选举与日志复制确保强一致性,每个节点维护独立日志序列
  • Watch机制:基于事件驱动的订阅模型,支持键级监听与前缀匹配监听
  • Lease租约系统:提供TTL机制实现配置自动过期,典型应用场景包括Leader选举与健康检查

在性能优化方面,etcd v3版本引入扁平键空间设计,将树形结构转换为扁平哈希表,使单节点QPS从v2版本的1.7K提升至10K+。某大型互联网公司测试显示,3节点etcd集群在100字节键值对场景下,写延迟稳定在2ms以内。

1.2 典型生产场景实践

服务发现场景:某金融平台采用etcd实现微服务注册中心,通过Watch机制实时感知节点变化。具体实现包含:

  1. // 服务注册示例
  2. cli, _ := clientv3.New(config)
  3. lease, err := cli.Grant(context.TODO(), 10) // 10秒租约
  4. _, err = cli.Put(context.TODO(), "/services/order", "192.168.1.1:8080", clientv3.WithLease(lease.ID))
  5. // 服务发现示例
  6. r, _ := cli.Get(context.TODO(), "/services/order", clientv3.WithPrefix())
  7. for _, kv := range r.Kvs {
  8. fmt.Printf("Found service: %s\n", kv.Value)
  9. }

配置管理场景:某电商平台将应用配置拆分为基础配置与动态配置,基础配置存储在关系型数据库,动态配置(如促销规则)通过etcd的Lease机制实现分钟级更新。测试数据显示,该方案使配置变更生效时间从小时级缩短至30秒内。

分布式锁场景:基于etcd的Session机制实现跨节点锁,核心逻辑如下:

  1. // 获取分布式锁
  2. sess, _ := concurrency.NewSession(cli)
  3. m := concurrency.NewMutex(sess, "/lock/resource")
  4. if err := m.Lock(context.TODO()); err != nil {
  5. log.Fatal("acquire lock failed")
  6. }
  7. defer m.Unlock(context.TODO())

二、Prometheus监控体系深度解析

2.1 数据采集模型设计

Prometheus采用拉取式(Pull-based)架构,核心组件包含:

  • Exporters:将第三方系统指标转换为Prometheus格式,如Node Exporter采集主机指标
  • Pushgateway:解决短生命周期任务监控问题,支持临时指标存储
  • Service Discovery:集成k8s、Consul等发现机制,自动注册监控目标

某云厂商实践显示,在10万容器规模集群中,通过合理设置scrape_interval(建议15-60秒)和scrape_timeout(建议小于间隔的80%),可使监控数据采集延迟控制在5秒内。

2.2 告警规则设计方法论

告警规则编写需遵循”3W1H”原则:

  • What:明确监控指标(如rate(http_requests_total[5m]) > 100
  • Where:指定标签范围(如job="api-server"
  • When:定义持续时间(如for: 5m
  • How:配置通知渠道(如Webhook、邮件)

典型告警分级策略:
| 级别 | 触发条件 | 处理时限 |
|———|—————|—————|
| P0 | 服务不可用 | 5分钟 |
| P1 | 性能劣化 | 30分钟 |
| P2 | 资源告急 | 2小时 |

2.3 存储优化实践

Prometheus默认使用本地时序数据库,在长期存储场景下需结合以下方案:

  • 远程存储:通过Thanos或Cortex接入对象存储,某企业案例显示,该方案使3年历史数据存储成本降低70%
  • 数据压缩:启用--storage.tsdb.retention.time参数控制数据保留周期,建议生产环境设置90天
  • 降采样:使用Recording Rules预先计算常用聚合指标,某电商平台的实践表明,该优化使查询响应时间提升40%

三、k8s与监控系统集成方案

3.1 监控指标采集架构

k8s环境推荐采用分层监控策略:

  • 基础设施层:通过Node Exporter采集节点CPU、内存等指标
  • k8s组件层:使用kube-state-metrics监控Pod、Deployment等资源状态
  • 应用层:自定义Exporter暴露业务指标(如订单处理延迟)

某银行核心系统实践显示,该分层架构使故障定位时间从小时级缩短至10分钟内。

3.2 自定义指标扩展

通过Custom Metrics API实现基于业务指标的自动扩缩容,关键步骤如下:

  1. 部署Prometheus Adapter
  2. 编写Recording Rules计算业务指标(如sum(rate(order_count[5m]))
  3. 配置HPA使用自定义指标
    1. apiVersion: autoscaling/v2
    2. kind: HorizontalPodAutoscaler
    3. spec:
    4. metrics:
    5. - type: Pods
    6. pods:
    7. metric:
    8. name: orders_per_second
    9. target:
    10. type: AverageValue
    11. averageValue: 100

3.3 多集群监控方案

对于跨可用区部署场景,推荐采用Thanos Query Federation架构:

  1. 每个集群部署Prometheus+Sidecar
  2. 通过Thanos Store Gateway接入对象存储
  3. 使用Thanos Query实现全局视图查询

某物流平台测试显示,该方案在5个集群、百万级时间序列场景下,查询延迟稳定在3秒以内。

四、面试问题应答策略

4.1 etcd相关问题

Q:etcd如何保证数据强一致性?
A:基于Raft算法实现,通过三阶段提交(Leader选举、日志复制、状态提交)确保多数派节点确认后才提交数据。生产环境建议部署3/5/7个节点,某金融系统实践表明5节点集群在跨机房部署时可用性达99.99%。

4.2 Prometheus相关问题

Q:如何解决Prometheus高基数问题?
A:采用标签设计规范(如避免动态IP作为标签值)、使用Recording Rules聚合指标、结合Thanos进行长期存储。某视频平台通过限制标签组合数量(建议<1000种),使内存使用量降低60%。

4.3 k8s监控问题

Q:如何监控k8s事件?
A:通过Event Exporter采集事件数据,结合Prometheus Alertmanager设置告警规则。典型规则示例:

  1. groups:
  2. - name: k8s-events
  3. rules:
  4. - alert: CriticalEvent
  5. expr: increase(k8s_events_total{severity="warning"}[15m]) > 0
  6. for: 5m

本文系统梳理了k8s与Prometheus技术栈的核心面试问题,从底层原理到生产实践提供了完整解决方案。实际面试中,建议结合具体业务场景阐述技术选型依据,例如在超大规模集群场景下,可重点讨论分片监控、数据压缩等优化手段。