我们在k8s部署服务时,一般来说一个服务会对应一类pod,而pod通过rs实现副本集,而这些pod的日志一般有控制台stdout和文件的,一般会把这些日志最终输出到elasticsearch里,再通过kabana进行分析,而在实现由pod到elasticsearch(es)时有多种方法,下面我列举一下:

  1. 直接从标准控制台 stdout中通过fluentd进行收集,再存到es( 早期docker有实现)
  2. 通过logback里的fluentd包,直接把日志输出到fluentd,再存到es
  3. 在k8s里,可以为pod添加一个边车(边斗,sidecar),这个边车主要是fluentd插件,从容器日志文件里读取日志,收集到es

从上面的解析可以看到第1种如果你是docker swarm环境可以使用,而第2种与业务代码耦合太紧也不合适,只有第三种是未来的趋势,目前大都是使用这种方式!

实现方式

1 sidecar的fluentd的mapconfig

apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
namespace: saas
data:
fluentd.conf: |
<source>
type tail
format none
path /var/log/*.log
pos_file /var/log/log.pos
tag saas
</source> <match **>
@id elasticsearch
@type elasticsearch
@log_level debug
index_name fluentd
type_name _doc
host elasticsearch.elk
port 9200
include_tag_key true
tag_key @log_name
logstash_format true
flush_interval 10s
</match>

运行

kubectl create -f fluentd-config-sidecar.yaml

测试一个pod,像容器输出日志到目录,定时反复输出

apiVersion: v1
kind: Pod
metadata:
labels:
example: logging-sidecar
name: logging-sidecar-example
spec:
containers:
- name: synthetic-logger
image: 172.17.0.22:8888/saas/hello-world:latest
command: ["bash", "-c", "i=\"0\"; while true; do echo \"`hostname`: $i \" >> /var/log/1.log; date --rfc-3339 ns >> /var/log/1.log; sleep 4; i=$[$i+1]; done"]
volumeMounts:
- name: varlog
mountPath: /var/log
- name: sidecar-log-collector
image: registry.cn-beijing.aliyuncs.com/k8s-mqm/fluentd-elasticsearch:v2.1.0
env:
- name: FLUENTD_ARGS
value: -c /etc/fluentd-config/fluentd.conf
volumeMounts:
- name: varlog
mountPath: /var/log
- name: config-volume
mountPath: /etc/fluentd-config
volumes:
- name: varlog
emptyDir: {}
- name: config-volume
configMap:
name: fluentd-config

部署它

kubectl create -f fluentd-demo.yaml

然后去你的kabana里查看日志,可以按着@log_name字段去查询,这就是我们日志里的tag,这个我们可以在代码里配置,可以设置成一个namespace,这样方便日志的跟踪!

最新文章

  1. fir.im Weekly - APP 性能监测优化 二三事
  2. Oracle 释放flash recovery area的四种方法
  3. GetLastError()函数返回值及含义
  4. WinForm------PopupMenu控件的使用
  5. java笔记--使用SwingWoker类完成耗时操作
  6. App开发到App Store上架,发布流程。
  7. Cimg代码初探
  8. mfc 可编辑 list control
  9. Redis单机版安装与部署
  10. WPF、WinForm(C#)多线程编程并更新界面(UI)(转载积累)
  11. 不完善的css怦然心动,有待改进...
  12. C++用new创建对象和不用new创建对象的区别解析
  13. Java杂记9—NIO
  14. Lucene的中文分词器
  15. 在python中使用print()时,raw write()返回无效的长度:OSError: raw write() returned invalid length 254 (should have been between 0 and 127)
  16. MVC架构在Asp.net中的应用和实现
  17. zabbix报错排错大全
  18. archlinux上安装sublime text
  19. Oracle中rank() over, dense_rank(), row_number() 的区别
  20. 基于jdom 的 xmluti

热门文章

  1. Node.js实操练习(一)之Node.js+MySQL+RESTful
  2. 深入NodeJS模块os - 与操作系统“打交道”
  3. 使用luabind绑定box2d的lua接口
  4. Python中关于__main__变量的问题
  5. Informatica9.5.1配置域名错误(ICMD_10033,INFASETUP_10002,RSVCSHARED_00021)
  6. python 动态导包
  7. 10个很多人不知道的Redis使用技巧
  8. 用javascript修改html元素的class
  9. Java使用反射实现根据字符串类名及参数创建对象
  10. GitHub注册与Git安装