Docker日志管理

ops/2024/10/18 6:01:10/

一、知识点介绍

1.ELK(Elasticserach、Logstash、Kibana)

前面笔记有

2.什么是 Filebeat

        Filebeat 是 ELK 组件的新成员, 也是 Beat 成员之一。基于 Go 语言开发,无任何依赖并且比 Logstash 更加轻量,不会带来过高的资源占用, 非常适合安装在生产机器上。轻量意味着简单,Filebeat 并没有集成和 Logstash 一样的正则处理功能, 而是将收集的日志原样输出。

        以下是 Filebeat 的工作流程:当开启 Filebeat 程序的时候,它会启动一个或多个检测进程(prospectors) 找到指定的日志目录或文件。对于探测器找出的每一个日志文件,Filebeat 启动读取进程(harvester)。每读取一个日志文件的新内容,便发送这些新的日志数据到处理程序(spooler)。最后,Filebeat 会发送数据到指定的地点(比如logstash、elasticserach)。

        正是以上原因, 目前, Filebeat 已经完全替代了 Logstash 成为新一代的日志采集器。同时,鉴于它的轻量、安全等特点,越来越多人开始使用它。

3.Docker 日志管理架构缺陷

        ELK 架构适合于日志规模比较庞大的情况。但由于 Logstash 日志解析节点和Elasticsearch 的负荷比较重,可将其配置为集群模式,以分担负荷。引入消息队列,均衡了网络传输, 从而降低了网络闭塞,尤其是丢失数据的可能性,但依然存在 Logstash 占用系统资源过多的问题。

二、案列环境

1.案列实验环境

2.案例需求

(1)利用 ELKF 收集容器里面的日志。
(2)通过 Kibana 将收集到日志做图表分析。

3.案例实现思路

(1)准备系统环境。
(2)构建 ELKF 组件镜像
(3)创建 ELKF 容器收集容器里面的 Nginx 日志。
(4)创建 Kibana 图形展示。

三、案例实施

基于 Docker 环境部署 ELKF 日志分析系统,实现日志分析功能。

1.系统环境准备

1)修改系统参数
[root@localhost ~]# vim /etc/sysctl.conf
vm.max_map_count=655360 

备注:

max_map_count文件包含限制一个进程可以拥有的VMA(虚拟内存区域)的数量(字节)

[root@localhost ~]# sysctl -p 
[root@localhost ~]# vim /etc/security/limits.conf 
* soft nofile 65535 
* hard nofile 65535 
* soft nproc 65535 
* hard nproc 65535 
* soft memlock unlimited 
* hard memlock unlimited
2)单独创建 ELK-kgc 网络桥接
[root@localhost ~]# docker network create ELK-kgc 
[root@localhost ~]# docker network ls 

2.基于 Dockerfile 构建 Elasticsearch 镜像

