云优采集接口( 上图的日志采集方式以及对比说明(一)(组图))

优采云 发布时间: 2022-03-16 06:21

  云优采集接口(

上图的日志采集方式以及对比说明(一)(组图))

  

  上图是EFK架构图,k8s环境下常用的log采集方法。

  日志要求

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

  2.统计请求接口的耗时。如果最大响应时间超过最大响应时间,应报警并进行针对性调优;

  3 慢sql排行榜和报警;

  4 异常日志排名列表,并报警;

  5 页面请求排名慢并报警;

  k8s 日志采集

  k8s本身不会为你登​​录采集,需要你自己做;

  k8s的容器日志处理方式中使用的集群级日志,

  即容器销毁、pod漂移、Node宕机等都不会影响容器日志;

  

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

  即/var/lib/docker/container;

  通过 Node 上的日志代理转发

  

  在每个节点上部署一个守护进程,运行一个日志代理来采集日志,

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

  优缺点分析:

  比较说明

  优势

  1 每个Node只需要部署一个Pod采集 log 2 不侵入应用

  缺点

  应用程序输出的日志必须直接输出到容器的stdout和stderr

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

  

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

  日志输入源:日志文件

  日志处理: logging-agent ,如 fluentd

  日志存储:如elasticSearch、kafka

  优缺点分析:

  比较说明

  优势

  1 简单部署;2 主机友好;

  缺点

  1. 消耗更多资源;2. 通过 kubectl 日志看不到日志

  例子:

  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和内存,共享卷处理效率比较高

  缺点

  主机上有两条相同的日志,磁盘利用率不高

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

  

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

  EFK 引入 fluentd

  fluentd 是一个用于统一日志记录层的开源数据采集器

  flentd 允许您统一日志采集和更好地使用和理解数据;

  

  四大特点:

  统一日志层

  fluentd 隔离数据源,提供与后台系统统一的日志层;

  简单灵活

  提供500多个插件,连接大量数据源和输出源,内核简单;

  广泛的验证

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

  最大的客户端通过它从 50,000 多台服务器采集日志

  **云原生**

  是云原生CNCF的成员项目

  

  4大优势:

  统一的 JSON 日志

  

  fluentd尝试使用JSON结构化数据,统一处理日志数据的各个方面,采集、过滤、缓存、输出日志到多个目的地,下游数据处理使用Json更简单,因为它已经有足够的访问结构并保留了足够的灵活性场景;

  插件架构

  

  fluntd 有一个灵活的插件系统,允许社区扩展其功能。超过 500 个社区贡献的插件连接了许多数据源和目的地;通过插件,您可以开始更好地利用您的日志

  最低资源消耗

  

  用c和ruby写的,对系统资源要求很低,40M左右的内存可以处理13k/次/秒,如果需要更紧凑的内存,可以使用Fluent bit,更轻的Fluentd

  内核可靠

  

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

  还支持鲁棒故障并可以配置高可用性模式,超过 2000 家数据驱动的公司在不同的产品中依靠 Fluentd 更好地使用和理解他们的日志数据

  使用流利的理由:

  简单灵活

  10分钟即可在电脑上安装fluentd,立即下载,超过500个插件连接数据源和目的地,插件也易于开发和部署;

  开源

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

  可靠和高性能

  超过 5,000 家数据驱动型公司的不同产品和服务依靠 fluentd 更好地使用和理解数据。事实上,根据datadog的调查,使用docker运行的技术排在前7位;

  一些流利的用户拥有来自数千台机器的实时 采集 数据。每个实例只需要大约 40M 的内存。缩放时,可以节省大量内存。

  社区

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

  大公司使用代言:微软、亚马逊;pptv;

  

  

  可以与elasticSearch + kibana结合,组成日志套件;

  快速搭建EFK集群,采集应用日志,配置性能排名;

  

  弹性搜索

  Elasticsearch 是一个分布式的 RESTful 搜索和数据分析引擎。

  能够解决正在出现的各种用例。作为 Elastic Stack 的核心,

  它集中存储您的数据,并帮助您发现预期和意外。

  详细介绍:

  木花

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

  旨在与 Elasticsearch 配合使用。您可以使用 Kibana 在 Elasticsearch 索引中搜索数据,

  查看,互动。您可以轻松地使用图表、表格和地图以多种方式分析和呈现数据。

  Kibana 使大数据易于理解。这很简单,

  基于浏览器的界面允许您快速创建和共享动态数据仪表板,以跟踪 Elasticsearch 中的实时数据变化。

  详细介绍:

  容器化 EFK 实现路径

  直接往下拖代码,然后配置上下文、命名空间,就可以安装了;

  cd elk-kubernetes

./deploy.sh --watch

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

  #!/bin/sh

CDIR=$(cd `dirname "$0"` && pwd)

cd "$CDIR"

print_red() {

printf '%b' "33[91m$133[0mn"

}

print_green() {

printf '%b' "33[92m$133[0mn"

}

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是通过日志代理客户端采集应用日志的常用实现方式。

  

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

  程序员的信标

  转载请注明原文链接:Cloud Native Series 5 EFK for Containerized Logs

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线