you are better than you think
主页
目录
标签
背景
线上很多场景可能会用到pstree,比如查看容器的所有子进程,回滚任务需要杀死正在运行中的子进程。
一个轻量级的库
我们选用的是一个轻量级的pstree。github.com/sbinet/pstree这个库比较简单,首先遍历/proc/ 获取所有PID
files, err := filepath.Glob("/proc/[0-9]*")
...
procs := make(map[int]Process, len(files))
for _, dir := range files {
proc, err := scan(dir)
if err != nil {
return nil, fmt.Errorf("could not scan %s: %w", dir, err)
}
if proc.Stat.Pid == 0 {
// process vanished since Glob.
continue
}
procs[proc.Stat.Pid] = proc
}
然后,scan()是读取/proc/[pid]/stat,获取pid和相应的ppid、name等信息
背景
线上网络采用macvlan方案。线上宿主创建的vlan id是3 ,对应的接口是eth0.3 或 bond4.3
现象描述
i40e网卡升级驱动,理论上不需要重启宿主,几秒后即可自动恢复。但是线上宿主升级驱动后,容器内的网络设备却丢失了,当前场景下kubelet 会自动重建容器,但是重建容器成本较高,尤其对于静态容器而言。理论上网络设备可以自行创建并添加到对应的namespace。
简单描述就是网卡驱动升级后,容器关联的网络接口消失,容器被重建。
现象描述
宿主机上创建容器时失败,kubelet log中可见报错信息mkdir /sys/fs/cgroup/memory/kubepods/burstable/pod79fe803c-072f-11e9-90ca-525400090c71/b98d4aea818bf9d1d1aa84079e1688cd9b4218e008c58a8ef6d6c3c106403e7b: no space left on devic
这个问题是kubernetes 1.9版本引入的,kubelet创建容器时EnableKernelMemoryAccounting导致的。kernel memory 在内核4.0以下的版本只是一个实验特性,存在使用后不能删除cgroup的问题,造成cgroup泄漏。
Kernel memory support is a work in progress, and the current version provides basically functionality. (See Section 2.7)
关于这个问题的复现和分析,网络上有很多文章, 解决方案简单总结就是宿主机重启+关闭kmem accounting的kubelet。
kakuli同学这篇文章cgroup泄露问题 对kubelet相关代码进行了详细的分析,并提供了1.12.4版本(我们的线上版本)的修复方案。 k8s社区在版本1.14,提供了开关可以关闭kmem accounting。