极客视点
极客时间编辑部
极客时间编辑部
113243 人已学习
免费领取
课程目录
已完结/共 3766 讲
2020年09月 (90讲)
时长 05:33
2020年08月 (93讲)
2020年07月 (93讲)
时长 05:51
2020年06月 (90讲)
2020年05月 (93讲)
2020年04月 (90讲)
2020年03月 (92讲)
时长 04:14
2020年02月 (87讲)
2020年01月 (91讲)
时长 00:00
2019年12月 (93讲)
2019年11月 (89讲)
2019年10月 (92讲)
2019年09月 (90讲)
时长 00:00
2019年08月 (91讲)
2019年07月 (92讲)
时长 03:45
2019年06月 (90讲)
2019年05月 (99讲)
2019年04月 (114讲)
2019年03月 (122讲)
2019年02月 (102讲)
2019年01月 (104讲)
2018年12月 (98讲)
2018年11月 (105讲)
时长 01:23
2018年10月 (123讲)
时长 02:06
2018年09月 (119讲)
2018年08月 (123讲)
2018年07月 (124讲)
2018年06月 (119讲)
时长 02:11
2018年05月 (124讲)
时长 03:16
2018年04月 (120讲)
2018年03月 (124讲)
2018年02月 (112讲)
2018年01月 (124讲)
时长 02:30
时长 02:34
2017年12月 (124讲)
时长 03:09
2017年11月 (120讲)
2017年10月 (86讲)
时长 03:18
时长 03:31
时长 04:25
极客视点
15
15
1.0x
00:00/05:42
登录|注册

9个技巧,解决K8s中的日志输出问题(下)

讲述:丁婵大小:7.83M时长:05:42
来源:阿里巴巴云原生
在 Kubernetes 中,日志最基础的作用是记录程序的运行轨迹,在此之上会衍生出线上监控、告警、运营分析、安全分析等功能。同时,这些功能也对日志有一定的要求。所以,开发者需要尽可能地将日志规范化,以减少收集、解析、分析的代价。
日前,阿里云存储服务技术专家元乙列举了日志输出的 9 个常见注意事项。在上一篇文章中,我们分享了如何选择日志等级、日志内容规范、合理控制日志输出量的方法,本文继续分享以下内容:
选择多种日志输出目标
控制日志性能消耗
日志库选择
日志形态选择
日志是否落盘以及落盘介质
如何保证日志存储周期

1. 选择多种日志输出目标

建议一个应用不同类型的日志输出到不同的目标(文件),这样便于分类采集、查看和监控。例如:
访问日志单独放到一个文件,如果域名不多,可以按照一个域名一个文件的形式;
错误类的日志单独放一个文件,单独配置监控告警;
调用外部系统的日志单独放一个文件,便于后续对账、审计;
中间件通常都由统一的平台提供,日志一般单独打印一个文件。

2. 控制日志性能消耗

日志作为业务系统的辅助模块,一定不能影响到业务的正常工作,因此日志模块的性能消耗需要单独额外注意。在选择 / 开发日志库时,需要对日志库进行性能测试,确保正常情况下日志的性能消耗不超过整体 CPU 占用的 5%。另外,一定要确保日志打印是异步的,不能阻塞业务系统运行。

3. 如何选择日志库

开源的日志库非常多,基本每个语言都有数十种,选择一个符合公司 / 业务需求的日志库需要精挑细选,有一个简单的指导原则是尽可能使用比较流行的日志库的稳定版本,入坑的几率要小一点。例如:
Java 使用 Log4J、LogBack;
Golang 使用 go-kit;
Python 默认集成的日志库大部分场景都够用,建议阅读一下 CookBook;
C++ 推荐使用 spdlog,高性能、跨平台。

4. 日志形态选择

在虚拟机 / 物理机的场景中,绝大部分应用都以文件的形式输出日志(只有一些系统应用输出到 syslog/journal)。而在容器场景中,多了一个标准输出的方式,应用把日志打到 stdout 或 stderr 上,日志会自动进入 docker 的日志模块,可以通过 docker logs 或 kubectl logs 直接查看。
容器的标准输出只适应于比较单一的应用,例如 Kubernetes 中的一些系统组件,线上的服务类应用通常会涉及多个层级(中间件)和各种服务交互,日志都会分为好几类,如果全部打印到容器的标准输出,很难区分处理。
同时容器标准输出对于 DockerEngine 的性能消耗特别大,元乙实测 10W/s 的日志量会额外占用 DockerEngine 1 个核心的 CPU(单核 100%)。

5. 日志是否落盘以及落盘介质

在 Kubernetes 中,还可以将日志库直接对接日志系统,日志打印时不落盘而直接传输到日志系统后端。这种使用方式免去了日志落盘、Agent 采集的过程,整体性能会高很多。
在日志量极大的场景可以使用这种方式,普通情况下直接落盘。相比直接发送到后端的方式,落盘增加了一层文件缓存,在网络失败的情况下还能缓存一定的数据。在日志系统不可用的情况下,研发和运维同学可以直接查看文件日志,提高整体的可靠性。
Kubernetes 提供了多种存储方式,一般在云上,都会提供本地存储、远程文件存储、对象存储等方式。由于日志写入的 QPS 很高,和应用也直接相关,如果使用远程类型的存储,会额外多 2-3 次网络通信开销。建议使用本地存储的方式,可以使用 HostVolume 或者 EmptyDir ,尽可能小的影响写入和采集的性能。

6. 如何保证日志存储周期

相比传统虚拟机 / 物理机的场景,Kubernetes 对于节点、应用层提供了强大的调度、容错、缩 / 扩容能力。通过 Kubernetes ,很容易就能让应用获得高可靠运行、极致弹性。这些优势带来的一个现象是:节点动态创建 / 删除、容器动态创建 / 删除,这样日志也会随时销毁,没办法保证日志的存储周期满足 DevOps、审计等相关的需求。
在动态环境下实现日志的长期存储只能通过中心化的日志存储来实现,通过实时的日志采集方式,将各个节点、各个容器的日志在秒级内采集到日志中心系统上,即使节点 / 容器挂掉也能够通过日志还原当时的现场。
以上就是元乙解决 Kubernetes 日志输出问题的技巧,希望对你有所帮助。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结
该免费文章来自《极客视点》,如需阅读全部文章,
请先领取课程
免费领取
登录 后留言

全部留言(1)

  • 最新
  • 精选
  • 小斧
    1. 选择多种日志输出目标 2. 控制日志性能消耗 3. 如何选择日志库 4. 日志形态选择 5. 日志是否落盘以及落盘介质 6. 如何保证日志存储周期
收起评论
大纲
固定大纲
1. 选择多种日志输出目标
2. 控制日志性能消耗
3. 如何选择日志库
4. 日志形态选择
5. 日志是否落盘以及落盘介质
6. 如何保证日志存储周期
显示
设置
留言
1
收藏
59
沉浸
阅读
分享
手机端
快捷键
回顶部