【问题标题】:What makes a kubernetes node unhealthy?是什么让 Kubernetes 节点不健康?
【发布时间】:2019-02-17 17:19:38
【问题描述】:

在过去的 1 个月中,我们的 GKE 集群上发生了 4 个 AUTO_REPAIR_NODES 事件(由命令 gcloud container operations list 显示)。 node-auto-repair 的后果是该节点被重新创建并附加一个新的外部 IP,而新的外部 IP 未被第三方服务列入白名单,最终导致在该新节点上运行的服务失败。

我注意到我们在 Kubernetes 集群中启用了“自动节点修复”,我很想禁用它,但在我这样做之前,我需要了解更多有关情况。

我的问题是:

  1. 首先导致节点不健康的常见原因有哪些?我知道这篇文章https://cloud.google.com/kubernetes-engine/docs/how-to/node-auto-repair#node_repair_process 说,“节点在给定时间阈值的连续检查中报告NotReady 状态”将触发自动修复。但是什么会导致节点变为NotReady
  2. 我也知道这篇文章https://kubernetes.io/docs/concepts/architecture/nodes/#node-status 提到了节点状态的完整列表:{OutOfDisk, Ready, MemoryPressure, PIDPressure, DiskPressure, NetworkUnavailable, ConfigOK}。我想知道,如果某个节点的 {OutOfDisk, MemoryPressure, PIDPressure, DiskPressure, NetworkUnavailable} 中的任何一个变为 true,该节点会变为 NotReady 吗?
  3. 在集群中禁用“自动节点修复”后会产生哪些负面影响? 我基本上想知道我们是否会遇到比自动修复的节点和新连接的未列入白名单的 IP 更糟糕的情况。一旦“自动节点修复”被禁用,那么对于在不健康节点上运行且本应自动修复的 Pod,Kubernetes 是否会在其他节点上创建新的 Pod?

【问题讨论】:

标签: kubernetes google-cloud-platform google-kubernetes-engine


【解决方案1】:

这里的混淆在于当您运行 kubectl get nodes 时会显示“就绪”和“未就绪”状态,这些状态由 kube-apiserver 报告。但是这些是独立的,并且从文档中不清楚它们与here 描述的 kubelet 状态有何关系 您还可以在运行 kubectl describe nodes 时查看 kubelet 状态(在事件中)

回答部分问题:

  1. 由 kube-apiserver 报告

    • Kubelet 向下
    • docker 或 containerd 或 crio down(取决于您使用的 shim)
    • kubelet 状态 - 不清楚。
  2. 对于这些,kubelet 将开始驱逐或不调度除 Ready (https://kubernetes.io/docs/tasks/administer-cluster/out-of-resource/) 之外的 Pod。文档中不清楚这些是如何从 kubeapi-server 报告的。

    • 您的集群上的节点可能未使用,您需要为使用付费。
    • 是的,k8s 会在某个就绪性探测失败后重新调度 Pod(可配置)。如果 kubelet 宕机或节点宕机,k8s 会认为 pod 宕机。
    • 假设您的节点出现故障,您最终的容量可能会少于您将工作负载安排到 k8s 所需的容量,但无论如何都无法安排它们。

希望对你有帮助!

【讨论】:

  • 有没有官方文档描述了“当OutOfDisk、MemoryPressure、PIDPressure、DiskPressure、NetworkUnavailable中的任何一个为true时,节点状态变为NotReady”的机制?我希望能找到那个。
  • 而且,当 MemoryPressure 条件为真时,为什么不销毁和重新创建整个节点,kubernetes 不简单地驱逐/删除某些应用程序 pod(并在另一个节点上重新启动 pod)来回收资源?驱逐一些 pod 听起来比重建整个节点更具破坏性。
  • 不,找不到任何确切的文档。我正在查看代码,但需要时间来关联这些状态。我修改了答案。基本上,如果 kubelet 启动,您的节点就可以准备好,但是一旦出现压力状态,kubelet 就会开始驱逐。我将对代码进行测试,看看是否能找到确切的相关性。或者你可以在 sig-node 上提问。
  • 看了一下代码。更改了答案,仍然不清楚您在运行 kubectl get nodes 时看到的内容如何转换为 kubelet 节点状态。
【解决方案2】:

不是我的答案,但这个关于 SF 的答案指向正确的方向,关于使用 NAT 网关并将该 IP 列入白名单 https://serverfault.com/a/930963/429795

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 2023-04-03
    • 2022-10-18
    • 1970-01-01
    • 2021-04-12
    • 2019-01-08
    • 1970-01-01
    相关资源
    最近更新 更多