如何管理 Kubernetes 污点和容忍度

KubernetesKubernetesBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Kubernetes 污点(Taints)和容忍度(Tolerations)是强大的功能,可让你控制 Pod 在节点上的调度。本教程将指导你理解污点和容忍度的概念,以及如何在 Kubernetes 集群中有效地管理它们。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes/BasicCommandsGroup -.-> kubernetes/uncordon("Uncordon") kubernetes/BasicCommandsGroup -.-> kubernetes/taint("Taint") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/exec("Exec") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/logs("Logs") subgraph Lab Skills kubernetes/uncordon -.-> lab-415848{{"如何管理 Kubernetes 污点和容忍度"}} kubernetes/taint -.-> lab-415848{{"如何管理 Kubernetes 污点和容忍度"}} kubernetes/describe -.-> lab-415848{{"如何管理 Kubernetes 污点和容忍度"}} kubernetes/exec -.-> lab-415848{{"如何管理 Kubernetes 污点和容忍度"}} kubernetes/logs -.-> lab-415848{{"如何管理 Kubernetes 污点和容忍度"}} end

理解 Kubernetes 污点(Taints)和容忍度(Tolerations)

Kubernetes 污点(Taints)和容忍度(Tolerations)是强大的功能,可让你控制 Pod 在节点上的调度。污点应用于节点,而容忍度应用于 Pod。这种机制使你能够确保 Pod 仅调度到能够容忍其要求的节点上。

什么是 Kubernetes 污点(Taints)?

Kubernetes 污点(Taints)是一种在节点上设置“排斥”效果的方式,这样除非 Pod 具有匹配的容忍度,否则不会在该节点上调度。污点表示为键值对,它们可以有三种不同的效果:

  1. NoSchedule:不容忍该污点的 Pod 将不会调度到该节点上。
  2. PreferNoSchedule:Kubernetes 将尝试避免调度不容忍该污点的 Pod,但不保证这些 Pod 不会调度到该节点上。
  3. NoExecute:不容忍该污点的 Pod 将不会调度到该节点上,如果它们已经在该节点上运行,将会被驱逐。

什么是 Kubernetes 容忍度(Tolerations)?

Kubernetes 容忍度(Tolerations)是污点(Taints)的对应物。容忍度应用于 Pod,并允许它们“容忍”节点上存在的污点。容忍度也表示为键值对,并且它们可以匹配污点的键、值和效果。

应用污点(Taints)和容忍度(Tolerations)

要将污点应用于节点,可以使用 kubectl taint 命令:

kubectl taint nodes node1 key=value:NoSchedule

要向 Pod 添加容忍度,可以在 Pod 的规范中包含容忍度:

tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoSchedule"

示例用例

假设你有一组专门用于运行特定类型工作负载(如数据库)的节点。你可以使用特定的键值对和效果给这些节点添加污点,如下所示:

kubectl taint nodes db-nodes database=true:NoSchedule

然后,你可以创建具有匹配容忍度的 Pod,以便它们可以调度到有污点的节点上:

tolerations:
  - key: "database"
    operator: "Equal"
    value: "true"
    effect: "NoSchedule"

通过这种方式,你可以确保数据库 Pod 仅调度到合适的节点上,并且其他 Pod 除非具有匹配的容忍度,否则不会调度到这些节点上。

在 Kubernetes 中管理污点(Taints)

Kubernetes 提供了各种命令和选项来管理节点上的污点(Taints)。在本节中,我们将探讨如何使用 kubectl 命令行工具来添加、移除和更新污点(Taints)。

向节点添加污点(Taints)

要向节点添加污点(Taints),可以使用带有 node/<节点名称> 参数的 kubectl taint 命令:

kubectl taint node node1 key=value:NoSchedule

这会将污点 key=value:NoSchedule 添加到节点 node1 上。

从节点移除污点(Taints)

要从节点移除污点(Taints),可以使用相同的 kubectl taint 命令,但在污点键前加上 - 字符:

kubectl taint node node1 key-

这会从节点 node1 移除键为 key 的污点。

更新节点上的污点(Taints)

要更新节点上现有的污点(Taints),只需添加一个具有相同键但不同值或效果的新污点:

