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

当您耗尽Kubernetes集群中的节点时会发生什么?,kubernetes,kubectl,Kubernetes,Kubectl,我想澄清一下,当您耗尽Kubernetes集群中的节点时,如何为维护做好准备: 以下是运行kubectl drain MY_NODE时我知道的内容: 节点被封锁 吊舱被优雅地关闭 您可以选择忽略守护程序吊舱,因为如果它们被关闭,它们将立即重新生成 但是,我不知道当一个节点被耗尽时会发生什么 问题: 豆荚怎么了?据我所知,库伯内特斯没有豆荚的“活迁移” pod是否会关闭,然后在另一个节点上自动启动?或者这取决于我的配置?(即,pod是否可以通过排水管关闭,而不是在另一个节点上启动) 我希望

我想澄清一下,当您耗尽Kubernetes集群中的节点时,如何为维护做好准备:

以下是运行
kubectl drain MY_NODE
时我知道的内容:

  • 节点被封锁
  • 吊舱被优雅地关闭
  • 您可以选择忽略守护程序吊舱,因为如果它们被关闭,它们将立即重新生成
但是,我不知道当一个节点被耗尽时会发生什么

问题:

  • 豆荚怎么了?据我所知,库伯内特斯没有豆荚的“活迁移”
  • pod是否会关闭,然后在另一个节点上自动启动?或者这取决于我的配置?(即,pod是否可以通过排水管关闭,而不是在另一个节点上启动)

我希望能对此以及任何最佳实践或建议做出澄清。提前感谢。

默认情况下,kubectl排水管是非破坏性的,您必须重写以更改该行为。它使用以下默认值运行:

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


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

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

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

  • 到正式文档摘要(以防默认标志更改等)。据它说:

    “排水”会逐出或删除除镜像吊舱(其中 无法通过API服务器删除)。如果有 守护程序管理的POD,如果没有 --忽略守护程序集,不管怎样,它都不会删除任何由守护程序集管理的POD,因为这些POD将立即被删除 替换为守护程序控制器,该控制器忽略不可计划的 标记。如果有任何吊舱既不是镜像吊舱也不是 由ReplicationController、ReplicatSet、守护程序集、StatefulSet管理 或者作业,则drain不会删除任何pod,除非您使用--force。 --如果一个或多个POD的管理资源丢失,force还将允许继续删除

  • 简单说明使用
    kubectl排水管时实际发生的情况

  • 使用
    kubectl排水管
    --干运行
    选项也可能是一个好主意,这样您可以在应用任何实际更改之前看到其结果,例如:

    kubectl排水管foo——强制——干运行

    但是,它不会显示有关现有本地数据或守护程序的任何错误,您可以在不使用
    --dry run
    标志的情况下看到这些错误:
    。。。错误:无法删除守护程序集管理的POD(使用--ignore守护程序以忽略).


  • 在对节点执行维护之前,我们可以使用kubectl drain安全地将所有POD从节点中移出

    如果要更新、修补或维护硬件/节点,应首先排空所有POD(将POD从一个节点迁移到另一个节点)kubectl drain

    当kubectl排水管成功返回时,表明所有吊舱都已安全排出。然后可以安全地关闭节点

    维护工作完成后,我们可以使用kubectl uncordon告诉Kubernetes,它可以继续在节点上调度新的POD

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