当你耗尽 Kubernetes 集群中的节点时会发生什么?

Bir*_*man 4 kubernetes kubectl

当您排空 Kubernetes 集群中的节点时,我想获得一些有关维护准备的说明:

这是我在您运行时所知道的kubectl drain MY_NODE

  • 节点被封锁
  • Pod 正常关闭
  • 您可以选择忽略 Daemonset pod,因为如果它们被关闭,它们将立即再次重新生成。

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

问题:

  • 豆荚会发生什么?据我所知,Kubernetes 中没有 Pod 的“实时迁移”。
  • Pod 会被关闭然后在另一个节点上自动启动吗?还是这取决于我的配置?(即 Pod 可以通过 Drain 关闭而不是在另一个节点上启动)

我希望对此进行一些澄清以及任何最佳实践或建议。提前致谢。

mar*_*rio 6

我只想在eamon1234的答案中添加一些内容:

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

  1. 官方文档的链接(如果默认标志发生更改等)。根据它:

    “drain”会逐出或删除除镜像 pod(无法通过 API 服务器删除)之外的所有 pod。如果存在 DaemonSet 管理的 pod,如果没有 --ignore-daemonsets,drain 将不会继续,并且无论如何它都不会删除任何 DaemonSet 管理的 pod,因为这些 pod 会立即被 DaemonSet 控制器替换,从而忽略不可调度的标记。如果有任何 Pod 既不是镜像 Pod,也不是由 ReplicationController、ReplicaSet、DaemonSet、StatefulSet 或 Job 管理的,则 Drain 不会删除任何 Pod,除非您使用 --force。如果一个或多个 pod 的管理资源丢失,--force 还将允许继续删除。

  2. 简单的图表说明了使用时实际发生的情况kubectl drain

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

    kubectl drain foo --force --dry-run

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


eam*_*234 5

默认情况下kubectl drain是非破坏性的,您必须覆盖才能更改该行为。它使用以下默认值运行:

  --delete-local-data=false
  --force=false
  --grace-period=-1
  --ignore-daemonsets=false
  --timeout=0s
Run Code Online (Sandbox Code Playgroud)

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

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