4. 故障排查基础:日志收集策略与事件查看

在 Knative 控制面故障排查中,日志与事件是定位问题的第一手资料。本章聚焦三种日志收集策略(kubectl logs、Loki、Fluentd)以及事件查看与状态检查方法,帮助你在不同场景下快速获取诊断信息。

4.1 日志收集策略

Knative 控制面组件(如 activator、autoscaler、controller、webhook)运行在 Kubernetes Pod 中,日志输出到标准输出/标准错误。根据排查场景的复杂度和规模,选择不同的日志收集方式。

策略 适用场景 优点 缺点
kubectl logs 单 Pod 快速调试、开发环境 零依赖、即时输出 无持久化、无法聚合多 Pod
Loki + Promtail 生产环境集中日志查询 轻量、与 Prometheus 标签对齐 需额外部署、查询语法学习成本
Fluentd + Elasticsearch 已有 EFK/ELK 栈的集群 成熟生态、丰富过滤插件 资源消耗较高、配置复杂

4.1.1 kubectl logs:即时诊断

最直接的日志获取方式,适用于查看单个 Pod 的实时或历史日志。

# 查看 activator 最近 100 行日志
kubectl logs -n knative-serving deployment/activator --tail=100

# 实时跟踪日志流
kubectl logs -n knative-serving deployment/activator -f

# 查看指定容器的日志(多容器 Pod)
kubectl logs -n knative-serving pod/activator-xxxxx -c controller

# 查看前一个崩溃实例的日志
kubectl logs -n knative-serving pod/activator-xxxxx --previous
排查技巧:当 Knative Revision 启动失败时,使用 kubectl logs -n knative-serving <pod-name> --previous 查看崩溃前的日志,往往能捕获到初始化阶段的错误信息。

4.1.2 Loki:标签化日志聚合

Loki 是 Grafana 生态下的日志聚合系统,与 Prometheus 共享标签模型。在 Knative 控制面故障排查中,Loki 允许你按 namespace、deployment、pod、container 等标签快速过滤日志。

# LogQL 示例:查询 activator 最近 30 分钟的 error 日志
{namespace="knative-serving", deployment="activator"} |= "error" |= "level=error"

# 查询特定 Revision 的 autoscaler 日志
{namespace="knative-serving", pod=~"autoscaler-.*"} |= "revision=hello-00001"
架构优势:Loki 不建立全文索引,只索引标签,因此存储成本远低于 Elasticsearch。对于 Knative 这种高频日志场景(如 autoscaler 每秒输出决策日志),Loki 的性价比更高。

4.1.3 Fluentd:管道式日志处理

Fluentd 作为日志采集代理,支持丰富的输入/输出插件。在 Knative 控制面中,Fluentd 通常以 DaemonSet 部署,采集节点上所有容器日志,并转发到 Elasticsearch 或 S3。

