16·Pod 基础入门

查看 Pod 日志

kubernetespodlogs

查看 Pod 日志

学习目标

  1. 掌握查看 Pod 日志的方法
  2. 理解日志的实时跟踪和过滤
  3. 能够通过日志排查问题

核心概念

基本日志命令

# 查看 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同 -pkubectl 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...

继续学习

完成本课后,建议继续学习下一课「进入 Pod 容器」 以巩固所学知识。