集群部署
日志收集简介
日志收集的目的
- 分布式日志数据统一收集,实现集中式查询和管理
- 故障排查
- 安全信息和事件管理
- 报表统计及展示功能
日志收集的价值
- 日志查询,问题排查,故障恢复,故障自愈
- 应用日志分析,错误报警
- 性能分析,用户行为分析
日志收集流程
日志收集-kibana展示图
日志收集-ES展示图
每天一个索引 每天定时删除一个月前的索引
node日志日志收集展-ES展示图
日志收集方式简介
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中了 需要制定日志清理策略
在node节点 /var/log/pods 可以看到pod的日志
daemonset收集日志架构
创建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消费到日志
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}"
}}
}