上图是EFK架构图,k8s环境下常见的日志采集方式。

日志需求

1 集中采集微服务的日志,可以根据请求id追踪到完整的日志;

2 统计请求接口的耗时,超出最长响应时间的,需要做报警,并针对性的进行调优;

3 慢sql排行榜,并报警;

4 异常日志排行榜,并报警;

5 慢页面请求排行,并告警;

k8s的日志采集

k8s本身不会为你做日志采集,需要自己做;

k8s的容器日志处理方式采用的 集群层级日志,

即容器销毁,pod漂移,Node宕机不会对容器日志造成影响;

容器的日志会输出到stdout,stderr,对应的存储在宿主机的目录中,

即 /var/lib/docker/container ;

Node上通过日志代理转发

在每个node上部署一个daemonset , 跑一个logging-agent收集日志,

比如fluentd, 采集宿主机对应的数据盘上的日志,然后输出到日志存储服务或者消息队列;

优缺点分析:

对比 说明
优点 1每个Node只需要部署一个Pod采集日志 2对应用无侵入
缺点 应用输出的日志都必须直接输出到容器的stdout,stderr中

Pod内部通过sidecar容器转发到日志服务

通过在pod中启动一个sidecar容器,比如fluentd, 读取容器挂载的volume目录,输出到日志服务端;

日志输入源: 日志文件

日志处理: logging-agent ,比如fluentd

日志存储: 比如elasticSearch , kafka

优缺点分析:

对比 说明
优点 1 部署简单;2 对宿主机友好;
缺点 1. 消耗较多的资源;2. 日志通过kubectl logs 无法看到

示例:

apiVersion: v1
kind: Pod
metadata:
name: counter
spec:
containers:
- name: count
image: busybox
args:
- /bin/sh
- -c
- >
i=0;
while true;
do
echo "$i:$(data)" >> /var/log/1.log
echo "$(data) INFO $i" >> /var/log/2.log
i=$((i+1))
sleep 1;
done
volumeMounts:
- name: varlog
mountPath: /var/log
- name: count-agent
image: k8s.gcr.io/fluentd-gcp:1.30
env:
- name: FLUENTD_ARGS
value: -c /etc/fluentd-config/fluentd.conf
valumeMounts:
- name: varlog
mountPath: /var/log
- name: config-volume
mountPath: /etc/fluentd-config
volumes:
- name: varlog
emptyDir: {}
- name: config-volume
configMap:
name: fluentd-config

Pod内部通过sidecar容器输出到stdout

适用于应用容器只能把日志输出到文件,无法输出到stdout,stderr中的场景;

通过一个sidecar容器,直接读取日志文件,再重新输出到stdout,stderr中,

即可使用Node上通过日志代理转发的模式;

优缺点分析:

对比 说明
优点 只需耗费比较少的cpu和内存,共享volume处理效率比较高
缺点 宿主机上存在两份相同的日志,磁盘利用率不高

应用容器直接输出日志到日志服务

适用于有成熟日志系统的场景,日志不需要通过k8s;

EFK介绍

fluentd

fluentd是一个统一日志层的开源数据收集器。

flentd允许你统一日志收集并更好的使用和理解数据;

四大特征:

统一日志层

fluentd隔断数据源,从后台系统提供统一日志层;

简单灵活

提供了500多个插件,连接非常多的数据源和输出源,内核简单;

广泛验证

5000多家数据驱动公司以来Fluentd

最大的客户通过它收集5万多台服务器的日志

**云原生**

是云原生CNCF的成员项目

4大优势:

统一JSON日志

fluentd尝试采用JSON结构化数据,这就统一了所有处理日志数据的方面,收集,过滤,缓存,输出日志到多目的地,下行流数据处理使用Json更简单,因为它已经有足够的访问结构并保留了足够灵活的scemas;

插件化架构

