之所以会有这个主题,是因为这几天我给mysql集群前置了一个keepalived,为了方便也做成了docker镜像,丢给k8s来部署。但实际测试时发现,当停止或者删除keepalived容器后,网卡上还残余之前keepalived下发的virtual ip。
直接在宿主机上安装keepalived不会有这个问题。从keepalived源码上来看,它会接管linux发给它的SIGTERM信号,之后清理现场,包括下发给接口的虚IP,所以问题原因就比较简单了,容器在退出时,并没用将SIGTERM信号传递给keepalived进程,造成keepalived强制退出,最终virtual ip残留。
要解决这个问题,还需要从容器退出开始谈起。先挖个坑,晚上填。
docker容器退出会收到哪些信号?
不同的命令,收到的信号不同。
docker stop
默认docker stop会向容器发送SIGTERM信号,并等待10秒;如果10秒后容器没有退出,则会发送SIGKILL信号,强制杀死该容器。我的keepalived容器就是收到信号10s后仍然存活,最后被SIGKILL杀死的,docker ps -a查看容器的STATUS,可以看到Exited (137) 2 hours ago。137=128+9,即退出原因是收到了信号9(即SIGK