前言
容器云在拍拍贷实践已经有半年多时间了,已经有超过100多个应用部署在容器云上面。拍拍贷的容器技术采用的是docker-1.13,容器编排使用kubernetes-1.11。
虽说它们都是业内著名的开源系统,但是要应用到具体的公司,具体的场景难免还是会采坑。即使大多数的坑前人都已经踩过,也难免会遇到翻遍搜索引擎都找不到答案的问题。
拍拍贷容器云实践过程中就踩了一个深坑。由于此问题会影响容器正常的创建和删除,当时就影响了应用的发布。当时无法找到问题的原因,无奈只能重启docker解决。可是后面这个问题频发,严重影响了容器云的使用体验,为此我们开始了一次艰难的docker故障排查之旅
在正文开始之前我们总结了排查问题的心得感悟,就是一定要用好日志、dump和源码三大利器。
日志
通过日志排查问题是最有效也是最直接的方式。通过提取日志中的关键词,在搜索引擎里面进行查找,可以找到大部分问题的解决方法。
dump
通过日志和搜索引擎无法解决的问题,此类问题一般属于新问题或者疑难杂症。需要进一步分析系统内部状态进行定位。
dump就是输出堆栈或线程信息,可以查看系统内部的数据以及线程的运行状态。例如JAVA开发者就会经常dump堆栈内容排查内存资源的泄漏问题。
code
通过日志发现的错误关键词和dump出来的数据最终都需要结合源码做进一步的分析。源码是解释系统运行行为最好的方式,在源码里你可以发现系统出问题的根本原因
排查之旅开始
1、基于日志信息的问题排查
此次故障发生在4月16日的测试环境,问题的表现是容器无法删除和创建。查看日志(kubelet和dockerdaemon的日志写在/var/log/messages)发现频繁的报这个错误:
E0416 18:37:57.549265 31182 kubelet.go:1512] error k