ELK
html
2.1 Tomcat镜像制做linux
2.2 Filebeat 制做镜像nginx
2.4 kibana安装docker
2.5 测试镜像apache
2.6 服务检查centos
harvester浏览器
k8s日志收集第一种方式
k8s日志收集第二种方式
环境说明
IP地址 | 服务 | 主机名 |
---|---|---|
10.4.82.119 | docker、k8s_master|node、 | master |
10.4.82.120 | docker、 k8s_node、kibana | node |
10.4.82.115 | es、Harbor镜像仓库、docker (主要做用就是打一个filebeat镜像) | i4t |
提示:filebeat跑在k8s容器内部,因此没有单首创建服务
做为 Beats 家族的一员,Filebeat 是一个轻量级的日志传输工具,它的存在正弥补了 Logstash 的缺点:Filebeat 做为一个轻量级的日志传输工具能够将日志推送到中心 Logstash。
在版本 5.x 中,Elasticsearch 具备解析的能力(像 Logstash 过滤器)— Ingest。这也就意味着能够将数据直接用 Filebeat 推送到 Elasticsearch,并让 Elasticsearch 既作解析的事情,又作存储的事情。也不须要使用缓冲,由于 Filebeat 也会和 Logstash 同样记住上次读取的偏移:
若是须要缓冲(例如,不但愿将日志服务器的文件系统填满),可使用 Redis/Kafka,由于 Filebeat 能够与它们进行通讯:
Filebeat 优势
Filebeat 只是一个二进制文件没有任何依赖。它占用资源极少,尽管它还十分年轻,正式由于它简单,因此几乎没有什么能够出错的地方,因此它的可靠性仍是很高的。它也为咱们提供了不少能够调节的点,例如:它以何种方式搜索新的文件,以及当文件有一段时间没有发生变化时,什么时候选择关闭文件句柄。
Filebeat 缺点
Filebeat 的应用范围十分有限,因此在某些场景下咱们会碰到问题。例如,若是使用 Logstash 做为下游管道,咱们一样会遇到性能问题。正由于如此,Filebeat 的范围在扩大。开始时,它只能将日志发送到 Logstash 和 Elasticsearch,而如今它能够将日志发送给 Kafka 和 Redis,在 5.x 版本中,它还具有过滤的能力。
典型应用场景
Filebeat 在解决某些特定的问题时:日志存于文件,咱们但愿
① 将日志直接传输存储到 Elasticsearch。这仅在咱们只是抓去(grep)它们或者日志是存于 JSON 格式(Filebeat 能够解析 JSON)。或者若是打算使用 Elasticsearch 的 Ingest 功能对日志进行解析和丰富。
② 将日志发送到 Kafka/Redis。因此另一个传输工具(例如,Logstash 或自定义的 Kafka 消费者)能够进一步丰富和转发。这里假设选择的下游传输工具可以知足咱们对功能和性能的要求。
Filebeat是本地文件的日志数据采集器。做为服务器上的代理安装,Filebeat监视日志目录或特定的日志文件tail -f file
并将它们转发给ES、Logstash、Kafka等
Filebeat由二个主要组件组成:prospector和havvester 这些组件一块儿工做读取文件并将时间数据发送到指定的输出
启动Filebeat时,它会启动一个或多个查找器,查看您的日志文件指定的本地路径。对**prospector**所在的每一个日志文件,prospector启动harvester。每一个harvester都会为新内容读取单个日志文件,并将新日志数据发送到libbeat,后者将聚合事件合并聚合数据发送到Filebeat配置的输出
负载读取单个文化的内容。读取每一个文件,并将内容发送到the output。每一个文件启动一个harvester,负责打开和关闭文件,这意味着在运行时文件描述符保持打开状态
若是文件在读取时被删除或重命名,Filebeat将继续读取文件。在harvester关闭以前,磁盘上的空间被保留。默认状况下,Filebeat将文件保持打开状态,直到达到close_inactive状态
关闭harvester会产生如下结果
1.若是在harvester仍在读取文件时文件被删除,则关闭文件句柄,释放底层资源。 2.文件的采集只会在scan_frequency事后从新开始 3.若是在harvester关闭的状况下移动文件,则不会继续处理文件
负责管理harvester并找到全部要读取的文件来源。
若是输入类型为日志,则查找器将查找路径匹配的全部文件,并为每一个文件启动一个harvester。每一个prospector都在本身的Go斜程中运行
如下示例将Filebeat配置为从与指定的匹配的全部日志文件中收集行:
filebeat.prospectors:- type: log paths: - /data/log/*.log - /data/log4j/*.log
Filebeat目前支持两种prospector类型:log
和stdin
每一个prospector类型能够定义屡次
日志prospector检查每一个文件以查看harvester是否须要启动,是否已经运行
只有在harvest关闭后文件大小发生了变化,才会读到新行
注:Filebeat prospector只能读取本地文件,没有功能能够链接到远程主机来读取存储的日志或文件
Filebeat 保存每一个文件的状态并常常讲状态刷新到磁盘上的注册中心中。该状态用于记录harvest正在读取的最后偏移量,并确保发送全部日志行。
若是输出(例如ES或Logstash)没法访问,Filebeat会跟踪最后发送的行,并在输出再次可用时继续读取文件。
在Filebeat运行时,每一个prospector内存中也会保存文件状态信息。因为文件能够被重命名活移动,由于文件名和路径不足易识别文件。对每一个文件,Filebeat存储惟一标示符以检测文件是否先前已经采集过
Filebeat如何确保至少一次交付
Filebeat保证事件至少会被传送到配置的输出一次,而且不会丢失数据。Filebeat可以实现此行为,由于它将每一个事件的传递状态存储在注册文件中。在输出阻塞或未确认全部事件的状况下,Filebeat将继续尝试发送事件,直到接收端确认已收到。
若是Filebeat在发送事件的过程当中关闭,它不会等待输出确认全部收到事件。发送到输出但在Filebeat关闭前未确认的任何事在从新启动Filebeat时会再次发送。这能够确保每一个事件至少发送一次,但最终会重复事件发送到输出。也能够经过设置shutdown_timeout
选项来配置Filebeat以在关闭以前等待特定事件
注:
Filebeat的至少一次交付保证包括日志轮换和删除旧文件的限制。若是将日志文件写入磁盘而且写入速度超过Filebeat能够处理的速度,或者在输出不可用时删除了文件,则可能会丢数据。在Linux,Filebeat也可能由于inode重用而跳过行
本段参考:https://www.jianshu.com/p/6282b04fe06a
Docker安装
wget http://down.abcdocker.com/docker/docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpmwget http://down.abcdocker.com/docker/docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpmyum 安装yum install docker-ce-selinux-17.03.2.ce-1.el7.centos.noarch.rpm -yyum install docker-ce-17.03.2.ce-1.el7.centos.x86_64.rpm -ysystemctl enable docker systemctl start dockersed -i '/ExecStart=\/usr\/bin\/dockerd/i\ExecStartPost=\/sbin/iptables -I FORWARD -s 0.0.0.0\/0 -d 0.0.0.0\/0 -j ACCEPT' /usr/lib/systemd/system/docker.servicesed -i '/dockerd/s/$/ \-\-storage\-driver\=overlay2/g' /usr/lib/systemd/system/docker.servicesystemctl daemon-reload systemctl restart docker#设置存储引擎和防火墙
咱们这里以Tomcat项目为基础进行测试
Docker文件内容以下#这里须要把apache和jdk下载到本地,须要和Dockerfile在同一目录wget http://down.abcdocker.com/docker/jdk1.8.0_66.tar.gzwget http://down.abcdocker.com/docker/apache-tomcat-8.5.39.tar.gz[root@i4t tomcat_test]# cat Dockerfile# docker pull centos################################################################################ INSTALLATION################################################################################ www.i4t.com############################################################################### .o. .o8 .o8 oooo# .888. "888 "888 `888# .8"888. 888oooo. .ooooo. .oooo888 .ooooo. .ooooo. 888 oooo .ooooo. oooo d8b# .8' `888. d88' `88b d88' `"Y8 d88' `888 d88' `88b d88' `"Y8 888 .8P' d88' `88b `888""8P# .88ooo8888. 888 888 888 888 888 888 888 888 888888. 888ooo888 888# .8' `888. 888 888 888 .o8 888 888 888 888 888 .o8 888 `88b. 888 .o 888# o88o o8888o `Y8bod8P' `Y8bod8P' `Y8bod88P" `Y8bod8P' `Y8bod8P' o888o o888o `Y8bod8P' d888b### **** ****# *** *** ** ***# * * ** *## ** **# *** **# ****#####################################################################################FROM centosMAINTAINER www.i4t.com "cyh@i4t.com"WORKDIR /tmp## Please see https://i4t.com/3552.html install JDKCOPY jdk1.8.0_66.tar.gz /tmp RUN tar zxf /tmp/jdk1.8.0_66.tar.gz -C /usr/local/ && rm -rf /tmp/jdk1.8.0_66.tar.gz RUN ln -s /usr/local/jdk1.8.0_66 /usr/local/jdk#/etc/profile ENV JAVA_HOME /usr/local/jdk ENV CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ENV PATH $PATH:$JAVA_HOME/bin# add apache# Please see i4t.com && baidu.com COPY apache-tomcat-8.5.39.tar.gz /tmp RUN tar zxf apache-tomcat-8.5.39.tar.gz -C /usr/local && rm -rf /tmp/apache-tomcat-8.5.39.zip RUN mv /usr/local/apache-tomcat-8.5.39 /usr/local/tomcat#port EXPOSE 8080################################################################################ START###############################################################################ENTRYPOINT /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out
构建tomcat镜像
[root@i4t ~]# docker build -t i4t.com/tomcat/tomcat.v1 /data/tomcat_test/Sending build context to Docker daemon 205.6 MBStep 1/14 : FROM centos ---> 9f38484d220fStep 2/14 : MAINTAINER www.i4t.com "cyh@i4t.com" ---> Using cache ---> 4a7c687c3bf7Step 3/14 : WORKDIR /tmp ---> Using cache ---> 4bc766547f5cStep 4/14 : COPY jdk1.8.0_66.tar.gz /tmp ---> Using cache ---> 2fd3ec55a068Step 5/14 : RUN tar zxf /tmp/jdk1.8.0_66.tar.gz -C /usr/local/ && rm -rf /tmp/jdk1.8.0_66.tar.gz ---> Using cache ---> 3cb37cce7028Step 6/14 : RUN ln -s /usr/local/jdk1.8.0_66 /usr/local/jdk ---> Using cache ---> 790555e157f7Step 7/14 : ENV JAVA_HOME /usr/local/jdk ---> Using cache ---> 9a0bcf883c98Step 8/14 : ENV CLASSPATH .:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar ---> Using cache ---> 9d4f614f7979Step 9/14 : ENV PATH $PATH:$JAVA_HOME/bin ---> Using cache ---> b99a4730d3eaStep 10/14 : COPY apache-tomcat-8.5.39.tar.gz /tmp ---> Using cache ---> 73a8408bc879Step 11/14 : RUN tar zxf apache-tomcat-8.5.39.tar.gz -C /usr/local && rm -rf /tmp/apache-tomcat-8.5.39.zip ---> Using cache ---> 34d63da07d30Step 12/14 : RUN mv /usr/local/apache-tomcat-8.5.39 /usr/local/tomcat ---> Using cache ---> 7dae5cb15207Step 13/14 : EXPOSE 8080 ---> Using cache ---> 8ec8c8470149Step 14/14 : ENTRYPOINT /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out ---> Using cache ---> 0eac795556fbSuccessfully built 0eac795556fb#更改镜像名称docker tag [原镜像] [新镜像]例子:docker tag i4t.com/tomcat/tomcatv1 i4t.com/tomcat/i4tv1
镜像打包完成后,咱们在docker容器手动启动镜像进行测试
[root@i4t tomcat]# docker run -idt --name i4t_tomcat_test -p 80:8080 i4t.com/tomcat/tomcat.v1f6f1621d9464ea2d17a4611393b1950e36f5b7b6c9234f322d636d47fee94e10#run 运行容器-it 进入容器-d 后台运行--name 新容器名称-p 映射端口i4t.com/tomcat/tomcat.v1 镜像名称
在Docker本机使用curl命令验证服务是否正常运行 (主要是判断docker build是否有问题)
容器正常启动访问说明咱们tomcat镜像是没有问题
当咱们镜像打包完成docker启动正常以后,直接push到Harbor
镜像仓库便可
docker push i4t.com/tomcat/i4tv1
下面是harbor搭建文档
harbor安装
这里稍微说明一点,若是是线上环境,须要替换war包操做。能够将上面制做的tomcat镜像为基础镜像,在写一个dockerfile。我这里提供一下
#这里不是重点,我不详细说。步骤放在这# cat dockerfile FROM i4t.com/tomcat/tomcat.v1MAINTAINER abcdocker "i4t.com"COPY ROOT.tgz /data/RUN tar zxf /data/ROOT.tgz -C /usr/local/tomcat/webapps/ && rm -rf /data/ROOT.tgz# docker build -t tomcat_video:v1# docker tag tomcat_video:v1 i4t.com/tomcat_video:v1 # docker push i4t.com/tomcat_video:v1
咱们这里讲的是使用Filebeat来收集日志,ELK安装具体能够参考
ELK 二进制安装并收集nginx日志
tomcat服务已经能够正常运行,如今咱们部署filebeat镜像
[root@i4t filebeat]# docker build -t tomcat_filebeat:v2 /data/filebeat/Sending build context to Docker daemon 50.63 MBStep 1/9 : FROM docker.io/centos ---> 9f38484d220fStep 2/9 : MAINTAINER www.i4t.com <cyh@i4t.com> ---> Using cache ---> bbc4c3a8b392Step 3/9 : WORKDIR /usr/local ---> Using cache ---> 7af655ce0f61Step 4/9 : ENV FILEBEAT_VERSION 6.7.0 ---> Using cache ---> 227c02e65a80Step 5/9 : RUN set -x && curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-${FILEBEAT_VERSION}-linux-x86_64.tar.gz && tar xf filebeat-${FILEBEAT_VERSION}-linux-x86_64.tar.gz -C /usr/local && ln -s /usr/local/filebeat-${FILEBEAT_VERSION}-linux-x86_64 /usr/local/filebeat && chmod +x /usr/local/filebeat/filebeat && mkdir -p /etc/filebeat ---> Running in 6d86756e5c4a+ curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-6.7.0-linux-x86_64.tar.gz % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed100 11.1M 100 11.1M 0 0 382k 0 0:00:29 0:00:29 --:--:-- 1149k+ tar xf filebeat-6.7.0-linux-x86_64.tar.gz -C /usr/local+ ln -s /usr/local/filebeat-6.7.0-linux-x86_64 /usr/local/filebeat+ chmod +x /usr/local/filebeat/filebeat+ mkdir -p /etc/filebeat ---> 8920fb78ff5dRemoving intermediate container 6d86756e5c4aStep 6/9 : ADD ./docker-entrypoint.sh /usr/bin/ ---> d2989df722b1Removing intermediate container dbe668e7cd75Step 7/9 : RUN chmod +x /usr/bin/docker-entrypoint.sh ---> Running in eb7c7304647a ---> 5ea2cb81cad6Removing intermediate container eb7c7304647aStep 8/9 : ENTRYPOINT docker-entrypoint.sh ---> Running in bed03d3aa8e3 ---> cb9d8de0d329Removing intermediate container bed03d3aa8e3Step 9/9 : CMD /usr/local/filebeat/filebeat -e -c /etc/filebeat/filebeat.yml ---> Running in 253dcfbc0ff7 ---> f26910a9c61dRemoving intermediate container 253dcfbc0ff7Successfully built f26910a9c61d
Filebeat Dockerfile内容
[root@i4t filebeat]# cat Dockerfile################################################################################ INSTALLATION###############################################################################FROM docker.io/centosMAINTAINER www.i4t.com <cyh@i4t.com># Install FilebeatWORKDIR /usr/localENV FILEBEAT_VERSION=5.4.0RUN set -x \ && curl -L -O https://artifacts.elastic.co/downloads/beats/filebeat/filebeat-${FILEBEAT_VERSION}-linux-x86_64.tar.gz \ && tar xf filebeat-${FILEBEAT_VERSION}-linux-x86_64.tar.gz -C /usr/local \ && ln -s /usr/local/filebeat-${FILEBEAT_VERSION}-linux-x86_64 /usr/local/filebeat \ && chmod +x /usr/local/filebeat/filebeat \ && mkdir -p /etc/filebeatADD ./docker-entrypoint.sh /usr/bin/RUN chmod +x /usr/bin/docker-entrypoint.shENTRYPOINT ["docker-entrypoint.sh"]CMD ["/usr/local/filebeat/filebeat","-e","-c","/etc/filebeat/filebeat.yml"]######### 脚本内容[root@i4t filebeat]# cat docker-entrypoint.sh#!/bin/bashconfig=/etc/filebeat/filebeat.ymlenvecho 'Filebeat init process done. Ready for start up.'echo "Using the following configuration:"cat /etc/filebeat/filebeat.ymlexec "$@"## Dockerfile和脚本在同一个目录下,而后进行build
打包完成后咱们push到harbor仓库,和tomcat镜像同样的操做
[root@i4t tmp]# docker tag tomcat_filebeat:v2 i4t.com/filebeat/v1[root@i4t tmp]# docker push i4t.com/filebeat/v1:latestThe push refers to a repository [i4t.com/filebeat/v1]de0545fc627a: Pushed8bd9a1a2863c: Pushedf01cc0f2d07b: Pushedd69483a6face: Pushedlatest: digest: sha256:03a8f15e28d012eb19aeb29b4920f7ab5df5365054896fa40f83a97aa1cb55cf size: 1155
1.JDK环境安装
2.Elasticsearch安装
这里不写了,博客有不少了
参考https://i4t.com/3552.html
服务正常启动便可 (咱们这里只须要安装es和es-head插件便可,logstash在另一台)
https://i4t.com/3552.html
只要服务正常启动,没有报错便可
这里咱们使用k8s环境进行测试,没有搭建k8s能够参考 [k8s 1.11源码安装]
tomcat.yaml
[root@yzsjhl82-119 tomcat_test]# cat tomcat_test.yamlapiVersion: extensions/v1beta1kind: Deploymentmetadata: name: tomcat-abcdocker namespace: defaultspec: replicas: 1 template: metadata: labels: k8s-app: tomcat-web spec: containers: - image: 镜像地址/filebeat/v2 imagePullPolicy: Always name: filebeat volumeMounts: - name: app-logs mountPath: /logs - name: filebeat-config mountPath: /etc/filebeat/ - image: 镜像地址/filebeat/tomcat.v1:latest name : tomcat-web imagePullPolicy: Always ports: - containerPort: 8080 volumeMounts: - name: app-logs mountPath: /usr/local/tomcat/logs volumes: - name: app-logs emptyDir: {} - name: filebeat-config configMap: name: filebeat-config
tomcat_server.xml (端口暴露)
[root@master tomcat_test]# cat tomcat_server.yamlapiVersion: v1kind: Servicemetadata: name: tomcat-web labels: k8s-app: tomcat-webspec: type: NodePort ports: - port: 8080 protocol: TCP targetPort: 8080 name: http nodePort: 30001 selector: k8s-app: tomcat-web
configmap.xml
经过configmap的形式建立filebeat.yml配置文件,指定收集日志的路径、elasticsearch的配置信息及索引名称
[root@master tomcat_test]# cat tomcat_configmap.yamlapiVersion: v1kind: ConfigMapmetadata: name: filebeat-configdata: filebeat.yml: | filebeat.prospectors: - input_type: log paths: - "/logs/*" output.elasticsearch: hosts: ["10.4.82.115:9200"] index: "filebeat-tomcat-log"# hosts指定es地址# index 索引名称
建立索引
[root@master tomcat_test]# kubectl create -f tomcat_configmap.yamlconfigmap/filebeat-config created[root@master tomcat_test]# kubectl create -f tomcat_test.yamldeployment.extensions/tomcat-abcdocker created[root@master tomcat_test]# kubectl create -f tomcat_server.yamlservice/tomcat-web created
咱们须要检查如下
1.检查pod是否运行正常 2.检查server是否正常 3.检查configmap是否建立完成 4.kubectl经常使用命令 https://k.i4t.com/15356201695268.html
查看服务整个状态是否正常
[root@master tomcat_test]# kubectl get svc,pod,configmapNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGEservice/kubernetes ClusterIP 10.254.0.1 <none> 443/TCP 97dservice/nginx-service NodePort 10.254.167.71 <none> 80:31000/TCP 97dservice/tomcat-web NodePort 10.254.237.208 <none> 8080:30001/TCP 3mNAME READY STATUS RESTARTS AGEpod/tomcat-abcdocker-56f9547997-2zz7c 2/2 Running 0 3mNAME DATA AGEconfigmap/filebeat-config 1 3m
查看pod容器是否异常
1.查看tomcat镜像日志kubectl logs tomcat-abcdocker-56f9547997-2zz7c filebeat#这里的pod名称可能不是这个2.查看filebeat镜像日志kubectl logs tomcat-abcdocker-56f9547997-2zz7c tomcat-web
容器只要没有error报错就ok
Filebaet log
蓝色为ES地址,红色为启动正常
tomcat log
k8s服务是没有问题,咱们浏览器访问一下 端口为31000
接下来查看一下es日志
[root@i4t ~]# curl -XGET '10.4.82.115:9200/_cat/indices?v&pretty'health status index uuid pri rep docs.count docs.deleted store.size pri.store.sizeyellow open filebeat-tomcat-log jRWrRLQjQ2SPTAe-wmy_EA 5 1 272 0 244.6kb 244.6kb
经过head插件查看是否有数据
而且已经实时打印
进入kibana控制台