日志简介
学习目标
- 理解 Kubernetes 日志的类型和来源
- 掌握基本的日志查看和管理方法
- 了解日志收集的架构和方案
核心概念
Kubernetes 日志类型
┌─────────────────────────────────────────────────────────┐
│ Kubernetes 日志来源 │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 容器日志(Container Logs) │ │
│ │ stdout / stderr → Node 上的日志文件 │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 系统组件日志 │ │
│ │ kubelet、kube-proxy、container runtime │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 集群事件(Events) │ │
│ │ kubectl get events │ │
│ └──────────────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────────────┐ │
│ │ 审计日志(Audit Logs) │ │
│ │ API Server 审计记录 │ │
│ └──────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
日志存储位置
# 容器日志(默认 JSON 格式)
/var/log/pods/<namespace>_<pod>_<uid>/<container>/*.log
# kubelet 日志
/var/log/kubelet.log
# 系统日志
/var/log/syslog 或 journalctl -u kubelet
日志管理方案
| 方案 | 特点 | 适用场景 |
|---|---|---|
| kubectl logs | 简单直接 | 开发调试 |
| Node 级日志 | 本地存储 | 临时排查 |
| 集中式日志 | 统一收集、查询 | 生产环境 |
| 云服务 | 托管服务 | 不想自建 |
日志收集架构
架构一:Node 级 Agent
┌─────────────────────────────────────────┐
│ Node │
│ ┌───────┐ ┌───────┐ ┌───────┐ │
│ │ Pod 1 │ │ Pod 2 │ │ Pod 3 │ │
│ └───┬───┘ └───┬───┘ └───┬───┘ │
│ └─────────┼─────────┘ │
│ ┌────┴────┐ │
│ │ Agent │ ← Fluentd/Filebeat│
│ └────┬────┘ │
└────────────────┼────────────────────────┘
▼
┌──────────────┐
│ 中心存储 │
│ ES/Loki │
└──────────────┘
架构二:Sidecar 模式
┌─────────────────────────────────────────┐
│ Pod │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ 应用容器 │ │ 日志 Sidecar│ │
│ │ 写日志 │→│ 收集转发 │ │
│ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────┘
实践练习
练习 1:查看容器日志
# 查看 Pod 日志
kubectl logs <pod-name>
# 实时跟踪日志
kubectl logs -f <pod-name>
# 查看多容器 Pod 日志
kubectl logs <pod-name> -c <container-name>
# 查看前一个容器实例的日志(崩溃后)
kubectl logs <pod-name> --previous
# 查看最近 100 行
kubectl logs <pod-name> --tail=100
# 查看最近 1 小时的日志
kubectl logs <pod-name> --since=1h
练习 2:查看多个 Pod 日志
# 使用标签查看
kubectl logs -l app=my-app --all-containers
# 使用 Stern 工具(推荐)
# 安装:brew install stern
stern -n default -l app=my-app
# 查看所有命名空间
stern -A ".*"
练习 3:查看集群事件
# 查看所有事件
kubectl get events
# 按时间排序
kubectl get events --sort-by='.lastTimestamp'
# 查看特定命名空间
kubectl get events -n kube-system
# 持续监控
kubectl get events -w
练习 4:配置日志级别
# 通过环境变量配置日志级别
apiVersion: v1
kind: Pod
metadata:
name: my-app
spec:
containers:
- name: my-app
image: my-app:latest
env:
- name: LOG_LEVEL
value: "debug"
- name: LOG_FORMAT
value: "json"
练习 5:结构化日志示例
# Python 结构化日志
import json
import logging
from datetime import datetime
class JSONFormatter(logging.Formatter):
def format(self, record):
log_entry = {
"timestamp": datetime.utcnow().isoformat(),
"level": record.levelname,
"message": record.getMessage(),
"module": record.module,
"function": record.funcName,
}
if record.exc_info:
log_entry["exception"] = self.formatException(record.exc_info)
return json.dumps(log_entry)
logger = logging.getLogger(__name__)
handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logger.addHandler(handler)
logger.setLevel(logging.INFO)
logger.info("User logged in", extra={"user_id": 123})
日志最佳实践
应用日志建议
1. 输出到 stdout/stderr
- 不要写入文件
- 让 Kubernetes 管理日志
2. 使用结构化日志
- JSON 格式
- 包含关键字段:timestamp、level、message、trace_id
3. 合理的日志级别
- ERROR: 需要关注的错误
- WARN: 潜在问题
- INFO: 关键业务事件
- DEBUG: 调试信息(生产环境关闭)
4. 避免敏感信息
- 不要记录密码、Token、个人信息
小结
| 要点 | 说明 |
|---|---|
| 日志类型 | 容器日志、系统日志、事件、审计日志 |
| 查看命令 | kubectl logs、stern |
| 收集方案 | Node Agent、Sidecar |
| 最佳实践 | stdout 输出、结构化日志 |
| 集中管理 | EFK、Loki |
练习编辑器
bash
Loading...