1)创建 Elasticsearch 工作目录
[root@localhost ~]# mkdir /root/elk
[root@localhost ~]# mkdir -p /root/elk/elasticsearch 
[root@localhost ~]# cd /root/elk/elasticsearch
上传 elasticsearch 的源码包到/root/elk/elasticsearch 目录下
(2)修改es配置文件
[root@localhost Elasticsearch]#  tar zxvf elasticsearch-7.10.0-linux-x86_64.tar.gz
[root@localhost elasticsearch]# cd elasticsearch-7.10.0/config
[root@localhost config]# vim elasticsearch.yml
cluster.name: my-application		##17行,群集名称
node.name: elasticsearch		##23行,本节点主机名
path.data: /path/to/data		##33行,数据文件路径
path.logs: /path/to/logs		##37行,日志文件路径
network.host: 0.0.0.0		##55行,监听地址
http.port: 9200		##59行,监听端口
cluster.initial_master_nodes: ["elasticsearch"]   ##72,master主机名称,群集的初始化会将此节点选举为master
[root@localhost config]# cp elasticsearch.yml /root/elk/elasticsearch 
(3)编写 Elasticsearch Dockerfile 文件
[root@localhost Elasticsearch]# vim dockerfile 
FROM centos:7
MAINTAINER wjq@kgc
#RUN yum -y install wget
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#RUN curl -o /etc/yum.repos.d/CentOS-Base.repo ftp://192.168.2.149/repo/CentOS-Base.repo
#RUN curl -o /etc/yum.repos.d/epel.repo ftp://192.168.2.149/repo/epel.repo
RUN yum clean all
RUN yum -y install java-11 vim telnet lsof net-tools
ADD elasticsearch-7.10.0-linux-x86_64.tar.gz /usr/local/
RUN mkdir -p /path/to/data
RUN mkdir -p /path/to/logs
COPY elasticsearch.yml /usr/local/elasticsearch-7.10.0/config/
RUN useradd es && chown -R es:es /usr/local/elasticsearch-7.10.0/
RUN chmod +x /usr/local/elasticsearch-7.10.0/bin/*
RUN chown -R es:es /path/to/data
RUN chown -R es:es /path/to/logs
RUN sed -i s/-Xms1g/-Xms4g/g /usr/local/elasticsearch-7.10.0/config/jvm.options
RUN sed -i s/-Xmx1g/-Xmx4g/g /usr/local/elasticsearch-7.10.0/config/jvm.options
EXPOSE 9200
EXPOSE 9300
CMD su es /usr/local/elasticsearch-7.10.0/bin/elasticsearch
(4)构建 Elasticsearch 镜像
[root@localhost Elasticsearch]# docker build -t elasticsearch . 

3.基于 Dockerfile 构建 Kibana 镜像

执行步骤如下:

1)创建 Kibana 工作目录
[root@localhost ~]# mkdir -p /root/elk/kibana 
2)上传 kibana 的源码包

上传 kibana 的源码包到/root/elk/kibana 目录下

3)编写 Kibana Dockerfile 文件
[root@localhost ~]# cd /root/elk/kibana 
[root@localhost kibana]# tar zxvf kibana-7.10.0-linux-x86_64.tar.gz 
[root@localhost kibana]# cd kibana-7.10.0-linux-x86_64/config/
[root@localhost config]# vim kibana.yml server.port: 5601		##2行,监听端口
server.host: "0.0.0.0"		##7行,监听地址
server.name: "kibana"    ##25
elasticsearch.hosts: ["http://elasticsearch:9200"]		##28行,ES主机的IP地址
i18n.locale: "zh-CN"		##107[root@localhost config]# cp kibana.yml /root/elk/kibana/
[root@localhost config]# cd /root/elk/kibana[root@localhost kibana]# vim dockerfile 
FROM centos:7
MAINTAINER wjq@kgc
#RUN yum -y install wget
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#RUN curl -o /etc/yum.repos.d/CentOS-Base.repo ftp://192.168.2.149/repo/CentOS-Base.repo
#RUN curl -o /etc/yum.repos.d/epel.repo ftp://192.168.2.149/repo/epel.repo
RUN yum clean all
RUN yum -y install java-11 vim telnet lsof net-tools
ADD kibana-7.10.0-linux-x86_64.tar.gz /usr/local/ 
COPY kibana.yml /usr/local/kibana-7.10.0-linux-x86_64/config/
EXPOSE 5601 
RUN useradd es && chown -R es:es /usr/local/kibana-7.10.0-linux-x86_64/
CMD su es /usr/local/kibana-7.10.0-linux-x86_64/bin/kibana

备注:

kibana不能用root用户执行,如果用root执行,需要--allow-root选项

4)构建 kibana 镜像
[root@localhost kibana]# docker build -t kibana .

4.基于 Dockerfile 构建 Logstash 镜像

执行步骤如下:

1)创建 Logstash 工作目录
[root@localhost ~]# mkdir -p /root/elk/logstash 
2)上传 logstash 的源码包

上传 logstash 的源码包到/root/elk/logstash 目录下

3)编写 Logstash Dockerfile 文件
[root@localhost ~]# cd /root/elk/logstash 
[root@localhost logstash]# vim dockerfile 
FROM centos:7
MAINTAINER wjq@kgc
#RUN yum -y install wget
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#RUN curl -o /etc/yum.repos.d/CentOS-Base.repo ftp://192.168.2.149/repo/CentOS-Base.repo
#RUN curl -o /etc/yum.repos.d/epel.repo ftp://192.168.2.149/repo/epel.repoRUN yum clean all
RUN yum -y install java-11 vim telnet lsof net-tools
ADD logstash-7.10.0-linux-x86_64.tar.gz /usr/local/ 
RUN chmod -R 777 /usr/local/logstash-7.10.0/data/
ADD nginx-log.conf /opt/logstash/conf/nginx-log.conf
ADD run.sh /run.sh
RUN chmod 755 /*.sh
EXPOSE 5044
CMD ["/run.sh"]
4)创建 CMD 运行的脚本文件
[root@localhost logstash]# vim run.sh 
#!/bin/bash
/usr/local/logstash-7.10.0/bin/logstash -f /opt/logstash/conf/nginx-log.conf
5logstash 配置文件详解
[root@localhost ~]#mkdir -p /opt/logstash/conf
[root@localhost ~]# vim /opt/logstash/conf/nginx-log.conf
input {beats {
port => 5044codec => "json"}
}filter {if "www-bdqn-cn-pro-access" in [tags] {grok {
match => {"message" => "%{IPV4:remote_addr} - (%{USERNAME:remote_user}|-) \[%{HTTPDATE:time_local}\] \"%{WORD:request_method} %{URIPATHPARAM:request_uri} HTTP/%{NUMBER:http_protocol}\" %{NUMBER:http_status} %{NUMBER:body_bytes_sent} \"%{GREEDYDATA:http_referer}\" \"%{GREEDYDATA:http_user_agent}\" \"(%{IPV4:http_x_forwarded_for}|-)\""} }}urldecode {all_fields => true}date {match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]}useragent {source => "agent"target => "ua"}
}output {if "www-bdqn-cn-pro-access" in [tags] {elasticsearch {hosts => ["elasticsearch:9200"]manage_template => falseindex => "www-bdqn-cn-pro-access-%{+YYYY.MM.dd}"}
}
}

备注:

可以用如下简洁的写法

input {beats {port => "5044"codec => "json"}
}output{elasticsearch {hosts => ["elasticsearch:9200"]manage_template => falseindex => "www-bdqn-cn-pro-access-%{+YYYY.MM.dd}"}
}[root@localhost logstash]# cp /opt/logstash/conf/nginx-log.conf /root/elk/logstash/
6) 构建 logstash 镜像
[root@localhost logstash]# docker build -t logstash .

5.基于 Dockerfile 构建 Filebeat 镜像

1)创建 Filebeat 工作目录
[root@localhost ~]# mkdir -p /root/elk/filebeat
2)编写 Filebeat Dockerfile 文件
[root@localhost ~]# cd /root/elk/filebeat 
3)上传 Filebeat 的源码包和 Filebeat 配置文件

上传 Filebeat 的源码包和 Filebeat 配置文件到/root/elk/filebeat 目录下

[root@localhost Filebeat]# vim dockerfile
FROM centos:7
MAINTAINER wjq@kgc
#RUN yum -y install wget
RUN rm -rf /etc/yum.repos.d/*
RUN curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
RUN curl -o /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
#RUN curl -o /etc/yum.repos.d/CentOS-Base.repo ftp://192.168.2.149/repo/CentOS-Base.repo
#RUN curl -o /etc/yum.repos.d/epel.repo ftp://192.168.2.149/repo/epel.repoRUN yum clean all
RUN yum -y install java-11 vim telnet lsof net-tools
ADD filebeat-7.10.0-linux-x86_64.tar.gz /usr/local/
#RUN cd /usr/local/filebeat-7.10.0-linux-x86_64
RUN mv /usr/local/filebeat-7.10.0-linux-x86_64/filebeat.yml /root/
COPY filebeat.yml /usr/local/filebeat-7.10.0-linux-x86_64/
ADD run.sh /run.sh
RUN chmod 755 /*.sh
CMD ["/run.sh"]
4Filebeat 配置文件详解查看 Filebeat 的配置文件。
[root@localhost filebeat]# vim filebeat.yml 
filebeat.inputs:
- type: logpaths:- /var/log/nginx/access.logtags: ["www-bdqn-cn-pro-access"]output.logstash:hosts: ["logstash:5044"]
5)创建 CMD 运行的脚本文件
[root@localhost Filebeat]# vim run.sh 
#!/bin/bash
/usr/local/filebeat-7.10.0-linux-x86_64/filebeat -e -c /usr/local/filebeat-7.10.0-linux-x86_64/filebeat.yml

备注:

-c:配置文件位置

-path.logs:日志位置

-path.data:数据位置

-path.home:家位置

-e:关闭日志输出

-d 选择器:启用对指定选择器的调试。 对于选择器,可以指定逗号分隔的组件列表,也可以使用-d“*”为所有组件启用调试.例如,-d“publish”显示所有“publish”相关的消息。

6)构建 Filebeat 镜像
[root@localhost Filebeat]# docker build -t filebeat .

6.启动 Nginx 容器做为日志输入源

[root@localhost ~]# docker run -itd -p 80:80 --network ELK-kgc -v /var/log/nginx:/var/log/nginx --name nginx-ELK nginx:latest

访问nginx网站,产生日志:

[root@localhost ~]# cat /var/log/nginx/access.log

7.启动 Filebeat+ELK 日志收集环境

1)启动 Elasticsearch
[root@localhost ~]# docker run -itd -p 9200:9200 -p 9300:9300 --network ELK-kgc -v /path/to/logs:/path/to/logs --name elasticsearch elasticsearch
2)启动 kibana
[root@localhost ~]# docker run -itd -p 5601:5601 --network ELK-kgc --name kibana kibana
3)启动 logstash
[root@localhost ~]# docker run -itd -p 5044:5044 --network ELK-kgc -v /opt/logstash/conf:/opt/logstash/conf --name logstash logstash
4)启动 Filebeat
[root@localhost ~]# docker run -itd --network ELK-kgc -v /var/log/nginx:/var/log/nginx --name filebeat filebeat

8.Kibana Web 管理

找到Managerment--》Stack Management--》(Kibana)索引模式--》创建索引模式

 

 

 

 

 


http://www.ppmy.cn/ops/94291.html

相关文章

Mysql-窗口函数二

文章目录 1. 前百分之N的问题 排名 row_number1.1 需求1.2 准备工作1.3 分析1.4 实现 2. 前百分之N的问题 ntile2.1 介绍2.2 语法2.2.1 示例2.2.2 结果示例2.2.3 注意事项 2.3 需求2.4 分析2.5 实现 3. 前百分之N的问题 百分比 PERCENT_RANK3.1 语法3.1.1 示例3.1.2 注意事项 3…

QT: QVerticalLayout 如何根据 index 获得对应的 widget?

在Qt中,QVBoxLayout(或者更一般地,QLayout类及其子类)并没有直接提供通过索引来访问布局中widgets的API。这是因为QLayout主要是负责管理widgets的排列和大小调整,而不直接存储widgets的列表。widgets的添加和管理是通…

ClickHouse 24.7 版本发布说明

本文字数:8563;估计阅读时间:22 分钟 作者:ClickHouse Team 本文在公众号【ClickHouseInc】首发 时间!又一个月过去了,这意味着又到了发布新版本的时间! 发布概要 本次ClickHouse 24.7 版本包含…

Qt的页面交互

在使用Qt进行页面交互时,你可以通过以下几种方式实现: 1. **信号和槽**:这是Qt中非常重要的一个概念。它提供了一种事件驱动的编程机制,使得对象之间可以通信。当某个事件发生时(例如用户点击了一个按钮)&a…

同一接口,多样实现:Java中两个类实现同一个接口的实践

每日自动更新各类学习教程及工具下载合集 ​​夸克网盘分享​​ 在Java开发中,接口(Interface)是一种强大的工具,它允许我们定义方法的契约,而具体的实现由不同的类来完成。这种设计不仅提升了代码的灵活性和可维护性…

SaaS系统如何选择合适的服务器

SaaS系统如何选择合适的服务器?在构建高效、稳定的SaaS系统时,选择合适的服务器无疑是奠定坚实基础的关键一步。这一过程不仅关乎技术层面的精准匹配,更是对未来业务扩展性、用户体验及数据安全的深思熟虑。以下,我们将深入探讨如何根据SaaS…

Linux---系统安全

文章目录 系统安全系统账号清理密码安全控制命令历史限制终端自动注销如设置时间短的处理方式 使用su命令切换用户用途及用法密码验证限制使用su命令的用户查看su操作记录限制使用su命令的用户查看su操作记录su命令的安全隐患 PAM(Pluggable Authentication Modules)可插拔式认…

QT不阻塞UI的方式

方法1&#xff1a;QtConcurrent #include <QtConcurrent> #include <QFuture> #include <QFutureWatcher> #include <QDebug>void longRunningTask() {// 模拟耗时操作QThread::sleep(5); }void startTask() {QFuture<void> future QtConcurre…