• 容器本身特性:

    • 采集目标多:容器本身的特性导致采集目标多,需要采集容器内日志、容器 stdout。对于容器内部的文件日志采集,现在并没有一个很好的工具能够去动态发现采集。针对每种数据源都有对应的采集软件,但缺乏一站式的工具。
    • 弹性伸缩难:kubernetes 是分布式的集群,服务、环境的弹性伸缩对于日志采集带来了很大的困难,无法像传统虚拟机环境下那样,事先配置好日志的采集路径等信息,采集的动态性以及数据完整性是非常大的挑战。
  • 现有日志工具的一些缺陷:
    • 缺乏动态配置的能力。目前的采集工具都需要事先手动配置好日志采集方式和路径等信息,因为它无法能够自动感知到容器的生命周期变化或者动态漂移,所以它无法动态地去配置。
    • 日志采集重复或丢失的问题。因为现在的一些采集工具基本上是通过 tail 的方式来进行日志采集的,那么这里就可能存在两个方面的问题:一个是可能导致日志丢失,比如采集工具在重启的过程中,而应用依然在写日志,那么就有可能导致这个窗口期的日志丢失;而对于这种情况一般保守的做法就是,默认往前多采集 1M 日志或 2M 的日志,那么这就又会可能引起日志采集重复的问题。
    • 未明确标记日志源。因为一个应用可能有很多个容器,输出的应用日志也是一样的,那么当我们将所有应用日志收集到统一日志存储后端时,在搜索日志的时候,我们就无法明确这条日志具体是哪一个节点上的哪一个应用容器产生的。

本文档将介绍一种 Docker 日志收集工具 log-pilot,结合 Elasticsearch 和 kibana 等工具,形成一套适用于 kubernetes 环境下的一站式日志解决方案。

GitHub - AliyunContainerService/log-pilot: Collect logs for docker containersCollect logs for docker containers. Contribute to AliyunContainerService/log-pilot development by creating an account on GitHub.https://github.com/AliyunContainerService/log-pilot容器日志采集利器Log-Pilot-阿里云开发者社区容器时代越来越多的传统应用将会逐渐容器化,而日志又是应用的一个关键环节,那么在应用容器化过程中,如何方便快捷高效地来自动发现和采集应用的日志,如何与日志存储系统协同来高效存储和搜索应用日志,本文将主要跟大家分享下如何通过Log-Pilot来采集容器的标准输出日志和容器内文件日志。https://developer.aliyun.com/article/674327

Log-Pilot 支持容器事件管理,它能够动态地监听容器的事件变化,然后依据容器的标签来进行解析,生成日志采集配置文件,然后交由采集插件来进行日志采集。

相关特点和优势,可以点击上方的链接学习。

方案

从日志的采集方式上,在我看来方案大致主要分为两种:

**(1)POD 里面安装logging agent**

每个pod里面都要安装一个agent,无论是以放在本container还是以sidecar的方式部署,很明显会占用很多资源,基本不推荐

**(2)在节点上安装logging agent(推荐)**

其实容器stdout,stderr的日志最终也是落在宿主机上,而容器内的路径可以通过配置volumeMount 在宿主机上配置映射即可,所以这种方式还是最可行的

当然应用还可以自己通过代码直接上报给日志服务,但是这种方式不够通用,还增加了业务代码的复杂性

log-Pilot是一个智能容器日志采集工具,它不仅能够高效便捷地将容器日志采集输出到多种存储日志后端,同时还能够动态地发现和采集容器内部的日志文件,更多咨询可以移步这里。

log-Pilot目前支持两种工具对日志进行收集,Fluentd Plugin 和 Filebeat Plugin。

Log-Pilot支持容器事件管理,它能够动态地监听容器的事件变化,然后依据容器的标签来进行解析,生成日志采集配置文件,然后交由采集插件来进行日志采集

以下的的安装配置,是基于上一篇的EFK的配置,只是修改收集端(有必要,可以了解上一篇的文章)

Kubernetes安装EFK日志收集_南宫乘风-Linux运维-虚拟化容器-Python编程 ownit.top-CSDN博客

准备

