容器化时代容器内线程调试方法容器化时代的服务都是运行在docker内部,权限较低。当服务出现异常时,很难在docker中执行gdb、perf等调试工具进行运行时分析。这时候我们需要以root权限登录pod所在node节点的宿主机进行调试。安装nsenteryuminstallutil-linux什么是nsenter最典型的用途之一就是进入容器的网络命令空间。相当一部分容器不包含轻量级的基本命令,比如ipaddress,ping,telnet,ss,tcpdump``等命令,给调试容器网络带来不小的麻烦:只能通过dockerinspect获取容器IPContainerID命令,无法测试与其他网络的连通性。这时可以使用nsenter命令只进入容器的网络命名空间,使用宿主机的命令调试容器网络。此外,nsenter还可以进入mnt、uts、ipc、pid、用户命令空间,并指定根目录和工作目录。Principlenamespace是Linux中一些进程的属性范围。使用命名空间,可以隔离不同的进程。linux在不断的增加命名空间,目前有:mount:挂载命名空间,让进程拥有独立的挂载文件系统,从linux2.4.19开始ipc:ipc命名空间,让进程拥有独立的ipc,包括messagesQueue,共享内存和信号量,从Linux2.6.19开始uts:uts命名空间,让进程有独立的hostname和domainname,从Linux2.6.19net开始:networkcommandspace,让进程有独立的网络栈,alwaysInLinux2.6.24pid:pid命名空间,进程有独立的pid空间,Linux开始2.6.24user:用户命名空间,进程有独立的用户空间,Linux2.6.23开始,Linux3.8结束cgroup:cgroup命名空间,so该进程有一个独立的cgroup控制组。从Linux4.6Linux开始的每个进程都有一个命名空间,在/proc/PID/ns目录下可以看到命名空间的文件描述符。使用nsenter[options][program[arguments]]options:-t,--targetpid:指定进入namespace的目标进程的pid-m,--mount[=file]:进入mount命令空间.如果指定file,则进入文件的命令空间-u,--uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间-i,--ipc[=file]:进入ipc命令空间。如果指定file,则进入file的命令空间-n,--net[=file]:进入net的命令空间。如果指定了file,则进入file的命令空间-p,--pid[=file]:进入pid命令空间。如果指定file,则进入文件的命令空间-U,--user[=file]:进入用户命令空间。如果指定file,则进入文件的命令空间-G,--setgidgid:设置运行程序的gid-S,--setuiduid:设置运行程序的uid-r,--root[=directory]:设置根目录-w,--wd[=directory]:设置工作目录。如果没有给出程序,$SHELL将默认执行。查找容器的PID#dockerps|grephotfix7b5f22758bf7registry.cn-ha./xxxx/#dockerinspect-f'{{.State.Pid}}{{.Id}}'$(dockerps-q)|grep7b5f22758bf7147347b5f22758bf7ecf002e8aa3a418aef0593a4048f07c4297fde08cd7004facaba进入命名空间,使用调试工具sudonsenter-t14734-m-pgdb-p1
