背景

传统项目里面记录日志大多数都是将日志记录到日志文件,升级到分布式架构以后,日志开始由文件转移到elasticsearch(es)中来存储,达到集中管理。在kubernetes平台里面把日志记录到es有两种简单的方案:

  • 容器外记录。

    首先在docker容器里面做挂载,指定一个固定的虚拟机目录,然后应用程序把日志写入到这个目录,虚拟机上开启logstash服务来收集日志文件,然后把日志传输到es,在通过kibana做展示,这种方案也是最传统的ELK的做法。

    优点:应用程序耦合相对较低,使用传统的日志组件比如log4net就能把日志输出到文件,对于系统的改造成本来说较低。也没有语言依赖。

    缺点:需要在宿主机上面做很多额外的配置,每增加一台宿主机,这个工作就要重复做一次,需要运维人员参与。

  • 容器内记录。

    直接在代码层面把日志写入es。

    优点:日志在应用层面处理了,不需要虚拟机上做额外的工作。

    缺点:日志和应用程序耦合的非常高,每个应用程序都需要单独的配置,配置有变化都可能导致日志收集失败。如果一个项目由多种语言开发需要开发各种语言的SDK来支持日志的写入。

回到我们的标题的问题。有没有一种方案能够不依赖日志组件,就单纯的把日志输出到控制台就能记录日志呢?在应用层面不依赖各种组件,在宿主机上面也不用大量额外的配置就能统一的收集日志呢?答案是有的。

log-pilot

介绍我们今天的主角:log-pilot

log-pilot是阿里云开发的一款开源的容器日志采集工具,可以直接获取容器的标准输入和内部文件日志,在每台机器上都安装一个log-pilot实例,这样就能收集整个kubernetes集群的docker容器的日志。该项目地址是 https://github.com/AliyunContainerService/log-pilot

下面我们一步一步将log-pilot部署出来。

阿里云提供了一些安装脚本,感兴趣的同学可以看脚本源码

下面的演示基于阿里云的kubernetes集群

演示
安装es
kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/elasticsearch.yml
部署log-polot
kubectl apply -f https://acs-logging.oss-cn-hangzhou.aliyuncs.com/log-pilot.yml

因为要在集群所有的机器上面都安装log-polot,所以要指定kind: DaemonSet

为了方便展示我们再部署一个kibana
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
准备一个应用程序通过logger打印日志,并部署到kubernetes

任意语言应用程序都行,日志输出到控制台即可,笔者用的的一个dotnet core应用程序

修改这个应用程序的kubernetes编排文件
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 日志。也可以收集保存到文件的日志,请自行参考官方文档

访问kibana,查询日志

a) 先查看容器内记录的日志,为正式环境的一部分截图

b) kibana查询日志

结语

通过这种方案,能让我们快速的把整个kubernetes集群内的应用程序日志接入到es,迁移和维护成本非常低,极大提升运维效率。

后记

笔者目前在武汉工作,不知道是否有.net相关的线下组织,主要想推动一下.net在武汉地区的发展,有这方面经验的朋友可以给我发下私信,非常感谢。

如何更优雅的在kubernetes平台下记录日志的更多相关文章

  1. 基于Kubernetes/K8S构建Jenkins持续集成平台(下)

    基于Kubernetes/K8S构建Jenkins持续集成平台(下) Jenkins-Master-Slave架构图回顾: 安装和配置NFS NFS简介 NFS(Network File System ...

  2. Karmada v1.3:更优雅 更精准 更高效

    摘要:最新发布的1.3版本中,Karmada重新设计了应用跨集群故障迁移功能,实现了基于污点的故障驱逐机制,并提供平滑的故障迁移过程,可以有效保障服务迁移过程的连续性(不断服). 本文分享自华为云社区 ...

  3. .NET平台下开源框架

    一.AOP框架Encase 是C#编写开发的为.NET平台提供的AOP框架.Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式.这种部署方面(asp ...

  4. PostCSS一种更优雅、更简单的书写CSS方式

    Sass团队创建了Compass大大提升CSSer的工作效率,你无需考虑各种浏览器前缀兼,只需要按官方文档的书写方式去写,会得到加上浏览器前缀的代码,如下: .row { @include displ ...

  5. Windows平台下利用APM来做负载均衡方案 - 负载均衡(下)

    概述 我们在上一篇Windows平台分布式架构实践 - 负载均衡中讨论了Windows平台下通过NLB(Network Load Balancer) 来实现网站的负载均衡,并且通过压力测试演示了它的效 ...

  6. 使用 Promises 编写更优雅的 JavaScript 代码

    你可能已经无意中听说过 Promises,很多人都在讨论它,使用它,但你不知道为什么它们如此特别.难道你不能使用回调么?有什么了特别的?在本文中,我们一起来看看 Promises 是什么以及如何使用它 ...

  7. .net平台下垃圾回收机制

    引言:使用c++进行编程,内存的处理绝对是让每个程序设计者最头疼的一块了.但是对于.net平台下使用c#语言开发系统,内存管理可以说已经不算是问题了.在.net平台下CLR负责管理内存,CLR中的垃圾 ...

  8. Thrift在Windows及Linux平台下的安装和使用示例

    本文章也同时发表在个人博客Thrift在Windows及Linux平台下的安装和使用示例上. thrift介绍 Apache Thrift 是 Facebook 实现的一种高效的.支持多种编程语言的R ...

  9. Windows平台下的读写锁

    Windows平台下的读写锁简单介绍Windows平台下的读写锁以及实现.背景介绍Windows在Vista 和 Server2008以后才开始提供读写锁API,即SRW系列函数(Initialize ...

随机推荐

  1. FortiGate日志设置

    1.默认 FGT5HD3916802737 # config log syslogd setting FGT5HD3916802737 (setting) # show config log sysl ...

  2. 694. Number of Distinct Islands 形状不同的岛屿数量

    [抄题]: Given a non-empty 2D array grid of 0's and 1's, an island is a group of 1's (representing land ...

  3. 567. Permutation in String判断某字符串中是否存在另一个字符串的Permutation

    [抄题]: Given two strings s1 and s2, write a function to return true if s2 contains the permutation of ...

  4. 整理的最全 python常见面试题(基本必考)

    整理的最全 python常见面试题(基本必考) python 2018-05-17 作者 大蛇王 1.大数据的文件读取 ① 利用生成器generator ②迭代器进行迭代遍历:for line in ...

  5. Centos7 进入单用户模式,修复系统

    一.开机时进入如下界面,(按下方向键盘,阻止系统自动继续) 按e键出现下面界面 按方向键下,定位到最后,找到“ro”一行,ro的意思是read only,将“ro”替换成 rw init=/sysro ...

  6. redis安全删key脚本(模糊匹配,长list,大set等)

    两种情况: 1.删除指定前缀开头的rediskey ,扫描和删除过程中对线上无感知 2.删除一个大的list,set,zset,hash,这种得分批次减少大小,一直缩到0再删 第一种情况:只要知道线上 ...

  7. 用windows性能监视器检测sqlserver 常见指标

    转载地址:https://www.cnblogs.com/xdong/p/4296072.html

  8. spring用注解配置,不用XML

    //首先装载一个配置类AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyCon ...

  9. 循环队列 & 栈的共用空间

    循环队列 非常好的数据结构,充分利用率空间,可以用于网络端存储socket消息! /*************************************** 作者: 未闻花语 版本: v1.0 ...

  10. 我知道的nginx配置

    1.nginx配置文件 2.配置访问域名 #京淘商品管理系统 server { listen 80; server_name manage.jt.com; location / { proxy_pas ...