【架构实战】Kubernetes日志收集:EFK/Loki架构

一、Kubernetes日志概述

Kubernetes日志是排查问题的关键:

日志类型:

  • 容器日志(stdout/stderr)
  • 宿主机日志
  • 应用日志
  • K8s组件日志

二、ELK架构

1. 架构图

复制代码
┌─────────┐     ┌─────────┐     ┌─────────┐     ┌─────────┐
│ Fluentd │     │ Fluentd │     │ Fluentd │     │ Fluentd │
│ Node1   │     │ Node2   │     │ Node3   │     │ NodeN   │
└────┬────┘     └────┬────┘     └────┬────┘     └────┬────┘
     │               │               │               │
     └───────────────┼───────────────┼───────────────┘
                     │
              ┌──────┴──────┐
              │ Elasticsearch│
              │   Cluster    │
              └──────┬──────┘
                     │
         ┌───────────┼───────────┐
         │           │           │
  ┌──────┴──────┐ ┌──┴──┐ ┌──────┴──────┐
  │   Kibana    │ │ API │ │  Logstash  │
  └─────────────┘ └─────┘ └─────────────┘

2. Fluentd部署

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluentd-config
data:
  fluent.conf: |
    <source>
      @type tail
      @id input_tail
      @label @mainstream
      <parse>
        @type json
        time_format %Y-%m-%dT%H:%M:%S.%NZ
      </parse>
      path /var/log/containers/*.log
      pos_file /var/log/fluentd-containers.log.pos
      tag kubernetes.*
    </source>

    <filter kubernetes.**>
      @type kubernetes_metadata
      @id filter_kube_metadata
    </filter>

    <match **>
      @type elasticsearch
      host elasticsearch.logging.svc
      port 9200
      logstash_format true
      logstash_prefix kubernetes
    </match>

3. DaemonSet部署

yaml 复制代码
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentd
  namespace: logging
spec:
  selector:
    matchLabels:
      app: fluentd
  template:
    metadata:
      labels:
        app: fluentd
    spec:
      serviceAccount: fluentd
      containers:
        - name: fluentd
          image: fluent/fluentd:v1.16-debian-1
          volumeMounts:
            - name: config
              mountPath: /etc/fluent/config.d/
            - name: varlog
              mountPath: /var/log
            - name: varlibdockercontainers
              mountPath: /var/lib/docker/containers
              readOnly: true
      volumes:
        - name: config
          configMap:
            name: fluentd-config
        - name: varlog
          hostPath:
            path: /var/log
        - name: varlibdockercontainers
          hostPath:
            path: /var/lib/docker/containers

三、Loki架构

1. 架构图

复制代码
┌─────────┐     ┌─────────┐     ┌─────────┐
│ Promtail│     │ Promtail│     │ Promtail│
│ Node1   │     │ Node2   │     │ Node3   │
└────┬────┘     └────┬────┘     └────┬────┘
     │               │               │
     └───────────────┼───────────────┘
                     │
              ┌──────┴──────┐
              │    Loki      │
              │   Distributor│
              └──────┬──────┘
                     │
              ┌──────┴──────┐
              │   Ingester  │
              └──────┬──────┘
                     │
              ┌──────┴──────┐
              │   Chunk     │
              │   Storage   │
              └──────┬──────┘
                     │
         ┌───────────┼───────────┐
         │           │           │
  ┌──────┴──────┐ ┌──┴──┐ ┌──────┴──────┐
  │   Grafana   │ │ API │ │  PromQL     │
  └─────────────┘ └─────┘ └─────────────┘

2. Loki部署

yaml 复制代码
apiVersion: loki.grafana.com/v1
kind: LokiStack
metadata:
  name: loki-stack
  namespace: monitoring
spec:
  size: 1x.small
  storage:
    type: filesystem
  services:
    - name: read
      replicas: 1
    - name: write
      replicas: 1
  tenants:
    mode: single

3. Promtail配置

yaml 复制代码
apiVersion: v1
kind: ConfigMap
metadata:
  name: promtail-config
data:
  promtail.yaml: |
    server:
      http_listen_port: 3100
      grpc_listen_port: 9096

    positions:
      filename: /tmp/positions.yaml

    client:
      url: http://loki:3100/loki/api/v1/push

    scrape_configs:
      - job_name: kubernetes
        kubernetes:
          kubeconfig_file: ""
          labels:
            cluster: "k8s-prod"
        static_configs:
          - targets:
              - localhost
            labels:
              job: varlogs
              __path__: /var/log/*.log
          - targets:
              - localhost
            labels:
              job: containers
              __path__: /var/log/containers/*.log

四、ELK vs Loki对比

特性 ELK (Elasticsearch) Loki
存储 Elasticsearch 对象存储
索引 全文索引 Label索引
资源消耗
查询 Lucene LogQL
成本

五、日志查询

1. Kibana查询

复制代码
# 搜索包含error的日志
error

# 搜索特定namespace
kubernetes.namespace_name: production

# 组合查询
kubernetes.pod_name: myapp AND error

2. LogQL查询

promql 复制代码
# 查询所有日志
{job="myapp"}

# 过滤日志级别
{job="myapp"} |= "ERROR"

# 统计日志数量
count_over_time({job="myapp"}[5m])

# 解析JSON日志
json | level="error"

六、最佳实践

1. 日志规范

json 复制代码
{
  "timestamp": "2024-01-15T10:00:00Z",
  "level": "ERROR",
  "service": "order-service",
  "trace_id": "abc123",
  "message": "Order creation failed",
  "error": "Database connection timeout"
}

2. 日志收集策略

  • 结构化日志(JSON)
  • 统一日志级别
  • 包含trace_id
  • 敏感信息脱敏

七、总结

日志收集方案选择:

  • ELK:功能强大,资源消耗高
  • Loki:轻量级,成本低
  • 推荐:中小规模使用Loki,大规模使用ELK

个人观点,仅供参考

相关推荐
wdfk_prog12 分钟前
ROS教程:01 搭建 ROS1 Noetic Docker 开发环境
运维·缓存·docker·容器·ros
szephyr1 小时前
Docker + Compose 实战:把本地项目一键搬到云服务器,附完整配置
运维·docker·容器·部署·云服务器
wdfk_prog1 小时前
ros教程02:创建 catkin Workspace、Package 与第一个 ROS1 C++ Node
运维·缓存·docker·容器·ros
海宇AI1 小时前
零信任架构实战:基于海宇柠檬查出险-登记证构建自动化车抵贷核保网关
java·人工智能·架构·自动化
白远山3 小时前
家政服务家政社区派单实战:调度系统架构设计与实现指南
java·开发语言·小程序·架构·需求分析
名字还没想好☜5 小时前
Docker 网络实战:bridge/host/none/自定义网络、容器互通与端口映射踩坑
运维·docker·kubernetes
故作春风5 小时前
elpis-core 核心从入门到理解
后端·架构·node.js
萧瑟余晖7 小时前
Hibernate 核心原理与架构详解
开发语言·架构·hibernate
企业通信技术笔记7 小时前
信创环境下企业即时通讯IM怎么部署?5类方案的架构与适配思路
架构·私有化部署·信息与通信·信创·企业即时通讯
parser7 小时前
LangGraph 智能体项目实战问题:循环导入的根因分析与三层解法(Python langgraph)
架构