参考官方部署文档的基础上使用本项目manifests/efk/部署,以下为几点主要的修改:

  • 增加 log-Pilot 部署代码(解决 不支持 es7.0 版本以上的痛点)
  • 修改官方docker镜像,方便国内下载加速
  • 修改 es-statefulset.yaml 支持日志存储持久化等
  • 增加自动清理日志

创建 Elasticsearch 集群

apiVersion: v1
kind: Namespace
metadata:name: logging

1、 es-service.yaml

kind: Service
apiVersion: v1
metadata:name: elasticsearchnamespace: logginglabels:app: elasticsearch
spec:selector:app: elasticsearchclusterIP: Noneports:- port: 9200name: rest- port: 9300name: inter-node

定义了一个名为 elasticsearch 的 Service,指定标签 app=elasticsearch,当我们将 Elasticsearch StatefulSet 与此服务关联时,服务将返回带有标签 app=elasticsearch的 Elasticsearch Pods 的 DNS A 记录,然后设置 clusterIP=None,将该服务设置成无头服务。最后,我们分别定义端口9200、9300,分别用于与 REST API 交互,以及用于节点间通信。

[root@master01 efk]# kubectl apply -f es-service.yaml
service/elasticsearch-logging created
[root@master01 efk]# kubectl get svc -n kube-system
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                      AGE
elasticsearch-logging   ClusterIP   None            <none>        9200/TCP                     15s

es-statefulset.yaml

apiVersion: apps/v1
kind: StatefulSet
metadata:name: esnamespace: logging
spec:serviceName: elasticsearchreplicas: 3selector:matchLabels:app: elasticsearchtemplate:metadata:labels: app: elasticsearchspec:nodeSelector:  #记得给节点把标签,不然会找到不符合的节点es: loginitContainers:- name: increase-vm-max-mapimage: busyboxcommand: ["sysctl", "-w", "vm.max_map_count=262144"]securityContext:privileged: true- name: increase-fd-ulimitimage: busyboxcommand: ["sh", "-c", "ulimit -n 65536"]securityContext:privileged: truecontainers:- name: elasticsearchimage: docker.elastic.co/elasticsearch/elasticsearch:7.6.2ports:- name: restcontainerPort: 9200- name: intercontainerPort: 9300resources:limits:cpu: 1000mrequests:cpu: 1000mvolumeMounts:- name: datamountPath: /usr/share/elasticsearch/dataenv:- name: cluster.namevalue: k8s-logs- name: node.namevalueFrom:fieldRef:fieldPath: metadata.name- name: cluster.initial_master_nodesvalue: "es-0,es-1,es-2"- name: discovery.zen.minimum_master_nodesvalue: "2"- name: discovery.seed_hostsvalue: "elasticsearch"- name: ES_JAVA_OPTSvalue: "-Xms512m -Xmx512m"- name: network.hostvalue: "0.0.0.0"volumeClaimTemplates:- metadata:name: datalabels:app: elasticsearchspec:accessModes: [ "ReadWriteOnce" ]storageClassName: nfsdataresources:requests:storage: 5Gi 

Pods 部署完成后,我们可以通过请求一个 REST API 来检查 Elasticsearch 集群是否正常运行。使用下面的命令将本地端口9200 转发到 Elasticsearch 节点(如es-0)对应的端口:

[root@master01 new]# kubectl port-forward es-0 9200:9200 --namespace=logging
Forwarding from 127.0.0.1:9200 -> 9200
Forwarding from [::1]:9200 -> 9200
curl http://localhost:9200/_cluster/state?pretty

看到上面的信息就表明我们名为 k8s-logs 的 Elasticsearch 集群成功创建了3个节点:es-0,es-1,和es-2,当前主节点是 es-0

创建 Kibana 服务

Elasticsearch 集群启动成功了,接下来我们可以来部署 Kibana 服务,新建一个名为 kibana.yaml 的文件,对应的文件内容如下:

kibana.yaml

