95·监控与运维进阶

日志简介

kubernetesloggingobservability

日志简介

学习目标

  1. 理解 Kubernetes 日志的类型和来源
  2. 掌握基本的日志查看和管理方法
  3. 了解日志收集的架构和方案

核心概念

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...

继续学习

完成本课后,建议继续学习下一课「EFK 日志栈」 以巩固所学知识。