【问题标题】:Delete all the contents from a kubernetes node从 Kubernetes 节点中删除所有内容
【发布时间】:2018-06-13 03:50:56
【问题描述】:

如何从 kubernetes 节点中删除所有内容?
内容包括部署、副本集等。我尝试单独删除部署。但是 kubernetes 会再次重新创建所有 pod。
有没有办法删除节点中存在的所有副本集?

【问题讨论】:

    标签: kubernetes containers replication


    【解决方案1】:

    如果你正在测试东西,最简单的方法是

    kubectl delete deployment --all
    

    如果您使用的是 minikube,最简单的方法可能是删除机器并使用新节点重新开始

    minikube delete
    minikube start
    

    如果我们谈论的是生产集群,Kubernetes has a built-in feature to drain a node of the cluster,会安全地从该节点移除所有对象。

    在对节点执行维护之前,您可以使用 kubectl drain 安全地从节点中驱逐所有 pod。安全驱逐允许 pod 的容器优雅地终止,并将遵守您指定的 PodDisruptionBudgets。

    注意:默认kubectl drain会忽略节点上某些无法被杀死的系统pod;有关详细信息,请参阅 kubectl drain 文档。

    kubectl drain 成功返回时,这表明所有 pod(除了上一段中描述的排除的那些)都已被安全驱逐(遵守所需的优雅终止期,并且没有违反任何应用程序级中断 SLO )。然后,通过关闭其物理机或如果在云平台上运行,删除其虚拟机来关闭节点是安全的。

    首先,确定要排空的节点的名称。您可以使用

    列出集群中的所有节点
    kubectl get nodes
    

    接下来,告诉 Kubernetes 清空节点:

    kubectl drain <node name>
    

    一旦它返回(没有给出错误),您可以关闭节点(或者等效地,如果在云平台上,删除支持该节点的虚拟机)。 drain 等待优雅终止。在命令完成之前,您不应在机器上进行操作。

    如果在维护操作期间将节点留在集群中,则需要运行

    kubectl uncordon <node name>
    

    然后告诉 Kubernetes 它可以继续将新的 Pod 调度到节点上。

    请注意,如果有任何 Pod 不受 ReplicationController、ReplicaSet、DaemonSet、StatefulSet 或 Job 管理,那么drain 不会删除任何 Pod,除非您使用 --force、as mentioned in the docs

    kubectl drain <node name> --force
    

    【讨论】:

    • 嗨,实际上,当我应用 kubectl uncordon 命令时,Kuberntes 重新启动了所有旧 pod。这意味着 pod 没有被删除。他们只是停止执行。我希望从节点中永久删除所有内容。有什么帮助吗?
    • 我猜你有一个单节点集群? kubernetes 调度程序将在作为集群一部分的可用节点上调度(即“启动”)pod,直到达到部署所需的副本数量。如果节点可用于安排新对象,则您无法从节点中删除所有内容,这就是我们使用警戒线/排水管的原因。因此,如果您只有一个节点,调度程序将重新创建对象,直到达到所需的副本数量。为什么要从节点中删除所有内容?
    • 是的,它是一个节点集群。我使用了 Minikube。我为学习目的创建了许多部署。最近维护这些部署对我来说真的很难。所以我决定清理一切。
    • 您能告诉我您是如何创建这些部署的吗?通常,kubectl delete deployment --all 应该做你想做的事。
    • 我使用 yaml 文件来创建部署。然后运行 ​​kubectl create 命令。
    【解决方案2】:
    minikube delete --all 
    

    如果您使用的是 minikube

    它将让您启动一个新的干净集群。


    如果你在 Kubernetes 上运行:

    kubectl delete pods,deployments -A --all
    

    它将从所有命名空间中删除它,您可以在同一命令中添加更多对象。

    【讨论】:

      【解决方案3】:

      Kubenertes 提供命名空间对象用于隔离和关注点分离。因此,建议在自定义命名空间中应用所有 k8s 资源对象(Deployment、ReplicaSet、Pods、Services 等)。

      现在如果你想删除所有相关和相关的 k8s 资源,你只需要删除将删除所有这些资源的命名空间。

      kubectl create namespace custom-namespace
      kubectl create -f deployment.yaml --namespace=custom-namespace
      kubectl delete namespaces custom-namespace
      

      我附上了一个链接供进一步研究。

      Namespaces

      【讨论】:

      • 我照你说的做了。但是 pod 正在重新创建。
      • 嗨 Mufeed,据我了解,如果我创建一个命名空间“my-ns”,然后在 my-ns 命名空间中应用部署和服务。如果我删除 my-ns 命名空间,最终所有资源都会被删除。它总是有效的。如果您可以在命名空间 kubectl get all -n my-ns 中显示资源。我们可以解决它
      【解决方案4】:

      我尝试了很多变体来从教程中删除旧的 pod,包括 here 的所有内容。

      最终对我有用的是:

      kubectl delete replicaset --all

      一次删除一个似乎不起作用;只有使用 --all 标志,所有 pod 都被删除而不重新创建。

      【讨论】:

        猜你喜欢
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        • 2022-08-19
        • 1970-01-01
        • 2018-10-31
        • 2011-11-22
        • 1970-01-01
        • 2021-05-29
        相关资源
        最近更新 更多