kubectl taint node node1 key=newvalue:NoExecute

这会将节点 node1 上键为 key 的污点更新为值 newvalue 和效果 NoExecute

根据条件给节点添加污点(Taints)

Kubernetes 还允许你根据某些条件给节点添加污点(Taints),例如 node.kubernetes.io/not-readynode.kubernetes.io/unreachable。这对于自动给处于不健康状态的节点添加污点很有用,可防止 Pod 被调度到这些节点上。你可以使用相同的 kubectl taint 命令应用这些污点:

kubectl taint node node1 node.kubernetes.io/not-ready:NoSchedule

这会给节点 node1 添加 node.kubernetes.io/not-ready 污点,没有匹配容忍度的 Pod 将不会被调度到这个节点上。

通过了解如何在 Kubernetes 中管理污点(Taints),你可以确保你的 Pod 被调度到合适的节点上,并有效利用集群资源。

排查与污点(Taints)相关的问题

虽然 Kubernetes 污点(Taints)和容忍度(Tolerations)为控制 Pod 调度提供了强大的机制,但有时你可能会遇到与它们的使用相关的问题。在本节中,我们将探讨一些常见问题及其解决方案。

由于污点(Taints)导致 Pod 未被调度

如果你发现由于污点(Taints)导致 Pod 未在节点上被调度,可以检查以下几点:

  1. 验证污点(Taint)是否存在:确保你期望在节点上存在的污点(Taint)确实存在。你可以使用 kubectl get nodes -o yaml 命令列出节点上的所有污点(Taints)。
  2. 检查 Pod 的容忍度(Tolerations):验证 Pod 是否配置了正确的容忍度(Tolerations)。为了使 Pod 能够在节点上调度,容忍度(Tolerations)必须与污点(Taint)的键、值和效果相匹配。
  3. 检查 Pod 事件:使用 kubectl describe pod <pod 名称> 检查 Pod 的事件,查看是否有与污点(Taints)和容忍度(Tolerations)相关的消息。

由于污点(Taints)导致 Pod 被驱逐

如果由于污点(Taints)导致 Pod 从节点上被驱逐,你应该调查以下方面:

  1. 污点(Taint)效果:确保污点(Taint)效果设置正确。NoExecute 效果会导致没有匹配容忍度(Toleration)的 Pod 立即被驱逐,而 PreferNoSchedule 只会阻止新的 Pod 被调度。
  2. 容忍度(Toleration)过期:如果 Pod 在其容忍度(Toleration)中设置了 tolerationSeconds 字段,请确保没有超过时间限制,否则 Pod 会被驱逐。
  3. 节点条件:检查节点是否有任何导致应用污点(Taints)的条件,例如 node.kubernetes.io/not-readynode.kubernetes.io/unreachable

污点(Taint)移除问题

有时,在尝试从节点移除污点(Taints)时可能会遇到问题。以下是一些需要考虑的方面:

  1. 污点(Taint)键是否存在:确保你试图移除的污点(Taint)实际上存在于节点上。使用 kubectl get nodes -o yaml 来验证污点(Taint)。
  2. 污点(Taint)的所有者:确保你试图移除的污点(Taint)是由你或你的应用添加的,而不是由 Kubernetes 系统本身添加的。系统管理的污点(Taints)可能需要特殊处理。
  3. 污点(Taint)传播:如果污点(Taint)是通过节点条件应用到节点上的,仅移除污点(Taint)可能不够。你可能需要解决导致应用污点(Taint)的潜在条件。

通过了解这些与污点(Taints)相关的常见问题及其解决方案,你可以更有效地管理和排查在污点(Taints)和容忍度(Tolerations)起关键作用的 Kubernetes 集群中的问题。

总结

在本教程中,你已经了解了 Kubernetes 污点(Taints)和容忍度(Tolerations),以及如何将它们应用到你的 Kubernetes 集群中。污点用于在节点上设置“排斥”效果,而容忍度应用于 Pod,以便它们能够在具有特定污点的节点上进行调度。通过理解并正确管理污点和容忍度,你可以确保你的 Pod 仅调度到能够满足其要求的节点上,从而实现更高效的资源利用和更好的整体集群管理。