当您排空 Kubernetes 集群中的节点时会发生什么?

What happens when you drain nodes in a Kubernetes cluster?

我想得到一些说明,以便在 Kubernetes 集群中清空节点时为维护做准备:

这是我知道的 运行 kubectl drain MY_NODE:

我对节点耗尽时会发生什么感到困惑。

问题:

我将不胜感激对此以及任何最佳实践或建议的一些澄清。提前致谢。

默认情况下 kubectl drain 是 non-destructive,您必须重写才能更改该行为。它使用以下默认值运行:

  --delete-local-data=false
  --force=false
  --grace-period=-1
  --ignore-daemonsets=false
  --timeout=0s

这些保护措施中的每一个都处理不同类别的潜在破坏(本地数据、裸 pods、优雅终止、daemonsets)。它还尊重 pod 中断预算以遵守工作负载可用性。任何 non-bare pod 都将由其各自的控制器在新节点上重新创建(例如 daemonset controllerreplication controller)。

是否要覆盖该行为取决于您(例如,如果 运行 jenkins 作业,您可能有一个裸 pod。如果您通过设置 --force=true 覆盖,它将删除该 pod 并且它不会被重新创建)。如果不覆盖它,节点将无限期地处于耗尽模式 (--timeout=0s))。

我只想对 eamon1234 的回答添加一些内容:

您可能会发现这也很有用:

  1. Link 到官方文档(以防默认标志更改等)。根据它:

    The 'drain' evicts or deletes all pods except mirror pods (which cannot be deleted through the API server). If there are DaemonSet-managed pods, drain will not proceed without --ignore-daemonsets, and regardless it will not delete any DaemonSet-managed pods, because those pods would be immediately replaced by the DaemonSet controller, which ignores unschedulable markings. If there are any pods that are neither mirror pods nor managed by ReplicationController, ReplicaSet, DaemonSet, StatefulSet or Job, then drain will not delete any pods unless you use --force. --force will also allow deletion to proceed if the managing resource of one or more pods is missing.

  2. 简单 chart 说明使用 kubectl drain.

  3. 时实际发生的情况
  4. kubectl drain--dry-run 选项一起使用可能也是一个好主意,这样您就可以在应用任何实际更改之前看到其结果,例如:

    kubectl drain foo --force --dry-run

    但是它不会显示任何关于现有本地数据或守护进程的错误,您可以在不使用 --dry-run 标志的情况下看到这些错误: ... error: cannot delete DaemonSet-managed Pods (use --ignore-daemonsets to ignore) ...

在对节点执行维护之前,我们可以使用 kubectl drain 安全地从节点中逐出所有 pods。

如果你想对 Hardware/Node 进行更新或修补或任何类型的维护,你应该首先耗尽所有 pods(将 pods 一个节点迁移到另一个节点)kubectl drain

当 kubectl drain returns 成功时,表示所有 pods 已被安全驱逐。然后可以安全地关闭节点

在维护工作之后,我们可以使用 kubectl uncordon 告诉 Kubernetes 它可以恢复调度新 pods 到节点上。