Kubernetes 中的 Taints 和 Tolerations:如何防止 Pod 调度到某些节点

阅读时长 4 分钟读完

在 Kubernetes 中,Taints 和 Tolerations 是指定 Pod 可以在哪些节点上运行的机制。Taint 是一个标记,表示一个节点不希望有某些特定类型的 Pod 调度到上面。而 Tolerations 则是 Pod 的标记,表明这个 Pod 具有容忍某些 Taint 的能力。

为什么需要 Taints 和 Tolerations

在一个多节点的 Kubernetes 集群中,你希望将一部分节点用于某个特定的工作负载,比如运行某个特定的应用程序,这样可以获得更好的性能和资源利用率。然而,当你有多个工作负载时,你可能会发现有些工作负载会竞争同一个节点上的资源,造成负载不平衡。

为了解决这个问题,Taint 和 Tolerations 提供了一种简单但可靠的解决方案。你可以在节点上标记 Taints,告诉 Kubernetes 集群这个节点不希望调度到某些特定类型的 Pod。同时,你可以在 Pod 上配置 Tolerations,告诉 Kubernetes 集群这个 Pod 具有容忍某些 Taint 的能力,可以在被 Tainted 的节点上运行。

Taint 的类型

Taint 由三个属性组成:key、value 和 effect。key 和 value 相当于 Taint 的标识和值。effect 则定义了当该 Taint 应用到一个节点时,Pod 会如何影响节点上的 Pod 的调度:

  • NoSchedule:表示节点不可被调度到,除非 Pod 明确声明容忍。(默认值)
  • PreferNoSchedule:表示节点不是理想的调度选项,但如果没有其它更好的节点可用,该节点也将被调度使用。
  • NoExecute:表示已有运行的 Pod 会被识别并驱逐。

Tolerations 的类型

Tolerations 也由三个属性组成:key、value 和 effect。同样,key 和 value 也就是 Tolerations 的标识和值。effect 则描述了 Pod 的容忍如何应用于 Taint:

  • NoSchedule:表示 Pod 可以调度到 Tainted 的节点上,但是节点上已有的 Taint 会把这个 Pod 驱逐掉。
  • PreferNoSchedule:表示 Pod 可以调度到 Tainted 的节点上,但是节点上已有的 Taint 可能会让别的 Pod 比它更优先被调度。
  • NoExecute:表示 Pod 可以调度到 Tainted 的节点上,同时也会保留 Tainted 特征,如果该特征处理好了,Pod 将不会被删除。

在 YAML 文件中指定 Taints 和 Tolerations

下面是一个 Pod YAML 文件的例子,其中使用了 Taints 和 Tolerations:

-- -------------------- ---- -------
----------- --
----- ---
---------
  ----- ------
-----
  -----------
  - ----- ------------
    ------ --------
  ------------
  - ---- -----
    --------- -------
    ------ -------
    ------- ------------

在这个例子中,tolerations 列表包含一个 Taint 的 key 和 value 和 effect 字段。这个 Pod 将不会被调度到被 Tainted 的节点上,除非这个特殊的 Taint 彼此匹配。

如何测试 Taints 和 Tolerations

为了测试 Taint 和 Tolerance,你需要手动在 Kubernetes 集群中创建一些 Taints 和 Tolerations,然后在这些节点上启动一些测试 Pod。

首先,使用以下命令创建一个 Tainted 的节点:

在这个命令中,你指定了 Taint 的 key 和 value 和 effect。使用 kubectl describe node node01 命令,你可以查看这个节点的 Taints 信息。

接着,使用以下命令创建一个带有 Tolerations 的 Pod:

-- -------------------- ---- -------
----------- --
----- ---
---------
  ----- ------
-----
  -----------
  - ----- ------------
    ------ --------
  ------------
  - ---- -----
    --------- -------
    ------ -------
    ------- ------------

在这个命令中,你使用的是上面的 YAML 示例。

使用 kubectl apply -f mypod.yaml 命令来创建这个 Pod。如果它成功创建,并被调度到了一个没有被 Tainted 的节点上,说明 Taint 和 Tolerance 工作正常。

总结

在 Kubernetes 集群中使用 Taints 和 Tolerations 可以确保你的 Pod 只会被调度到合适的节点上,从而提高了负载均衡和资源利用率。掌握这个机制可以让你更好地管理 Kubernetes 集群。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64efe9e8f6b2d6eab39d33e7

纠错
反馈