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 日志输出到集中存储和查询。
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 天的历史日志。这样既能保证排查效率,又能满足合规审计需求。