kubeadm reset elimina el contenedor que el usuario ejecuta a través de docker run

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

Inserte la descripción de la imagen aquí

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.

Supongo que te gusta

Origin blog.csdn.net/nangonghen/article/details/109673435
Recomendado
Clasificación