fluntd 有灵活的插件体系允许社区扩展功能,500多个社区贡献的插件连接了很多数据源和目的地; 通过插件,你可以开始更好的使用你的日志

最小资源消耗

c和ruby写的,需要极少的系统资源,40M左右的内存可以处理13k/时间/秒 ,如果你需要更紧凑的内存,可以使用Fluent bit ,更轻量的Fluentd

内核可靠

Fluentd支持内存和基于文件缓存,防止内部节点数据丢失;

也支持robust失败并且可以配置高可用模式, 2000多家数据驱动公司在不同的产品中依赖Fluentd,更好的使用和理解他们的日志数据

使用fluentd的原因:

简单灵活

10分钟即可在你的电脑上安装fluentd,你可以马上下载它,500多个插件打通数据源和目的地,插件也很好开发和部署;

开源

**基于Apache2.0证书  完全开源 **

可靠高性能

5000多个数据驱动公司的不同产品和服务依赖fluentd,更好的使用和理解数据,实际上,基于datadog的调查,是使用docker运行的排行top7的技术;

一些fluentd用户实时采集上千台机器的数据,每个实例只需要40M左右的内存,伸缩的时候,你可以节省很多内存

社区

fluentd可以改进软件并帮助其它人更好的使用

大公司使用背书: 微软 , 亚马逊; pptv ;

可以结合elasticSearch + kibana来一起组成日志套件;

快速搭建EFK集群并收集应用的日志,配置性能排行榜;

elasticsearch

Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,

能够解决不断涌现出的各种用例。 作为 Elastic Stack 的核心,

它集中存储您的数据,帮助您发现意料之中以及意料之外的情况。

详细介绍:https://www.elastic.co/guide/cn/elasticsearch/guide/current/foreword_id.html

kibana

Kibana 是一款开源的数据分析和可视化平台,它是 Elastic Stack 成员之一,

设计用于和 Elasticsearch 协作。您可以使用 Kibana 对 Elasticsearch 索引中的数据进行搜索、

查看、交互操作。您可以很方便的利用图表、表格及地图对数据进行多元化的分析和呈现。

Kibana 可以使大数据通俗易懂。它很简单,

基于浏览器的界面便于您快速创建和分享动态数据仪表板来追踪 Elasticsearch 的实时数据变化.

详细介绍:https://www.elastic.co/guide/cn/kibana/current/introduction.html

容器化EFK实现路径

https://github.com/kayrus/elk-kubernetes

直接拖代码下来,然后配置后 context, namespace , 即可安装;

cd elk-kubernetes

./deploy.sh --watch

下面是deploy.sh的脚本,可以简单看一下:

#!/bin/sh

CDIR=$(cd `dirname "$0"` && pwd)
cd "$CDIR" print_red() {
printf '%b' "\033[91m$1\033[0m\n"
} print_green() {
printf '%b' "\033[92m$1\033[0m\n"
} render_template() {
eval "echo \"$(cat "$1")\""
} KUBECTL_PARAMS="--context=250091890580014312-cc3174dcd4fc14cf781b6fc422120ebd8"
NAMESPACE=${NAMESPACE:-sm}
KUBECTL="kubectl ${KUBECTL_PARAMS} --namespace=\"${NAMESPACE}\"" eval "kubectl ${KUBECTL_PARAMS} create namespace \"${NAMESPACE}\"" #NODES=$(eval "${KUBECTL} get nodes -l 'kubernetes.io/role!=master' -o go-template=\"{{range .items}}{{\\\$name := .metadata.name}}{{\\\$unschedulable := .spec.unschedulable}}{{range .status.conditions}}{{if eq .reason \\\"KubeletReady\\\"}}{{if eq .status \\\"True\\\"}}{{if not \\\$unschedulable}}{{\\\$name}}{{\\\"\\\\n\\\"}}{{end}}{{end}}{{end}}{{end}}{{end}}\"")
NODES=$(eval "${KUBECTL} get nodes -l 'sm.efk=data' -o go-template=\"{{range .items}}{{\\\$name := .metadata.name}}{{\\\$unschedulable := .spec.unschedulable}}{{range .status.conditions}}{{if eq .reason \\\"KubeletReady\\\"}}{{if eq .status \\\"True\\\"}}{{if not \\\$unschedulable}}{{\\\$name}}{{\\\"\\\\n\\\"}}{{end}}{{end}}{{end}}{{end}}{{end}}\"")
ES_DATA_REPLICAS=$(echo "$NODES" | wc -l) if [ "$ES_DATA_REPLICAS" -lt 3 ]; then
print_red "Minimum amount of Elasticsearch data nodes is 3 (in case when you have 1 replica shard), you have ${ES_DATA_REPLICAS} worker nodes"
print_red "Won't deploy more than one Elasticsearch data pod per node exiting..."
exit 1
fi print_green "Labeling nodes which will serve Elasticsearch data pods"
for node in $NODES; do
eval "${KUBECTL} label node ${node} elasticsearch.data=true --overwrite"
done for yaml in *.yaml.tmpl; do
render_template "${yaml}" | eval "${KUBECTL} create -f -"
done for yaml in *.yaml; do
eval "${KUBECTL} create -f \"${yaml}\""
done eval "${KUBECTL} create configmap es-config --from-file=es-config --dry-run -o yaml" | eval "${KUBECTL} apply -f -"
eval "${KUBECTL} create configmap fluentd-config --from-file=docker/fluentd/td-agent.conf --dry-run -o yaml" | eval "${KUBECTL} apply -f -"
eval "${KUBECTL} create configmap kibana-config --from-file=kibana.yml --dry-run -o yaml" | eval "${KUBECTL} apply -f -" eval "${KUBECTL} get pods $@"

简单分解一下部署的流程:

我的k8s环境中没有搭建成功,后续搭建成功了再出详细的安装笔记。

小结

一句话概括本篇:EFK是一种通过日志代理客户端采集应用日志比较常用的实现方式。

原创不易,关注诚可贵,转发价更高!转载请注明出处,让我们互通有无,共同进步,欢迎沟通交流。

云原生系列5 容器化日志之EFK的更多相关文章

  1. 8.云原生之Docker容器镜像构建最佳实践浅析

    转载自:https://www.bilibili.com/read/cv15220861/?from=readlist 本章目录 0x02 Docker 镜像构建最佳实践浅析 1.Dockerfile ...

  2. 云原生系列2 部署你的第一个k8s应用

    云原生的概念和理论体系非常的完备,but talk is cheap , show me the code ! 但是作为一名程序员,能动手的咱绝对不多BB,虽然talk并不cheap , 能跟不同层次 ...

  3. 云原生系列3 pod核心字段

    pod是容器化的基础,好比大楼的地基. Pod跟容器的关系 类比一下: POD: 物理机容器: 物理机上的一个进程: 容器只是Pod的一个普通字段. Pod的作用范围 跟容器的linux namesp ...

  4. .NET Core/.NET5/.NET6 开源项目汇总6:框架与架构设计(DDD、云原生/微服务/容器/DevOps/CICD等)项目

    系列目录     [已更新最新开发文章,点击查看详细] 开源项目是众多组织与个人分享的组件或项目,作者付出的心血我们是无法体会的,所以首先大家要心存感激.尊重.请严格遵守每个项目的开源协议后再使用.尊 ...

  5. 5.云原生之Docker容器网络介绍与实践

    转载自:https://www.bilibili.com/read/cv15185166/?from=readlist 例如, 当在一台未经过特殊网络配置的centos 或 ubuntu机器上安装完d ...

  6. 2.云原生之Docker容器环境安装实践

    转载自:https://www.bilibili.com/read/cv15181036/?from=readlist 官方一键安装脚本 补充时间:[2020年4月22日 11:00:59] 一键安装 ...

  7. 云原生系列1 pod基础

    POD解决了什么问题? 成组资源调度问题的解决. mesos采用的资源囤积策略容易出现死锁和调度效率低下问题:google采用的乐观调度技术难度非常大: 而k8s使用pod优雅的解决了这个问题. po ...

  8. 云原生系列6 基于springcloud架构风格的本地debug实现

    debug是程序员在日常开发中最常使用的操作, 那么,你是如何快速在微服务架构风格下快速debug后端服务呢? 开发现状 开发的理想状态 本地调测的使用步骤 登录智能网关 如果集成开发环境是在本地局域 ...

  9. 7.云原生之Docker容器Dockerfile镜像构建浅析与实践

    转载自:https://www.bilibili.com/read/cv15220707/?from=readlist Dockerfile 镜像构建浅析与实践 描述:Dockerfile是一个文本格 ...

随机推荐

  1. HTML5 使用浏览器内置数据库之 indexedDB

    indexedDB是H5规范里的浏览器内置数据库,是nosql数据库的一种.因为另一种数据库Web SQL不再受W3C支持,所以还得学习下这个. 基本情况 兼容性:ie11及以上都支持, W3C是这么 ...

  2. Jenkins入门教程

    Jenkins入门教程 @ 目录 Jenkins入门教程 1. 什么是Jenkins 1.1 我们为啥需要jenkins 1.2. Jenkin实现原理 2. Jenkins搭建 2.1. Jenki ...

  3. (十五)整合 Drools规则引擎,实现高效的业务规则

    整合 Drools规则引擎,实现高效的业务规则 1.Drools引擎简介 1.1 规则语法 2.SpringBoot整合Drools 2.1 项目结构 2.2 核心依赖 2.3 配置文件 3.演示案例 ...

  4. JavaScript——DOM操作

    DOM-(Document Object Model)即文档对象模型. JavaScript可以动态地修改DOM,从而来修改HTML的内容. 查找HTML元素 通过 id 找到 HTML 元素 通过标 ...

  5. java架构《并发线程中级篇》

    java多线程的三大设计模式 本章主要记录java常见的三大设计模式,Future.Master-Worker和生产者-消费者模式. 一.Future模式 使用场景:数据可以不及时返回,到下一次实际要 ...

  6. jquery的ajax提交时加载处理方法

    1.定义全局的,就是所有的ajax的请求的加载都会出现相同的提示 $(function(){ //加载成功显示的状态 $("#showLoading").ajaxSuccess(f ...

  7. sentinel流量控制和熔断降级执行流程之源码分析

    前言: sentinel是阿里针对服务流量控制.熔断降级的框架,如何使用官方都有很详细的文档,下载它的源码包 里面对各大主流框都做了适配按理,本系列文章目的 主要通过源码分析sentinel流量控制和 ...

  8. 牛客练习赛64 D【容斥+背包】

    牛客练习赛64 D.宝石装箱 Description \(n\)颗宝石装进\(n\)个箱子使得每个箱子中都有一颗宝石.第\(i\)颗宝石不能装入第\(a_i\)个箱子.求合法的装箱方案对\(99824 ...

  9. P3980 [NOI2008]志愿者招募 (费用流)

    题意:最多1000天 每天需要至少ai个工人施工 有10000种工人可以雇佣 每种工人可以工作si到ti天 雇佣一个的花费是ci 问怎样安排使得施工花费最少 思考:最直白的建模方式 就是每种工人可以和 ...

  10. 【POJ 2411】【Mondriaans Dream】 状压dp+dfs枚举状态

    题意: 给你一个高为h,宽为w的矩阵,你需要用1*2或者2*1的矩阵填充它 问你能有多少种填充方式 题解: 如果一个1*2的矩形横着放,那么两个位置都用二进制1来表示,如果是竖着放,那么会对下一层造成 ...