you are better than you think

备忘

last update:

阅读前准备

git: https://github.com/moby/moby.git
branch: v18.06.3-ce
ide: goland2020.2 

配置goland的build tag build tag

一起见证docker 代码中套路 exec.Command=> cmd.Start() => cmd.Wait()

进程模型

docker   
  |      
  V       
dockerd -> containerd ---> shim -> runc -> runc init -> process1
                      |--> shim -> runc -> runc init -> process2
                      +--> shim -> runc -> runc init -> process3

背景

线上很多场景可能会用到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。

简单描述就是网卡驱动升级后,容器关联的网络接口消失,容器被重建。