apiVersion: v1
kind: Service
metadata:name: kibananamespace: logginglabels:app: kibana
spec:ports:- port: 5601type: NodePortselector:app: kibana---
apiVersion: apps/v1
kind: Deployment
metadata:name: kibananamespace: logginglabels:app: kibana
spec:selector:matchLabels:app: kibanatemplate:metadata:labels:app: kibanaspec:nodeSelector:es: logcontainers:- name: kibanaimage: docker.elastic.co/kibana/kibana:7.6.2resources:limits:cpu: 1000mrequests:cpu: 1000menv:- name: ELASTICSEARCH_HOSTSvalue: http://elasticsearch:9200ports:- containerPort: 5601

上面我们定义了两个资源对象,一个 Service 和 Deployment,为了测试方便,我们将 Service 设置为了 NodePort 类型,Kibana Pod 中配置都比较简单,唯一需要注意的是我们使用 ELASTICSEARCH_HOSTS 这个环境变量来设置Elasticsearch 集群的端点和端口,直接使用 Kubernetes DNS 即可,此端点对应服务名称为 elasticsearch,由于是一个 headless service,所以该域将解析为3个 Elasticsearch Pod 的 IP 地址列表。 配置完成后,直接使用 kubectl 工具创建:

kubectl create -f kibana.yaml
service/kibana created
deployment.apps/kibana created

创建完成后,可以查看 Kibana Pod 的运行状态

[root@master01 new]#  kubectl get pods --namespace=logging
NAME                      READY   STATUS    RESTARTS   AGE
es-0                      1/1     Running   0          13m
es-1                      1/1     Running   0          9m48s
es-2                      1/1     Running   0          7m46s
kibana-8476dc9bbf-6mm6k   1/1     Running   0          3m2s

如果 Pod 已经是 Running 状态了,证明应用已经部署成功了,然后可以通过 NodePort 来访问 Kibana 这个服务,在浏览器中打开http://<任意节点IP>:31838即可,

出现 这个代表成功

部署 log-Pilot

Log-pilot是一个智能容器日志采集工具,它不仅能够高效便捷地将容器日志采集输出到多种存储日志后端,同时还能够动态地发现和采集容器内部的日志文件。

针对前面提出的日志采集难题,Log-pilot通过声明式配置实现强大的容器事件管理,可同时获取容器标准输出和内部文件日志,解决了动态伸缩问题,此外,Log-pilot具有自动发现机制、CheckPoint及句柄保持的机制、自动日志数据打标、有效应对动态配置、日志重复和丢失以及日志源标记等问题。

本质

通过变量和模版文件生产日志收集配置文件,对日志进行采集。
容器内文件日志路径需要配置emptyDir

log-pilot.yaml

apiVersion: apps/v1
kind: DaemonSet
metadata:name: log-pilotlabels:app: log-pilot# 设置期望部署的namespace。namespace: logging
spec:selector:matchLabels:app: log-pilotupdateStrategy:type: RollingUpdatetemplate:metadata:labels:app: log-pilotannotations:scheduler.alpha.kubernetes.io/critical-pod: ''spec:# 是否允许部署到Master节点上tolerations。tolerations:- key: node-role.kubernetes.io/mastereffect: NoSchedulecontainers:- name: log-pilot# 版本请参考https://github.com/AliyunContainerService/log-pilot/releases。image: heleicool/log-pilot:7.x-filebeatresources:limits:memory: 500Mirequests:cpu: 200mmemory: 200Mienv:- name: "NODE_NAME"valueFrom:fieldRef:fieldPath: spec.nodeName- name: "LOGGING_OUTPUT"value: "elasticsearch"# 请确保集群到ES网络可达。- name: "ELASTICSEARCH_HOSTS"value: "elasticsearch:9200"# 配置ES访问权限。# - name: "ELASTICSEARCH_USER"#    value: "{es_username}"# - name: "ELASTICSEARCH_PASSWORD"#   value: "{es_password}"volumeMounts:- name: sockmountPath: /var/run/docker.sock- name: rootmountPath: /hostreadOnly: true- name: varlibmountPath: /var/lib/filebeat- name: varlogmountPath: /var/log/filebeat- name: localtimemountPath: /etc/localtimereadOnly: truelivenessProbe:failureThreshold: 3exec:command:- /pilot/healthzinitialDelaySeconds: 10periodSeconds: 10successThreshold: 1timeoutSeconds: 2securityContext:capabilities:add:- SYS_ADMINterminationGracePeriodSeconds: 30volumes:- name: sockhostPath:path: /var/run/docker.sock- name: roothostPath:path: /- name: varlibhostPath:path: /var/lib/filebeattype: DirectoryOrCreate- name: varloghostPath:path: /var/log/filebeattype: DirectoryOrCreate- name: localtimehostPath:path: /etc/localtime

