ToolkitX
知识库工具箱

监控与日志

Prometheus, Grafana, EFK 方案

30min·高级

01. K8s 监控的三大支柱——Metrics、Logs、Traces

监控不只是看 CPU 用了多少。完整的可观测性包含三个方面: Metrics(指标)——数字化的时序数据。CPU 使用率、内存、请求延迟、错误率。用 Prometheus 采集。 Logs(日志)——每个服务的输出文本。排查问题的主要入口。用 Loki 或 EFK(Elasticsearch + Fluentd + Kibana)采集聚合。 Traces(链路追踪)——一个请求经过多个微服务的完整路径。用 Jaeger 或 Tempo。 这三个还有一个统称叫云原生可观测性三件套。在小规模集群上可以先搞 Metrics 和 Logs,Traces 是微服务多了以后的事。
bash
# K8s 原生查看资源使用
kubectl top nodes
kubectl top pods

# 需要先安装 metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

02. Prometheus + Grafana——指标监控标配

Prometheus 是云原生监控的事实标准。它定期去各个目标抓取指标(HTTP Pull 模式),时序数据存在本地 TSDB 里。Grafana 负责把数据变成漂亮的仪表盘。 Prometheus 的核心概念: - Metrics(指标)——带名字和标签的时间序列数据。比如 http_requests_total{method="GET", status="200"}。 - PromQL——Prometheus 的查询语言,能对指标做计算、聚合、过滤。 - AlertManager——Prometheus 的告警组件。Prometheus 评估告警规则,触发了就推给 AlertManager,AlertManager 发邮件/钉钉/企业微信。 - ServiceMonitor——K8s 的 CRD,定义 Prometheus 该监控哪些 Service。有了它你不需要手动改 Prometheus 配置。 安装方式:最简单的是用 kube-prometheus-stack(Helm chart),一把梭把 Prometheus、Grafana、AlertManager 全装好。
bash
# 安装 kube-prometheus-stack
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm install prometheus prometheus-community/kube-prometheus-stack

# 查看监控目标
kubectl port-forward svc/prometheus-operated 9090
# 浏览器访问 http://localhost:9090/targets

# 访问 Grafana
kubectl port-forward svc/prometheus-grafana 3000:80
# 浏览器访问 http://localhost:3000 默认 admin/prom-operator
kube-prometheus-stack 会自带一大堆 K8s 集群的 Dashboard——Node 资源、Pod 资源、API Server 指标,基本开箱即用。

03. PromQL 入门

PromQL 是 Prometheus 的查询语言,几个常用写法: 直接查指标名——http_requests_total 返回所有带这个指标名的时序数据。 标签过滤——http_requests_total{method="GET"} 只看 GET 请求。用 =、!=、=~(正则匹配)、!~(正则不匹配)。 聚合——sum(rate(http_requests_total[5m])) 把所有 instance 的请求速率加起来。 函数——rate() 算每秒速率(Counter 类型必用)、increase() 算一段时间内的增量、avg_over_time() 算平均值。 范围向量——[5m] 表示过去 5 分钟的数据,一般配合 rate 或 increase 用。 CPU 使用率示例:100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)。看着复杂但拆开就是:找出空闲 CPU 的比例,100 减掉就是使用率。
promql
# 常用的 PromQL
# 请求速率(每秒)
rate(http_requests_total[5m])

# 错误率
rate(http_requests_total{status=~"5.."}[5m]) / rate(http_requests_total[5m])

# 99 分位延迟
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

# 容器内存使用
container_memory_usage_bytes{container!=""}

# CPU 节流率
rate(container_cpu_cfs_throttled_seconds_total[5m])
PromQL 的 rate() 和 irate() 区别:rate 算平均速率,irate 算瞬时速率(最近两个采样点之间)。一般用 rate 够了。

04. 日志收集——EFK / Loki

K8s 里每个容器的 stdout/stderr 日志存在 Node 的 /var/log/containers/ 下。日志收集系统需要把这些分散在各 Node 上的日志聚合到集中存储。 EFK 方案(Elasticsearch + Fluentd + Kibana):Fluentd 以 DaemonSet 方式在每个 Node 上跑,采集所有容器的日志,发送到 Elasticsearch 存储,Kibana 做查询和可视化。功能强大但资源消耗大。 Loki 方案(Loki + Promtail + Grafana):Promtail 负责采集,Loki 负责存储和索引,Grafana 统一展示(指标和日志在一个界面)。轻量、跟 Prometheus 集成好、存储成本低。 选型建议:资源充裕、需要全文搜索选 EFK。追求轻量、已有 Grafana 生态选 Loki。
bash
# 查看容器日志
kubectl logs pod-name
kubectl logs -f pod-name           # 实时跟踪
kubectl logs -l app=myapp --all-containers  # 按 label 查所有容器
kubectl logs --tail=100 pod-name    # 最后 100 行
kubectl logs --since=10m pod-name   # 最近 10 分钟

# 查看已崩溃容器之前的日志
kubectl logs pod-name --previous
Fluentd 用 DaemonSet 部署——每个 Node 上一个副本,采集该 Node 上所有容器的日志。这样整个集群的日志都被集中了。

05. Probe 与告警

监控不只是采集数据,还得自动发现问题并告警。K8s 生态的告警体系: Prometheus AlertManager——定义告警规则,满足条件时发通知。支持分组、抑制、静默(维护期间不上发)。 Liveness/Readiness Probe——K8s 自带的健康检查,Pod 挂了自动重启,不导流量到不健康的 Pod。 Events——kubectl get events 能发现问题(如 OOMKilled、FailedMount、BackOff)。生产环境建议把 Events 收集进日志系统统一告警。 生产环境告警规则的建议配置: - Pod 频繁重启(CrashLoopBackOff 超过 N 分钟) - 节点资源使用率超过 80% - Deployment 副本数跟期望不一致 - PVC 使用率超过 80% - 证书即将过期(TLS Secret 快要到期)
bash
# 查看集群事件
kubectl get events --sort-by='.lastTimestamp'
kubectl get events -w        # 实时监听

# 查看节点状况
kubectl describe node node-name | grep -A5 Conditions

# 告警用 Event exporter 把 K8s Events 导出到 Prometheus
# 或者部署 kube-state-metrics 收集 K8s 对象的状态指标
kube-state-metrics 能生成 Deployment 期望/实际副本数、Pod 状态这类指标。配合 Prometheus 告警规则,自动发现资源状态异常的组件。

知识测验

1/5正确 0

可观测性三件套是?