kubernetes-日志收集、采集宿主机日志、采集pod日志、sidecar采集、采集kafka日志到es示例

98 阅读3分钟

集群部署

juejin.cn/post/729829…

日志收集简介

日志收集的目的

  • 分布式日志数据统一收集,实现集中式查询和管理
  • 故障排查
  • 安全信息和事件管理
  • 报表统计及展示功能

日志收集的价值

  • 日志查询,问题排查,故障恢复,故障自愈
  • 应用日志分析,错误报警
  • 性能分析,用户行为分析

日志收集流程

image.png

日志收集-kibana展示图

日志收集-ES展示图

每天一个索引 每天定时删除一个月前的索引

node日志日志收集展-ES展示图

日志收集方式简介

文档 kubernetes.io/zh-cn/docs/…

1.宿主机日志收集

node节点 宿主机日志收集 ,基于daemonset部署日志收集进程,实现json-file类型(标准输出/dev/stdout、错误输出/dev/stderr)日志收集。

适用 日志格式统一

2. pod日志收集

pod中启用sidcar容器(一个pod多容器) 收集当前pod内一个或者多个业务容器的日志(通常基于emptyDir实现业务容器与sidcar之间的日志共享)。

sidcar将日志发送到es

缺点: 每个pod都启动sidcar 太消耗资源

优点: 专项收集 可以进行各种过滤处理逻辑

适用 日志类型乱 不统一

3.在容器内置日志收集服务进程

fliebeat和主程序运行到一个容器中

日志示例之一:部署daemonset收集宿主机的日志

基于daemonset运行日志收集服务,主要收集以下类型日志:

1.node节点上的日志收集,基于daemonset部署日志收集进程,实现json-file类型(标准输出/dev/stdout、错误输出/dev/stderr)日志收集,即应用程序产生的标准输出和错误输出的日志。

2.宿主机系统日志收集 例如var/log/message dmesg 等以日志文件形式保存的日志

注意 宿主机的原始日志不需要保留太久 因为数据已经保存到es中了 需要制定日志清理策略

image.png

在node节点 /var/log/pods 可以看到pod的日志 image.png

daemonset收集日志架构

image.png

创建logstash镜像

FROM logstash:7.12.1


USER root
WORKDIR /usr/share/logstash 
#RUN rm -rf config/logstash-sample.conf
ADD logstash.yml /usr/share/logstash/config/logstash.yml
ADD logstash.conf /usr/share/logstash/pipeline/logstash.conf 

logstash.conf的内容

input {
  file {
    path => "/var/lib/docker/containers/*/*-json.log" #docker
    #path => "/var/log/pods/*/*/*.log"
    start_position => "beginning"
    type => "jsonfile-daemonset-applog"
  }

  file {
    path => "/var/log/*.log"
    start_position => "beginning"
    type => "jsonfile-daemonset-syslog"
  }
}

output {
  if [type] == "jsonfile-daemonset-applog" {
    kafka {
      bootstrap_servers => "${KAFKA_SERVER}"
      topic_id => "${TOPIC_ID}"
      batch_size => 16384  #logstash每次向ES传输的数据量大小,单位为字节
      codec => "${CODEC}" 
   } }

  if [type] == "jsonfile-daemonset-syslog" {
    kafka {
      bootstrap_servers => "${KAFKA_SERVER}"
      topic_id => "${TOPIC_ID}"
      batch_size => 16384
      codec => "${CODEC}" #系统日志不是json格式
  }}
}
docker build -t harbor.linuxarchitect.io/baseimages/logstash:v7.12.1-json-file-log-v1 ./

docker push harbor.linuxarchitect.io/baseimages/logstash:v7.12.1-json-file-log-v1 

DaemonSet-logstash.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: logstash-elasticsearch
  namespace: kube-system
  labels:
    k8s-app: logstash-logging
spec:
  selector:
    matchLabels:
      name: logstash-elasticsearch
  template:
    metadata:
      labels:
        name: logstash-elasticsearch
    spec:
      tolerations:
      # this toleration is to have the daemonset runnable on master nodes
      # remove it if your masters can't run pods
      - key: node-role.kubernetes.io/master
        operator: Exists
        effect: NoSchedule
      containers:
      - name: logstash-elasticsearch
        image: harbor.linuxarchitect.io/baseimages/logstash:v7.12.1-json-file-log-v1 
        env:
        - name: "KAFKA_SERVER"
          value: "172.31.7.107:9092,172.31.7.108:9092,172.31.7.109:9092"
        - name: "TOPIC_ID"
          value: "jsonfile-log-topic"
        - name: "CODEC"
          value: "json"
#        resources:
#          limits:
#            cpu: 1000m
#            memory: 1024Mi
#          requests:
#            cpu: 500m
#            memory: 1024Mi
        volumeMounts:
        - name: varlog #定义宿主机系统日志挂载路径
          mountPath: /var/log #宿主机系统日志挂载点
        - name: varlibdockercontainers #定义容器日志挂载路径,和logstash配置文件中的收集路径保持一直
          mountPath: /var/lib/docker/containers #docker挂载路径
          #mountPath: /var/log/pods #containerd挂载路径,此路径与logstash的日志收集路径必须一致
          readOnly: false
      terminationGracePeriodSeconds: 30
      volumes:
      - name: varlog
        hostPath:
          path: /var/log #宿主机系统日志
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers #docker的宿主机日志路径
          #path: /var/log/pods #containerd的宿主机日志路径
cd /apps/kafka_2.13-3.2.1;

./bin/kafka-topics.sh --describe --topic jsonfile-log-topic --bootstrap-server 172.31.7.101:9092

./bin/kafka-console-consumer.sh --topic jsonfile-log-topic --from-beginning --bootstrap-server 172.31.7.101:9092


kafka消费到日志

image.png

daemonset的日志 从采集kafka的日志 推到es中

3.logsatsh-daemonset-jsonfile-kafka-to-es.conf

input {
  kafka {
    bootstrap_servers => "172.31.2.107:9092,172.31.2.108:9092,172.31.2.109:9092"
    topics => ["jsonfile-log-topic"]
    codec => "json"
  }
}

output {
  #if [fields][type] == "app1-access-log" {
  if [type] == "jsonfile-daemonset-applog" {
    elasticsearch {
      hosts => ["172.31.2.101:9200","172.31.2.102:9200"]
      index => "jsonfile-daemonset-applog-%{+YYYY.MM.dd}"
    }}

  if [type] == "jsonfile-daemonset-syslog" {
    elasticsearch {
      hosts => ["172.31.2.101:9200","172.31.2.102:9200"]
      index => "jsonfile-daemonset-syslog-%{+YYYY.MM.dd}"
    }}

}