传统项目里面记录日志大多数都是将日志记录到日志文件,升级到分布式架构之后,日志开始由文件转移到elasticsearch(es)中来存储,达到集中管理。在kubernetes平台里面把日志记录到es有两种简单的方案:git
首先在docker容器里面作挂载,指定一个固定的虚拟机目录,而后应用程序把日志写入到这个目录,虚拟机上开启logstash服务来收集日志文件,而后把日志传输到es,在经过kibana作展现,这种方案也是最传统的ELK的作法。
优势:应用程序耦合相对较低,使用传统的日志组件好比log4net就能把日志输出到文件,对于系统的改形成原本说较低。也没有语言依赖。
缺点:须要在宿主机上面作不少额外的配置,每增长一台宿主机,这个工做就要重复作一次,须要运维人员参与。github
直接在代码层面把日志写入es。
优势:日志在应用层面处理了,不须要虚拟机上作额外的工做。 缺点:日志和应用程序耦合的很是高,每一个应用程序都须要单独的配置,配置有变化均可能致使日志收集失败。若是一个项目由多种语言开发须要开发各类语言的SDK来支持日志的写入。docker
回到咱们的标题的问题。有没有一种方案可以不依赖日志组件,就单纯的把日志输出到控制台就能记录日志呢?在应用层面不依赖各类组件,在宿主机上面也不用大量额外的配置就能统一的收集日志呢?答案是有的。api
介绍咱们今天的主角:log-pilot架构
log-pilot是阿里云开发的一款开源的容器日志采集工具,能够直接获取容器的标准输入和内部文件日志,在每台机器上都安装一个log-pilot实例,这样就能收集整个kubernetes集群的docker容器的日志。该项目地址是 https://github.com/AliyunContainerService/log-pilotapp
下面咱们一步一步将log-pilot部署出来。运维
阿里云提供了一些安装脚本,感兴趣的同窗能够看脚本源码
下面的演示基于阿里云的kubernetes集群elasticsearch
kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/elasticsearch.yml
kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/log-pilot.yml
由于要在集群全部的机器上面都安装log-polot,因此要指定
kind: DaemonSet
分布式
kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/kibana.yml
a) 要让kibana可以外网展现因此还须要配置一个ingress工具
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: kibana-ingress namespace: kube-system spec: rules: - http: paths: - path: / backend: serviceName: kibana servicePort: 80
b) 建立成功之后获取访问地址
kubectl get ingress -n=kube-system
任意语言应用程序都行,日志输出到控制台便可,笔者用的的一个dotnet core应用程序
apiVersion: v1 kind: Pod metadata: name: testapi namespace: default labels: name: testapi spec: containers: env: - name: aliyun_logs_catalina value: "stdout"
上面配置不是一个真实的编排文件,核心代码只有这两句
- name: aliyun_logs_catalina value: "stdout"
aliyun_logs_catalina=stdout表示要收集容器的 stdout 日志。也能够收集保存到文件的日志,请自行参考官方文档
a) 先查看容器内记录的日志,为正式环境的一部分截图
b) kibana查询日志
经过这种方案,能让咱们快速的把整个kubernetes集群内的应用程序日志接入到es,迁移和维护成本很是低,极大提高运维效率。
笔者目前在武汉工做,不知道是否有.net相关的线下组织,主要想推进一下.net在武汉地区的发展,有这方面经验的朋友能够给我发下私信,很是感谢。