1. Información general:
1.1 Medio Ambiente
La información de la versión es la siguiente:
a. Clúster de kubernetes: v1.18.5
1.2 Fenómeno
Después de ejecutar el comando kubeadm reset -f, también se eliminó el contenedor llamado xxx_k8s_registry ejecutado por mi comando docker run. Siempre pensé que el comando de reinicio de kubeadm era eliminar el contenedor con el prefijo "k8s_", por lo que el contenedor que comencé manualmente agregó el prefijo xxx como una distinción.
1.3 Recurrencia
2 código fuente de kubeadm:
El método lógico principal del comando kubeadm reset es runCleanupNode (...)
func runCleanupNode(c workflow.RunData) error {
/*
其他代码
*/
//此处打印日志:删除kubernetes管理的容器。因此静态方法removeContainers(...)就是真正删除容器的方法
if err := removeContainers(utilsexec.New(), r.CRISocketPath()); err != nil {
klog.Warningf("[reset] Failed to remove containers: %v\n", err)
}
/*
其他代码
*/
return nil
}
//通过docker ps命令获取目标容器
//通过docker rm命令删除目标容器
func removeContainers(execer utilsexec.Interface, criSocketPath string) error {
containerRuntime, err := utilruntime.NewContainerRuntime(execer, criSocketPath)
if err != nil {
return err
}
//获取待删除的目标容器列表,其实是docker ps命令
containers, err := containerRuntime.ListKubeContainers()
if err != nil {
return err
}
//删除目标容器,其实是docker rm命令
return containerRuntime.RemoveContainers(containers)
}
//获取容器id:docker ps -a --filter name=k8s_ -q
func (runtime *DockerRuntime) ListKubeContainers() ([]string, error) {
output, err := runtime.exec.Command("docker", "ps", "-a", "--filter", "name=k8s_", "-q").CombinedOutput()
return strings.Fields(string(output)), err
}
3 comando ps de docker:
El parámetro -filter name = admite expresiones regulares.
#列出名称包含k8s_的容器
[root@node1 ~]# docker ps -a --filter name=k8s_
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a3abcfef49b5 registry:2.6.2 "/entrypoint.sh /etc…" 6 minutes ago Up 6 minutes 0.0.0.0:5005->5000/tcp liujun.com_k8s_registry
bc0eb1fc7fbc registry:2.6.2 "/entrypoint.sh /etc…" 11 minutes ago Up 11 minutes 0.0.0.0:5003->5000/tcp test_k8s_registry
3cbe78466b6d registry:2.6.2 "/entrypoint.sh /etc…" 12 minutes ago Up 12 minutes 0.0.0.0:5002->5000/tcp k8s_registry
#列出名称是以k8s_为前缀的容器
[root@node1 ~]# docker ps -a --filter name=^/k8s_
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3cbe78466b6d registry:2.6.2 "/entrypoint.sh /etc…" 2 hours ago Up 2 hours 0.0.0.0:5002->5000/tcp k8s_registry
4 Resumen:
Según el código fuente de kubeadm, se sabe que el comando kubeadm reset eliminará el contenedor cuyo nombre contiene "k8s_", no solo el contenedor cuyo nombre tiene el prefijo "k8s_". Comprensión: es necesario mirar el código fuente, no solo darlo por sentado.