【架构实战】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

个人观点,仅供参考

相关推荐
liangsheng_g7 分钟前
微服务本地开发零配置隔离方案
java·微服务·架构
@atweiwei26 分钟前
用 Rust 构建 Agent 应用的高性能框架:langchainrust 架构全景
人工智能·架构·rust·langchain·llm·agent·ai编程
梦想不只是梦与想1 小时前
Docker Compose文件
docker·容器·docker compose
小周学学学3 小时前
vmware-horizon第四章:事件数据库配置(docker)
运维·docker·容器
智购科技自动贩卖机3 小时前
自动售货机嵌入式系统Go语言开发实践:从资源受限设备到RTOS协程调度的工程化之路
大数据·linux·数据库·人工智能·yolo·架构·golang
niyesd3 小时前
Kubernetes Pod 管理
云原生·容器·kubernetes
独孤九剑打醒他3 小时前
从“铁块一直在辐射电磁波“到EUV光源:微波等离子体MPP架构全链路推演
前端·架构·硬件工程
高卧怡怡3 小时前
Kubernetes的控制器实验
云原生·容器·kubernetes
XUEYUAN52123 小时前
代理日志分析与监控:代理池健康状态巡检与分级告警体系搭建(运维实战)
运维·网络·网络协议·tcp/ip·算法·架构
肠畔码农4 小时前
深入分布式事务内核:从 2PC/XA 到 Seata AT 模式的架构演进与权衡
分布式·架构