容器问题虽然有很多类型,既有基本功能问题,也有性能问题,还有不少稳定性问题。但大部分问题,最终都会归结到 Linux 操作系统上。Linux 操作系统不外乎是进程管理、内存管理、文件系统、网络协议栈,再加上一些安全管理。容器的问题就都可以投射到 Linux 操作系统这些模块上了。当然了,容器还有自己的特殊性,Linux 内核原来的特性加上 Namespace 和 Cgroups 会带来的变化。
解决容器问题时我们需要的一个态度:不要浅尝辄止,要刨根问底。
解决容器问题的两个步骤:
-
化繁为简,重现问题。
想要做到这一点,倒推回去,还是需要我们对基本的概念足够了解。只有对每个模块的概念都很清晰,我们才能对复杂问题做拆分。能够对问题做拆分是不是就够了呢?其实还不够,我自己有一个判断标准,就是还要能够写模拟程序,看是否可以用最简单的程序来重现问题。如果我们能用简单的代码程序重现问题,那么问题也就解决了一半。
-
把黑盒系统变成白盒系统。
我在前面提到过,容器的问题大多都会归结到 Linux 系统上。Linux 系统从内核、库函数以及服务程序上看,虽然都是开源的,但是它运行在生产环境的时候,几乎就是一个黑盒。之所以说系统是黑盒,一方面是因为这个系统太庞大,太复杂了;另一方面,在实际运行的时候,只有很少的 log 会记录运行的过程和参数。所以,在出问题的时候,我们无法知道问题对应的代码,我们也不可能在生产环境中随心所欲地加 debug log。
因此,我们就需要想点办法把它变成白盒,才能去排查和解决问题。具体怎么做呢?这里需要我们熟练地掌握调试工具,这样才能把某些函数变成“白盒”,从而找到复杂问题的根本原因,再对症下药。我们熟练掌握工具有个重要前提,就是从全局上去掌握 Linux 系统以及容器,回归到底层原理去看问题。可以说,你把基础概念吃透了,练好了“内功心法”,有了这个底子,工具运用是水到渠成的事儿。
巨人的肩膀
- 极客时间.《容器实战》