默认阿里云仓库只支持7.x以下版本es的数据写入,使用如下插件可以实现。
git地址:https://github.com/40kuai/log-pilot/tree/filebeat7.x
dockerhub:heleicool/log-pilot:7.x-filebeat

服务日志采集

创建一个标准的 Nginx 服务, 主要是 env 添加了两种,上面我们介绍过

一 是 基于 docker stdout 输出日志 (aliyun_logs_catalina)

二 是 基于 程序指定输出到指定的目录中 (aliyun_logs_access)

( elasticsearch )环境变量中的 name表示Index,这里name 表示 Index,这里 name表示Index,这里name 即是 catalina 和 access, 这里用于 Kibana 查询日志

nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata: name: nginx-dm
spec: replicas: 3selector:matchLabels:name: nginxtemplate: metadata: labels: name: nginx spec: tolerations:- key: "node-role.kubernetes.io/master"effect: "NoSchedule"containers: - name: nginx image: nginx:alpine imagePullPolicy: IfNotPresentenv:- name: aliyun_logs_nginx-logvalue: "stdout"- name: aliyun_logs_accessvalue: "/var/log/nginx/*.log"ports:- containerPort: 80name: http
---
apiVersion: v1
kind: Service
metadata: name: nginx-svc
spec: ports: - port: 80name: httptargetPort: 80protocol: TCP selector: name: nginx

pod.yaml

[root@master01 new]# cat pod2.yaml
apiVersion: v1
kind: Pod
metadata:name: counternamespace: logging  #可以添加空间名称,也会收集到的
spec:containers:- name: countimage: busyboxargs: [/bin/sh, -c,'i=0; while true; do echo "$i: $(date)"; i=$((i+1)); sleep 1; done']env:# 1、stdout为约定关键字,表示采集标准输出日志。# 2、配置标准输出日志采集到ES的catalina索引下。- name: aliyun_logs_catalinavalue: "stdout"# 1、配置采集容器内文件日志,支持通配符。# 2、配置该日志采集到ES的access索引下。

tomcat.yaml

apiVersion: v1
kind: Pod
metadata:name: tomcat
spec:containers:- name: tomcatimage: "tomcat:7.0"env:# 1、stdout为约定关键字,表示采集标准输出日志。# 2、配置标准输出日志采集到ES的catalina索引下。- name: aliyun_logs_catalinavalue: "stdout"# 1、配置采集容器内文件日志,支持通配符。# 2、配置该日志采集到ES的access索引下。- name: aliyun_logs_accessvalue: "/usr/local/tomcat/logs/catalina.*.log"# 容器内文件日志路径需要配置emptyDir。volumeMounts:- name: tomcat-logmountPath: /usr/local/tomcat/logsvolumes:- name: tomcat-logemptyDir: {}

k8s 部署 log-pilot 收集容器标准输出日志和指定路径应用日志 - lixinliang - 博客园

