背景信息:
某用户反馈,pod生产出来之后,/etc/resolv.conf配置不对,缺少search相关条目,导致生产环境内部服务调用时无法解析出现异常
异常pod如下图所示:
正常的pod如下图所示
缺少search的话,集群内部的域名无法添加集群内的后缀,因此一些内部服务的域名解析会出现问题
问题分析:
首先查看resolv.conf文件的属性,看看是否有人为修改的痕迹,观察change以及modify的属性,二者有时间误差
新起pod对比查看下,正常的pod二者的误差极低
文件从何而来?
pod里面的resolv.conf是kubelet生成的,对应在docker的resolvpath路径里面,如下所示
考虑文件监控,期间尝试了pod内部strace /etc/resolv.conf,pod内部安装bsstools,以及外部监控,然后容器id不同,路径无法提前获知,均不达预期
开启固定调度,节点安装bcctools,使用opensnoop来监控系统内所有文件的变化
/usr/share/bcc/tools/opensnoop -T >> openfile.log 2>&1
TIME(s) PID COMM FD ERR PATH
0.000000000 2994307 AliYunDun 17 0 /var/run/docker/runtime-runc/moby/53b50799e5844b3064fc8a8204c1d4a851114111febded3eb212cf61f00e6dd3/state.json
0.000922000 336715 more 3 0 /usr/lib64/gconv/gconv-modules.cache
0.131681000 2994307 AliYunDun 17 0 /var/log/secure
用户现场的opensnoop监控到的resolv.conf变动,最后一次是kubelet的操作
确认kubelet修改后,查看kubelet启动参数,发现有自定义配置,自定义的configyaml覆盖了我们的默认配置导致,去除即可: