关于gdb:k8s-容器热替换重启主进程-gdb-execve-syscall-法
k8s 容器热替换/重启主过程 - gdb execve syscall 法 指标k8s 环境下,在不进行或重启 container 的状况下,重启利用过程(pid:1),甚至从新加载运行新版本的利用。本文以 gdb 作为工具,调用内核的 close / execve syscall,去实现这个指标。 背景K8s 显然曾经由衰亡转向成熟。大潮过后,是时候思考一下,当初吹过的牛有哪些是真的,哪些是还未对现的。不可否认,k8s 改革了运维的工作形式,这根本是提高的。但对于开发,特地是阻碍问题定位、程序调试办法,显然难度是减少了。 在利用的阻碍问题定位、程序调试时,咱们时常心愿能在雷同的环境下反复重启利用,去察看咱们对配置的批改,或者程序的更新是否真正解决了问题。要实现这个指标,通常须要: 批改利用代码,跑 CI pipeline 从新打包 docker image,上传。—— 费时费力 想方法重启容器。—— 环境毁坏了,问题可能重现不了 如果容器启动脚本设计时就反对重启,当然没问题,但大部分状况下,均是不间接反对的,很多时候,利用主过程就间接是 container 的主过程 pid:1 了。 我钻研过三个办法去替换主过程: gdb 调用 libc 的 execl 。gdb 调用 syscall execve 。 这个办法比较复杂,但也更通用,这是本文要说的办法。kill -STOP 挂起主过程的父过程gdb 主过程的父过程,让它收不到 SIGCHLD知识点Linux 的一些内存布局Linux 的过程启动参数和环境变量布局Linux /proc/$pid/stat 的小机密syscall 常识x86 一点寄存器常识gdb 大法之魔幻系列简介《k8s 容器热替换/重启主过程》 是一个系列的文章,指标都是雷同的,但在不同的状况下应用不同的伎俩: k8s 容器热替换/重启主过程 - gdb exec 法 长处:应用比拟不便毛病:依赖可执行文件应用了 glibc.so 。 golang 编写生成的可执行文件,通常不应用 glibc.sok8s 容器热替换/重启主过程 - gdb execve syscall 法(本文) ...