# Fluentd 配置片段:采集 Knative 控制面日志并添加标签
<source>
  @type tail
  path /var/log/containers/*activator*.log
  tag knative.activator
  <parse>
    @type json
    time_key time
  </parse>
</source>

<match knative.**>
  @type elasticsearch
  host elasticsearch-logging
  port 9200
  logstash_format true
  <buffer>
    @type file
    path /var/log/fluentd-buffer
  </buffer>
</match>
注意:Fluentd 的 buffer 配置直接影响日志可靠性。在 Knative 控制面高负载时,若 buffer 设置过小可能导致日志丢失。建议将 buffer 大小设置为 256MB 以上,并启用 flush_at_shutdown。

4.2 事件查看

Kubernetes 事件记录了资源状态变更的详细信息,是排查 Knative 控制面故障的关键线索。

4.2.1 kubectl describe

kubectl describe 展示资源的详细状态,包括 Events 字段,按时间倒序排列。

# 查看 Knative Service 的详细状态和事件
kubectl describe ksvc hello -n default

# 查看 Configuration 的滚动更新事件
kubectl describe configuration hello -n default

# 查看 Revision 的调度和就绪事件
kubectl describe revision hello-00001 -n default

在输出中,Events 部分通常包含以下关键信息:

  • Normal Scheduled:Pod 被调度到节点
  • Normal Pulled:镜像拉取成功
  • Normal Created:容器创建完成
  • Normal Started:容器启动成功
  • Warning BackOff:容器反复崩溃重启
  • Warning Failed:镜像拉取失败或健康检查失败

4.2.2 kubectl get events

全局事件查看,支持按时间、类型、资源过滤。

# 查看 default 命名空间最近的事件
kubectl get events -n default

# 查看 Knative Serving 控制面的事件
kubectl get events -n knative-serving

# 按警告类型过滤
kubectl get events -n default --field-selector type=Warning

# 按资源名称过滤
kubectl get events -n default --field-selector involvedObject.name=hello-00001
排查模式:当 Knative Service 无法变为 Ready 状态时,先执行 kubectl get events -n <namespace> --field-selector type=Warning,快速定位所有警告事件,再结合 kubectl describe 查看具体资源的完整事件链。

4.3 状态检查

状态检查是故障排查的起点,通过资源的状态字段快速判断问题范围。

4.3.1 资源状态字段解读

资源类型 关键状态字段 正常值 异常值
ksvc status.conditions[].status True False / Unknown
configuration status.latestReadyRevisionName 非空 空字符串
revision status.conditions[].reason Ready ContainerMissing / ExitCodeError
route status.url 可访问 URL 未分配

4.3.2 快速状态检查命令

# 查看所有 Knative Service 的就绪状态
kubectl get ksvc -A

# 查看 Revision 的详细状态条件
kubectl get revision -A -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.status.conditions[?(@.type=="Ready")].status}{"\t"}{.status.conditions[?(@.type=="Ready")].reason}{"\n"}{end}'

# 检查 autoscaler 的决策状态
kubectl get pod -n knative-serving -l app=autoscaler -o wide
实战案例:某次排查中,ksvc 状态显示 Ready=False,Reason=RevisionFailed。通过 kubectl describe revision 发现 Events 中提示 Back-off pulling image,最终定位为镜像仓库凭证过期。整个排查过程仅需 3 条命令,无需进入 Pod 内部。

4.4 日志与事件收集架构

下图展示了 Knative 控制面日志与事件的完整收集链路,从 Pod 日志输出到集中存储和查询。

Knative 控制面日志与事件收集架构 Knative 控制面日志与事件收集架构 Knative 控制面 activator autoscaler controller webhook queue-proxy stdout/stderr 日志采集层 kubectl logs Promtail Fluentd kube-apiserver (Events) 存储与查询 终端输出 Loki Elasticsearch kubectl get events Grafana 说明:kubectl logs 直接读取容器日志文件;Promtail 和 Fluentd 作为 DaemonSet 采集节点日志;Events 通过 kube-apiserver 的 API 获取。

4.5 日志策略选择矩阵

根据故障排查的不同阶段和场景,推荐以下日志策略组合:

排查阶段 推荐策略 关键命令/工具 预期产出
初步诊断 kubectl describe + kubectl get events describe ksvc、get events --field-selector type=Warning 快速定位异常资源
深度分析 kubectl logs + kubectl logs --previous logs deployment/activator --tail=200 获取崩溃前日志
历史回溯 Loki + Grafana LogQL 查询 {namespace="knative-serving"} |= "error" 按时间范围聚合日志
长期监控 Fluentd + Elasticsearch Kibana 仪表盘 日志持久化与全文检索
最佳实践:在 Knative 生产环境中,建议同时部署 Loki(用于快速查询)和 Elasticsearch(用于长期存储)。Loki 处理最近 7 天的日志,Elasticsearch 存储超过 7 天的历史日志。这样既能保证排查效率,又能满足合规审计需求。