查看 Pod 日志
学习目标
- 掌握查看 Pod 日志的方法
- 理解日志的实时跟踪和过滤
- 能够通过日志排查问题
核心概念
基本日志命令
# 查看 Pod 日志
kubectl logs nginx
# 查看指定容器日志(多容器 Pod)
kubectl logs nginx -c web
# 实时跟踪日志
kubectl logs -f nginx
# 只看最后 N 行
kubectl logs --tail=100 nginx
# 查看指定时间后的日志
kubectl logs --since=1h nginx
logs 常用参数
| 参数 | 说明 | 示例 |
|---|---|---|
-f | 实时跟踪 | kubectl logs -f nginx |
--tail=N | 最后 N 行 | kubectl logs --tail=50 nginx |
--since=T | 最近时间 | kubectl logs --since=1h nginx |
-c name | 指定容器 | kubectl logs nginx -c web |
--all-containers | 所有容器 | kubectl logs nginx --all-containers |
-p | 上次崩溃日志 | kubectl logs -p nginx |
--previous | 同 -p | kubectl logs --previous nginx |
实时跟踪日志
# 跟踪单个 Pod
kubectl logs -f nginx
# 跟踪多个 Pod(通过标签)
kubectl logs -f -l app=web
# 跟踪所有匹配的 Pod
kubectl logs -f -l app=web --all-containers
查看崩溃日志
# 当前容器日志
kubectl logs nginx
# 上一个容器的日志(崩溃后重启)
kubectl logs -p nginx
kubectl logs --previous nginx
场景:Pod CrashLoopBackOff
查看当前日志:kubectl logs nginx
可能没输出(刚启动就崩溃)
查看上次崩溃日志:kubectl logs -p nginx
可以看到崩溃前的输出
时间过滤
# 最近 5 分钟的日志
kubectl logs --since=5m nginx
# 最近 1 小时的日志
kubectl logs --since=1h nginx
# 最近 30 秒的日志
kubectl logs --since=30s nginx
| 单位 | 说明 |
|---|---|
| s | 秒 |
| m | 分钟 |
| h | 小时 |
行数过滤
# 最后 10 行
kubectl logs --tail=10 nginx
# 最后 100 行
kubectl logs --tail=100 nginx
# 所有日志(默认)
kubectl logs nginx
多容器 Pod 日志
# 多容器 Pod
apiVersion: v1
kind: Pod
metadata:
name: multi
spec:
containers:
- name: web
image: nginx
- name: sidecar
image: busybox
# 查看指定容器
kubectl logs multi -c web
kubectl logs multi -c sidecar
# 查看所有容器
kubectl logs multi --all-containers
# 跟踪所有容器
kubectl logs -f multi --all-containers
按标签查看日志
# 查看所有 app=web 的 Pod 日志
kubectl logs -l app=web
# 跟踪所有 app=web 的 Pod 日志
kubectl logs -f -l app=web
# 合并输出
kubectl logs -l app=web --all-containers
输出格式
# 默认格式(纯文本)
kubectl logs nginx
# JSON 格式(如果应用输出 JSON)
kubectl logs nginx | jq .
# 搜索关键词
kubectl logs nginx | grep ERROR
# 统计错误数
kubectl logs nginx | grep -c ERROR
日志与排查
# 应用启动失败
kubectl logs nginx
kubectl logs -p nginx
# 应用运行异常
kubectl logs --tail=100 nginx
kubectl logs nginx | grep -i error
# 性能问题
kubectl logs --since=5m nginx | grep -i timeout
集中式日志
kubectl logs 只能查看单个 Pod 的日志
生产环境通常使用集中式日志系统:
- EFK (Elasticsearch + Fluentd + Kibana)
- PLG (Promtail + Loki + Grafana)
- Splunk
- Datadog
优点:
- 跨 Pod 搜索
- 日志持久化
- 可视化分析
实践练习
练习 1: 基本日志
创建一个产生日志的 Pod 并查看:
kubectl run logger --image=busybox -- sh -c 'while true; do echo $(date) hello; sleep 5; done'
kubectl logs logger
kubectl logs -f logger
练习 2: 日志过滤
练习使用参数过滤日志:
kubectl logs --tail=5 logger
kubectl logs --since=1m logger
练习 3: 多容器日志
创建多容器 Pod 并分别查看日志:
apiVersion: v1
kind: Pod
metadata:
name: multi
spec:
containers:
- name: c1
image: busybox
command: ['sh', '-c', 'while true; do echo c1; sleep 2; done']
- name: c2
image: busybox
command: ['sh', '-c', 'while true; do echo c2; sleep 3; done']
kubectl logs multi -c c1
kubectl logs multi -c c2
kubectl logs multi --all-containers
练习 4: 崩溃日志
创建一个会崩溃的 Pod 并查看日志:
kubectl run crasher --image=busybox -- sh -c 'echo "starting"; sleep 5; echo "crashing"; exit 1'
kubectl logs -p crasher
常见误解
1. 日志不会永久保存
错误:kubectl logs 能看到所有历史日志
正确:
- 日志随 Pod 删除而消失
- 重启后旧日志需要 -p 查看
- 生产环境需要集中式日志系统
2. -f 不会自动退出
错误:kubectl logs -f 会自动结束
正确:-f 会一直跟踪,需要 Ctrl+C 退出
如果 Pod 被删除,-f 也会退出
小结
| 要点 | 说明 |
|---|---|
| 基本命令 | kubectl logs <pod> |
| 实时跟踪 | -f 参数 |
| 行数限制 | --tail=N |
| 时间过滤 | --since=T |
| 多容器 | -c 指定容器 |
| 崩溃日志 | -p / --previous |
| 标签过滤 | -l label=value |
| 持久化 | 需要集中式日志系统 |
练习编辑器
bash
Loading...