终端闲思录(1)- k8s 日志引发的联想
终端是我们习焉不察,日用而不知的一种工具,如果去问一个 Linux 爱好者:“Linux 中最神秘的东西是什么?” 我相信回答“终端”的人一定不在少数。黑洞洞的窗口,像音符一样跳动的命令与输出,适时闪烁的光标,无一不弥漫着古老而又神秘的气息!
促使我 dig 终端的原因是我所在的公司要上线一个新项目,要求采用 k8s 作为运行平台,那么,日志处理方面就需要一个合理的方案。
我注意到 k8s 官方给出了几个可行方案:
其中,前两个方案都要求应用或者边车将日志写入标准输出和标准错误,相应的容器运行时负责将其转储为文件,最后由节点级的日志代理统一收集整理。后面两个方案其资源成本和开发成本都比较可观,并且将无法使用kubectl logs
访问日志。
很明显可以看出,k8s 是偏向于应用将日志写入标准输出和标准错误的,这让我想起一位架构师朋友曾经说:“我不想把日志打到控制台,因为控制台是同步的,这会影响性能。”
这段话即便不是错误的,至少也是不准确的。鉴于长久以来都对终端、控制台、标准输入与标准输出以及标准错误(Unix 世界竟然没有一个简单的概念来统称这三个文件描述符,为了方便称呼,后续我将在这三者同时出现的地方以标准三剑客来代替)等概念笼统对待,为破除这一刻板印象,并理顺 k8s 中处理日志的思路,搞清楚打印到标准输出与标准错误是否合理,我做了一些研究工作,清理了如下三个障碍:
终端与标准三剑客的关系
标准三剑客与缓冲
k8s 是如何重定向标准三剑客的 ?
这些问题真的那么重要吗?不妨假想一下:
k8s 建议你将日志打印到标准输出和标准错误,而你是一个略微有点计算机文化积淀的人,你知道在 C 标准库里标准三剑客的 I/O 缓冲各不相同,缓冲最大的也就是个行缓冲,你会狐疑着说:"我都不确定我所用语言的缓冲设计,我能放心地往标准输出和标准错误写吗?你把那些优秀的高吞吐日志框架至于何地?"
这时,一位大腹便便的中年人慢悠悠踱到你面前,语重心长地说道:“少侠,稍安勿躁,谁说往标准输出和标准错误写就一定写往终端 ?就一定是行缓冲 ?就一定要用‘printf’、‘fmt.Print’、‘system.out.println’ ?”
一连串的反问让你内心掠过一丝不快,但望着他稀疏的额头和有些混浊却不失坚毅的眼睛,你最终只是微微张了张嘴,没能说出一个字。
他肥胖的身躯坐了下来,用手捋着下巴上一撮小胡须,施施然道:“闻道有先后,不知道并不可怕,一知半解才可怕,我看你方才只是‘狐疑’着发问,并未理直气壮、斩钉截铁、目空一切,而且也不曾顶撞老夫,说明孺子可教,我就拣重点与你说说吧!”
说罢,便开始了涛涛雄辩。
言归正传,我将用一系列文章争取把这三个问题讲清楚,下一篇即进入终端的神秘世界!
评论