kubeadm reset删除用户通过docker run运行的容器
1 概述:1.1 环境版本信息如下:a、kubernetes集群:v1.18.51.2 现象执行kubeadm reset -f命令后,由我docker run命令运行的名称为xxx_k8s_registry的容器也被删除。我一直以为kubeadm reset命令是删除以 “k8s_” 为前缀的容器,因此我手工启动的容器是特意增加了xxx前缀作为区分。1.3 复现2 kubeadm源码:kubea
·
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_” 为前缀的容器。领悟:看源码还是有必要的,不能只是想当然。
更多推荐
已为社区贡献4条内容
所有评论(0)