1 概述:

1.1 环境

版本信息如下:
a、kubernetes集群:v1.18.5

1.2 现象

执行kubeadm reset -f命令后,由我docker run命令运行的名称为xxx_k8s_registry的容器也被删除。我一直以为kubeadm reset命令是删除以 “k8s_” 为前缀的容器,因此我手工启动的容器是特意增加了xxx前缀作为区分。

1.3 复现

在这里插入图片描述

2 kubeadm源码:

kubeadm reset命令的主逻辑方法是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 docker ps命令:

参数–filter name=是支持正则表达式。

#列出名称包含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 总结:

根据kubeadm的源码,得知kubeadm reset命令会删除名称包含 “k8s_” 的容器,而不只是删除名称是以 “k8s_” 为前缀的容器。领悟:看源码还是有必要的,不能只是想当然。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