分享web开发知识

注册/登录|最近发布|今日推荐

主页 IT知识网页技术软件开发前端开发代码编程运营维护技术分享教程案例
当前位置:首页 > IT知识

如何更优雅的在kubernetes平台下记录日志

发布时间:2023-09-06 02:27责任编辑:傅花花关键词:kubernetes
背景

传统项目里面记录日志大多数都是将日志记录到日志文件,升级到分布式架构以后,日志开始由文件转移到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/v1beta1kind: Ingressmetadata: ??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: v1kind: Podmetadata: ?name: testapi ?namespace: default ?labels: ???name: testapispec: ?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平台下记录日志

原文地址:https://www.cnblogs.com/longxianghui/p/10164792.html

知识推荐

我的编程学习网——分享web前端后端开发技术知识。 垃圾信息处理邮箱 tousu563@163.com 网站地图
icp备案号 闽ICP备2023006418号-8 不良信息举报平台 互联网安全管理备案 Copyright 2023 www.wodecom.cn All Rights Reserved