Kubernetes高效收集生产日志相关推荐

  1. 【lnmp+ELK+Nginx+GeoIP】超详细新版ELK8.5.0解析收集Nginx日志并实现数据可视化与IP地址地图可视化教程-2022年11月版

    超详细新版ELK8.5.0+lnmp1.9解析收集Nginx日志并实现数据可视化与IP地址地图可视化教程-2022年11月版 前言 1.基础环境和所需要的软件包 1.1服务器配置(仅供参考) 1.2 ...

  2. 【K8S系列】如何高效查看 k8s日志

    序言 你只管努力,其他交给时间,时间会证明一切. 文章标记颜色说明: 黄色:重要标题 红色:用来标记结论 绿色:用来标记一级论点 蓝色:用来标记二级论点 Kubernetes (k8s) 是一个容器编 ...

  3. Kubernetes 稳定性保障手册 -- 日志专题

    作者 | 悟鹏.沉醉 来源 | 阿里巴巴云原生公众号 <Kubernetes 稳定性保障手册>系列文章: Kubernetes 稳定性保障手册 – 极简版 Kubernetes 稳定性保障 ...

  4. 使用 dotnet-monitor 在 Kubernetes 中收集 .NET metrics

    使用 dotnet-monitor 在 Kubernetes 中收集 .NET metrics Intro dotnet-monitor 是微软推出的一个帮助我们诊断和监控 .NET 应用程序的工具, ...

  5. logstash收集syslog日志

    logstash收集syslog日志 注意:生产用syslog收集日志!!! 编写logstash配置文件 #首先我用rubydebug测试数据 [root@elk-node1 conf.d]# ca ...

  6. fluentd收集K8S日志并以K8S的container_name作为索引名存入Elasticsearch中

    fluentd收集K8S日志并以K8S的container_name作为索引名存入Elasticsearch中 参考地址 https://faun.pub/how-to-create-custom-i ...

  7. ELK分布式日志收集-企业级日志中心

    传统项目中,如果需要在生产环境定位异常的话,我们常常需要在服务器上使用命令的方式查询.而很多情况我们需要用到微服务架构或集群架构,日志被分散在不同的机器上,使得日志的查询变得异常困难.工欲善其事,必先 ...

  8. centos6.5下安装配置ELK及收集nginx日志

    Elasticsearch 是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等. Logstash 是一个完全开 ...

  9. 自定义Flume拦截器,并将收集的日志存储到Kafka中(案例)

    1.引入POM文件 如果想调用Flume,需要引入flume相关的jar包依赖,jar包依赖如下: <?xml version="1.0" encoding="UT ...

最新文章

  1. 第三次组织架构变动背后,腾讯AI走向何方?
  2. Python 爬虫篇 - 通过urllib.request伪装成浏览器绕过反爬虫爬取网页所有连接实例演示,urllib2库的安装
  3. 中兴存储服务器 操作系统,中兴新支点服务器操作系统:企业级的国内服务器操作系统...
  4. 自主招生计算机论文,自主招生
  5. webService、webSocket、socket、http之间的区别
  6. Vmware 连接局域网通过桥接方式
  7. 帮助您快速开始下一个移动APP应用模板、UI设计
  8. Web测试中新增修改功能测试
  9. 记录下帮助一位网友解决的关于android子控件的onTouch或onClick和父OnTouch 冲突的问题。
  10. 常用的一些注入命令!!!
  11. ASP.NET 如何在网页中获取根目录
  12. [IOS, Android] UI Thread的一些思想
  13. SecureCRT 7.3.4 安装图解----破解图解
  14. 【Python游戏】Python实现一个简易版本的阴阳师游戏 | 附带源码
  15. 思科交换机命令大全 一
  16. 聚石塔服务器系统盘在线扩容
  17. 数字图像处理100问—43 Canny 边缘检测:第三步——滞后阈值
  18. 分治算法,逆序对,三维偏序与CDQ分治
  19. 给计算机老师的元旦祝福,送给老师的元旦祝福语
  20. 如何恢复录音删除的录音文件_硬盘分区数据误删除如何恢复?文件删除不用急...

热门文章

  1. 微信小程序分享朋友圈的实现思路与解决办法
  2. 1.1 haas506 2.0开发教程-导学篇
  3. sbit以及#define
  4. Java HashMap 原理
  5. 视频教程-热更新框架设计之客户端热更框架(中部)视频课程-Unity3D
  6. 一打开任务管理器CPU利用率就从百分之百降到正常(TiWorker.exe实锤病毒篇)
  7. 预约鸿蒙os,鸿蒙os2.0
  8. 给初学者的RxJava2.0教程(七)
  9. jeesite如何配置swagger_用JeeSite快速搭建网站(3):提供api接口给移动端
  10. 基于poi的动态导出excel表头以及统计行列数据(全网最全)