如何使用污点和容忍度隔离 Kubernetes 工作负载

KubernetesKubernetesBeginner
立即练习

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

简介

Kubernetes 的污点(taint)和容忍度(toleration)是强大的功能,可让你控制 Pod 在节点上的调度。本教程将指导你理解污点和容忍度的概念,以及如何为你的 Kubernetes 部署配置它们。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("Kubernetes")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["Troubleshooting and Debugging Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/ConfigurationandVersioningGroup(["Configuration and Versioning"]) kubernetes(("Kubernetes")) -.-> kubernetes/BasicCommandsGroup(["Basic Commands"]) kubernetes(("Kubernetes")) -.-> kubernetes/AdvancedCommandsGroup(["Advanced Commands"]) kubernetes/BasicCommandsGroup -.-> kubernetes/taint("Taint") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("Apply") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("Describe") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/config("Config") subgraph Lab Skills kubernetes/taint -.-> lab-415540{{"如何使用污点和容忍度隔离 Kubernetes 工作负载"}} kubernetes/apply -.-> lab-415540{{"如何使用污点和容忍度隔离 Kubernetes 工作负载"}} kubernetes/describe -.-> lab-415540{{"如何使用污点和容忍度隔离 Kubernetes 工作负载"}} kubernetes/config -.-> lab-415540{{"如何使用污点和容忍度隔离 Kubernetes 工作负载"}} end

理解 Kubernetes 的污点和容忍度

Kubernetes 的污点(taint)和容忍度(toleration)是强大的功能,可让你控制 Pod 在节点上的调度。污点应用于节点,而容忍度则在 Pod 中定义。污点和容忍度共同作用,以确保 Pod 不会被调度到不合适的节点上。

污点 是应用于 Kubernetes 节点的一种属性,它表明该节点不应接受任何不能容忍此污点的 Pod。污点用于将 Pod 从节点上排除。例如,你可以给某个节点添加污点,以表明它应该只承载与特定应用相关的 Pod,或者它有特殊的硬件要求。

容忍度 是应用于 Kubernetes Pod 的一种属性,它表明该 Pod 可以被调度到具有匹配污点的节点上。容忍度允许 Pod 被调度到具有特定污点的节点上。

graph TD A[节点] --> B[污点] C[Pod] --> D[容忍度] B --> D

污点和容忍度通常用于以下场景:

  1. 节点专业化:给具有特定硬件或软件要求的节点添加污点,并在可以在这些节点上运行的 Pod 中容忍这些污点。
  2. 工作负载隔离:给节点添加污点以隔离特定的工作负载,并在属于这些工作负载的 Pod 中容忍这些污点。
  3. 防止驱逐:给节点添加污点以防止某些 Pod 被驱逐,并在关键 Pod 中容忍这些污点。

以下是如何给节点添加污点并在 Pod 中定义容忍度的示例:

## 给节点添加污点
kubectl taint nodes node1 key=value:NoSchedule

## 在 Pod 中定义容忍度
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: my-container
image: nginx
tolerations:
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"

在这个示例中,节点 node1 被添加了键值对为 key=value 且效果为 NoSchedule 的污点。Pod my-pod 定义了一个与该污点匹配的容忍度,从而允许它被调度到有污点的节点上。

为 Pod 配置容忍度

容忍度在 Pod 规范中定义,它们允许 Pod 被调度到具有匹配污点的节点上。容忍度由一个键、一个运算符、一个可选值和一个效果组成。

键是污点的名称。运算符可以是 “Equal” 或 “Exists”,值是污点的值(如果运算符是 “Exists”,则该值为可选)。效果指定了污点对 Pod 的影响,它可以是 “NoSchedule”、“PreferNoSchedule” 或 “NoExecute”。

以下是一个带有容忍度的 Pod 配置示例:

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

在这个示例中,Pod my-pod 有一个容忍度,它与一个键为 dedicated、值为 frontend 且效果为 NoSchedule 的污点相匹配。这意味着该 Pod 可以被调度到具有匹配污点的节点上。

容忍度还可用于防止 Pod 被驱逐。通过将 效果 设置为 NoExecute,如果添加了污点,Pod 将从节点上被驱逐;或者如果节点上已经存在该污点,Pod 将不会被调度。

tolerations:
  - key: "node.kubernetes.io/not-ready"
    operator: "Exists"
    effect: "NoExecute"
    tolerationSeconds: 300

在这个示例中,如果添加了 node.kubernetes.io/not-ready 污点,Pod 将从节点上被驱逐,但在被驱逐前会有 300 秒的宽限期。

容忍度可以是控制 Pod 调度和防止驱逐的强大工具,但应谨慎使用,以确保 Pod 被调度到合适的节点上。

在实际的 Kubernetes 部署中管理容忍度

在实际的 Kubernetes 部署中,管理容忍度是确保高效资源利用和正确 Pod 调度的关键环节。以下是在生产环境中管理容忍度的一些最佳实践和注意事项:

为特定工作负载给节点添加污点

给具有特定硬件或软件要求的节点添加污点,有助于确保只有合适的 Pod 被调度到这些节点上。这对于需要专用资源(如 GPU 或高内存节点)的工作负载特别有用。

## 给有 GPU 需求的节点添加污点
kubectl taint nodes node1 gpu=true:NoSchedule

然后,可以为需要 GPU 资源的 Pod 配置容忍度以匹配该污点,确保它们被调度到合适的节点上。

容忍临时节点问题

容忍度可用于在临时节点问题(如网络连接问题或资源耗尽)期间防止 Pod 被驱逐。通过将 效果 设置为 NoExecute 并指定 tolerationSeconds 值,可以在 Pod 被驱逐之前给它一个宽限期。

tolerations:
  - key: "node.kubernetes.io/not-ready"
    operator: "Exists"
    effect: "NoExecute"
    tolerationSeconds: 300

如果应用了 node.kubernetes.io/not-ready 污点,此配置将允许 Pod 在节点上保留 300 秒(5 分钟),以便节点在 Pod 被驱逐之前有时间恢复。

在命名空间级别管理容忍度

在复杂的 Kubernetes 部署中,在命名空间级别管理容忍度可能会很有用。这使你能够将通用的容忍度应用于命名空间内的所有 Pod,减少为每个 Pod 单独配置容忍度的需求。

apiVersion: v1
kind: Namespace
metadata:
  name: my-namespace
tolerations:
  - key: "team"
    operator: "Equal"
    value: "frontend"
    effect: "NoSchedule"

my-namespace 命名空间中创建的 Pod 将自动继承在命名空间级别定义的容忍度。

通过理解并在实际的 Kubernetes 部署中正确管理容忍度,你可以优化资源利用,确保适当的 Pod 调度,并提高基于 Kubernetes 的应用程序的整体可靠性和弹性。

总结

在本教程中,你了解了 Kubernetes 的污点(taint)和容忍度(toleration),以及它们如何共同作用来控制 Pod 在节点上的调度。你探讨了污点和容忍度的常见用例,例如节点专业化、工作负载隔离和防止驱逐。通过理解和配置污点与容忍度,你可以确保你的 Kubernetes Pod 被调度到合适的节点上,并且你的工作负载得到隔离并防止被驱逐。