监控系统

监控系统是 Kubernetes 可观测性体系的基础,通过多层次指标采集与分析,保障集群和应用的稳定运行与故障快速定位。

监控系统概述

在 Kubernetes 环境中,监控系统通过收集和分析各类指标,帮助运维团队实时掌握集群与应用状态。主流方案以 Prometheus 生态为核心,结合 Metrics Server 和自定义指标适配器,覆盖基础设施、平台、应用和业务层。

监控层次

下图展示了 Kubernetes 监控体系的分层结构及数据流转关系。

图 1: Kubernetes 监控层次结构
图 1: Kubernetes 监控层次结构

监控体系覆盖:

  • 基础设施层:节点、集群、网络
  • 平台层:Kubernetes 核心组件、etcd、API Server
  • 应用层:Pod、服务、应用自定义指标
  • 业务层:业务指标、用户体验、SLA

核心组件

监控系统主要由以下组件构成:

  • Prometheus:时序数据库与指标采集系统
  • Metrics Server:Kubernetes 基础资源指标收集
  • 自定义指标适配器:扩展指标采集能力,支持 HPA、KEDA 等自动扩缩容

Prometheus 监控系统

Prometheus 是云原生监控的事实标准,具备强大的数据模型和查询能力。

架构和工作原理

下图展示了 Prometheus 的核心架构及数据流转。

图 2: Prometheus 架构与数据流
图 2: Prometheus 架构与数据流

核心特性:

  • 多维度数据模型:指标名称与标签灵活组合
  • 强大查询语言:PromQL 支持复杂时序分析
  • 高效存储:本地时序数据库,支持远程扩展
  • 自动发现:集成服务发现,自动采集目标
  • 丰富生态:多种导出器与客户端库

部署配置

推荐使用 Helm 快速部署 Prometheus 及相关组件。

# 添加 Prometheus 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update

# 安装 Prometheus
helm install prometheus prometheus-community/kube-prometheus-stack \
  --namespace monitoring \
  --create-namespace

基本配置示例:

apiVersion: monitoring.coreos.com/v1
kind: Prometheus
metadata:
  name: prometheus
  namespace: monitoring
spec:
  replicas: 2
  retention: 30d
  securityContext:
    fsGroup: 2000
    runAsNonRoot: true
    runAsUser: 1000
  serviceAccountName: prometheus
  serviceMonitorSelector:
    matchLabels:
      team: backend
  ruleSelector:
    matchLabels:
      team: backend
      prometheus: prometheus

PromQL 查询语言

PromQL 是 Prometheus 的核心查询语言,支持多种查询与聚合操作。

基础查询

# 简单指标查询
http_requests_total

# 带标签选择器
http_requests_total{job="api-server", status="200"}

# 正则表达式匹配
http_requests_total{job=~"api-.*"}

聚合操作

# 求和聚合
sum(http_requests_total)

# 按标签分组求和
sum by (method) (http_requests_total)

# 百分位数计算
histogram_quantile(0.95, rate(http_request_duration_bucket[10m]))

Metrics Server

Metrics Server 是 Kubernetes 集群资源监控的基础组件,主要用于采集节点和 Pod 的 CPU、内存等指标。

功能和作用

  • CPU 和内存指标采集
  • 为 HPA(水平自动扩缩容)提供数据支持
  • 轻量级设计,专注基础指标

部署和配置

推荐使用 Helm 安装 Metrics Server:

helm repo add metrics-server https://kubernetes-sigs.github.io/metrics-server/
helm repo update

helm install metrics-server metrics-server/metrics-server \
  --namespace kube-system \
  --set args="{--kubelet-insecure-tls,--kubelet-preferred-address-types=InternalIP}"

使用方法

常用命令如下:

# 查看节点资源使用情况
kubectl top nodes

# 查看 Pod 资源使用情况
kubectl top pods -n default

# 查看特定容器的资源使用
kubectl top pods --containers

自定义指标

Kubernetes 支持通过 Custom Metrics API 扩展指标采集能力,满足复杂自动化场景。

自定义指标 API

  • Custom Metrics API:/apis/custom.metrics.k8s.io/v1beta1
  • External Metrics API:/apis/external.metrics.k8s.io/v1beta1

Prometheus Adapter

Prometheus Adapter 可将 Prometheus 指标暴露为 Kubernetes Custom Metrics API,供 HPA、KEDA 等组件使用。

# 安装 Prometheus Adapter
helm install prometheus-adapter prometheus-community/prometheus-adapter \
  --namespace monitoring \
  --set prometheus.url="http://prometheus-operated.monitoring.svc.cluster.local" \
  --set prometheus.port="9090"

配置规则示例:

rules:
- seriesQuery: 'http_requests_total{namespace!="",pod!=""}'
  resources:
    overrides:
      namespace: {resource: "namespace"}
      pod: {resource: "pod"}
  name:
    matches: "^(.*)_total$"
    as: "${1}_per_second"
  metricsQuery: 'rate(<<.Series>>{<<.LabelMatchers>>}[5m])'

KEDA 事件驱动扩缩容

KEDA 支持多种事件源自动扩缩容,适合异步任务和流式处理场景。

apiVersion: keda.sh/v1alpha1
kind: ScaledObject
metadata:
  name: kafka-consumer-scaler
  namespace: default
spec:
  scaleTargetRef:
    name: kafka-consumer
  pollingInterval: 30
  cooldownPeriod: 300
  minReplicaCount: 0
  maxReplicaCount: 100
  triggers:
  - type: kafka
    metadata:
      bootstrapServers: kafka.svc.cluster.local:9092
      consumerGroup: my-consumer-group
      topic: orders
      lagThreshold: '10'

监控最佳实践

为保障监控系统的稳定性和可维护性,建议遵循以下最佳实践。

指标设计原则

  • 命名规范:指标名称应简洁明了,标签表达业务语义

    # 推荐命名
    http_requests_total{method="GET", endpoint="/api/v1/users"}
    
  • 标签使用:标签数量有限,避免高基数标签,标签值应为有限集合

性能优化

  • 抓取间隔设置:不同类型指标设置合理采集频率

    scrape_configs:
    - job_name: 'business-metrics'
      scrape_interval: 30s
    - job_name: 'system-metrics'
      scrape_interval: 60s
    
  • 资源限制:为监控组件设置合理资源请求与限制

    resources:
      requests:
        cpu: 1000m
        memory: 2Gi
      limits:
        cpu: 2000m
        memory: 4Gi
    

故障排除

  • 指标收集失败:检查 Prometheus Pod 状态与日志

    kubectl get pods -n monitoring -l app=prometheus
    kubectl logs -n monitoring deployment/prometheus-server
    
  • Metrics Server 问题:检查 Pod 状态与 API 服务

    kubectl get pods -n kube-system -l k8s-app=metrics-server
    kubectl get apiservice v1beta1.metrics.k8s.io
    

总结

监控系统是 Kubernetes 可观测性的基础。通过 Prometheus、Metrics Server 和自定义指标适配器,可以构建覆盖基础设施到业务层的完整监控体系。合理设计指标、优化性能、完善告警与自动扩缩容机制,是保障集群稳定与业务连续性的关键。

参考文献

  1. Prometheus 官方文档 - prometheus.io
  2. Kube-Prometheus-Stack Helm Chart - prometheus-community.github.io
  3. Metrics Server 官方文档 - kubernetes-sigs.github.io
  4. KEDA 官方文档 - keda.sh
  5. Prometheus Adapter 官方文档 - prometheus-operator.dev

文章导航

章节内容

这是章节的内容页面。

章节概览

评论区