如何在 Kubernetes 中对节点上的现有污点应用不同效果进行修改

KubernetesKubernetesBeginner
立即练习

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

简介

本教程将引导你了解 Kubernetes 污点(taint)、其作用,以及如何应用和管理它们。污点是一种强大的机制,允许节点管理员用特定属性标记节点,充当 “排斥器”,防止 Pod 被调度到有污点的节点上,除非 Pod 具有相应的容忍度(toleration)。通过本教程的学习,你将能够利用污点来确保节点的正确专业化,并维持所需的集群状态。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes/BasicCommandsGroup -.-> kubernetes/cordon("Cordon") kubernetes/BasicCommandsGroup -.-> kubernetes/uncordon("Uncordon") kubernetes/BasicCommandsGroup -.-> kubernetes/taint("Taint") subgraph Lab Skills kubernetes/cordon -.-> lab-415850{{"如何在 Kubernetes 中对节点上的现有污点应用不同效果进行修改"}} kubernetes/uncordon -.-> lab-415850{{"如何在 Kubernetes 中对节点上的现有污点应用不同效果进行修改"}} kubernetes/taint -.-> lab-415850{{"如何在 Kubernetes 中对节点上的现有污点应用不同效果进行修改"}} end

理解 Kubernetes 污点及其作用

Kubernetes 污点是一种强大的机制,允许节点管理员用特定属性标记节点。这些污点充当 “排斥器”,防止 Pod 被调度到有污点的节点上,除非 Pod 具有相应的容忍度。

污点主要用于节点专业化,即某些节点专门用于特定的工作负载或应用程序。通过应用污点,你可以确保只有合适的 Pod 被调度到指定的节点上,从而提高资源利用率并维持所需的集群状态。

让我们来探讨一下 Kubernetes 污点的概念及其作用:

什么是 Kubernetes 污点?

Kubernetes 污点是应用于节点的键值对。它们有三种作用:

  • NoSchedule:不容忍该污点的 Pod 不会被调度到该节点上。
  • PreferNoSchedule:Kubernetes 会尽量避免将不容忍该污点的 Pod 调度到该节点上,但这不是硬性要求。
  • NoExecute:不容忍该污点的 Pod 如果已经在该节点上运行,将会被驱逐。

污点是 Kubernetes 节点管理的关键组成部分,使你能够控制 Pod 的放置,并确保特定的工作负载被隔离在指定的节点上。

对节点应用污点

你可以使用 kubectl taint 命令对节点应用污点。例如,要对节点应用 node-type=database:NoSchedule 污点,你可以运行:

kubectl taint nodes node1 node-type=database:NoSchedule

此污点将防止没有相应容忍度的 Pod 被调度到 node1 节点上。

从节点移除污点

要从节点移除污点,你可以使用相同的 kubectl taint 命令,但加上 - 后缀:

kubectl taint nodes node1 node-type=database:NoSchedule-

这将从 node1 节点移除 node-type=database:NoSchedule 污点。

通过理解和应用 Kubernetes 污点,你可以有效地管理集群的节点专业化,并确保你的工作负载被调度到合适的节点上。

在 Kubernetes 节点上应用和管理污点

既然我们已经对 Kubernetes 污点及其作用有了基本的了解,那么让我们更深入地探讨如何在集群节点上应用和管理污点。

对节点应用污点

你可以使用 kubectl taint 命令对节点应用污点。一般语法如下:

kubectl taint nodes <节点名称> <污点键>=<污点值>:<污点效果>

例如,要对名为 node1 的节点应用 node-type=database:NoSchedule 污点,你可以运行:

kubectl taint nodes node1 node-type=database:NoSchedule

此污点将防止没有相应容忍度的 Pod 被调度到 node1 节点上。

从节点移除污点

要从节点移除污点,你可以使用相同的 kubectl taint 命令,但加上 - 后缀:

kubectl taint nodes node1 node-type=database:NoSchedule-

这将从 node1 节点移除 node-type=database:NoSchedule 污点。

列出节点上的污点

你可以使用 kubectl describe nodes 命令查看应用于节点的当前污点:

kubectl describe nodes node1 | grep Taints

这将显示应用于 node1 节点的污点(如果有的话)。

更新节点上的污点

如果你需要更新现有的污点,你可以简单地应用一个具有相同键但不同值或效果的新污点。Kubernetes 将自动更新节点上的污点。

例如,要将 node-type=database 污点的效果从 NoSchedule 更改为 PreferNoSchedule,你可以运行:

kubectl taint nodes node1 node-type=database:PreferNoSchedule

通过理解和应用这些污点管理命令,你可以有效地控制 Kubernetes 节点上 Pod 的调度,并确保你的工作负载在合适的节点上运行。

配置 Pod 以容忍污点

在前面的章节中,我们学习了如何在 Kubernetes 节点上应用和管理污点。现在,让我们探讨如何配置 Pod 以容忍这些污点,从而使它们能够被调度到有污点的节点上。

理解 Pod 容忍度

容忍度(Toleration)是污点(Taint)的对应物。Pod 使用容忍度来表明它们可以被调度到具有特定污点的节点上。当一个 Pod 具有与节点上的污点相匹配的容忍度时,该 Pod 就可以被调度到那个节点上。

容忍度在 Pod 规范的 tolerations 字段下定义。容忍度的一般语法如下:

tolerations:
  - key: "<污点键>"
    operator: "Equal" ## 或 "Exists"
    value: "<污点值>" ## 可选
    effect: "<污点效果>"

keyeffect 字段必须与相应的污点匹配,operator 字段决定如何解释 value 字段。

配置 Pod 以容忍污点

让我们看一个容忍 node-type=database:NoSchedule 污点的 Pod 配置示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
    - name: my-container
      image: nginx
  tolerations:
    - key: "node-type"
      operator: "Equal"
      value: "database"
      effect: "NoSchedule"

在这个例子中,该 Pod 将能够被调度到具有 node-type=database:NoSchedule 污点的节点上。

你也可以使用 Exists 操作符来匹配污点键的任何值,而不管污点值是什么:

tolerations:
  - key: "node-type"
    operator: "Exists"
    effect: "NoSchedule"

这个容忍度将匹配任何具有键 node-typeNoSchedule 效果的污点。

通过为 Pod 配置适当的容忍度,你可以确保即使那些节点应用了特定的污点,你的工作负载也能被调度到指定的节点上。

总结

在本教程中,你已经了解了 Kubernetes 污点及其作用,包括三种污点作用:NoSchedule、PreferNoSchedule 和 NoExecute。你还探讨了如何使用 kubectl taint 命令对节点应用和移除污点。最后,你理解了配置 Pod 以容忍污点的重要性,这对于确保合适的 Pod 被调度到指定节点、提高资源利用率以及维持所需的集群状态至关重要。通过掌握 Kubernetes 污点和容忍度的概念,你可以有效地管理集群的节点专业化和工作负载隔离。