如何验证 Kubernetes Pod 是否调度到有污点的节点上

KubernetesKubernetesBeginner
立即练习

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

简介

Kubernetes 是广受欢迎的容器编排平台,它提供了一种名为污点(taints)和容忍度(tolerations)的强大机制来控制 Pod 的调度。在本教程中,我们将探讨如何验证 Kubernetes Pod 是否被调度到了有污点的节点上,理解这一概念的重要性,并讨论实际用例。


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-415541{{"如何验证 Kubernetes Pod 是否调度到有污点的节点上"}} kubernetes/taint -.-> lab-415541{{"如何验证 Kubernetes Pod 是否调度到有污点的节点上"}} kubernetes/describe -.-> lab-415541{{"如何验证 Kubernetes Pod 是否调度到有污点的节点上"}} kubernetes/exec -.-> lab-415541{{"如何验证 Kubernetes Pod 是否调度到有污点的节点上"}} kubernetes/logs -.-> lab-415541{{"如何验证 Kubernetes Pod 是否调度到有污点的节点上"}} end

理解 Kubernetes 污点和容忍度

什么是 Kubernetes 污点?

Kubernetes 污点是一种排斥或「污染」节点的方式,这样一来,除非 Pod 具有匹配的容忍度,否则无法在该节点上进行调度。污点用于标记具有特殊硬件或软件要求的节点,或者为特定用例分配专用节点。

污点在节点级别定义,包含三个部分:

  • 键(Key):污点的名称。
  • 值(Value):污点的值。
  • 效果(Effect):污点的效果,可以是 NoSchedulePreferNoScheduleNoExecute

什么是 Kubernetes 容忍度?

容忍度在 Pod 级别定义,允许 Pod「容忍」节点上的污点。如果 Pod 对节点上的某个污点具有匹配的容忍度,则该 Pod 可以调度到该节点上。

容忍度包含三个部分:

  • 键(Key):被容忍的污点的名称。
  • 运算符(Operator):运算符,可以是 EqualExists
  • 值(Value):被容忍的污点的值。
  • 效果(Effect):被容忍的污点的效果,可以是 NoSchedulePreferNoScheduleNoExecute

污点和容忍度的实际用例

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

  • 专用节点:给节点添加污点并让 Pod 容忍该污点,这样你就可以为特定用例分配专用节点,例如仅运行数据库 Pod 或仅运行前端 Pod。
  • 特定硬件工作负载:给具有特定硬件要求(例如启用 GPU 的节点)的节点添加污点,并让 Pod 容忍该污点,这样你就可以调度需要这些硬件资源的工作负载。
  • 驱逐 PodNoExecute 污点效果可用于在节点维护或升级期间从节点驱逐 Pod。

应用污点和容忍度

你可以使用 kubectl taint 命令给节点应用污点:

kubectl taint nodes node1 key1=value1:NoSchedule

你可以在 Pod 规范中使用 tolerations 字段给 Pod 添加容忍度:

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

识别调度到有污点节点上的 Pod

检查节点上的污点信息

你可以使用 kubectl describe node 命令来检查节点上的污点信息:

kubectl describe node node1

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

检查 Pod 上的容忍度信息

要检查 Pod 的容忍度信息,可以使用 kubectl describe pod 命令:

kubectl describe pod my-pod

这将显示为该 Pod 定义的容忍度(如果有的话)。

识别调度到有污点节点上的 Pod

要识别调度到有污点节点上的 Pod,可以使用以下命令:

kubectl get pods --all-namespaces -o wide | grep -v "Toleration"

此命令将列出所有命名空间中的所有 Pod,并过滤掉对其调度到的节点上的污点具有匹配容忍度的 Pod。

或者,你可以使用以下命令获得更详细的视图:

kubectl get pods --all-namespaces -o jsonpath='{range.items[*]}{.metadata.name}{"\t"}{.spec.tolerations[*].key}{"\n"}{end}'

此命令将输出每个 Pod 的名称及其容忍度列表。

理解输出

上述命令的输出将帮助你识别调度到有污点节点上的 Pod。如果一个 Pod 被调度到有污点的节点上,但没有匹配的容忍度,它将显示在输出中。

通过了解哪些 Pod 被调度到有污点的节点上,你可以采取适当的行动,例如为 Pod 添加容忍度或修改节点上的污点。

实际应用和用例

针对特定工作负载的专用节点

污点和容忍度可用于为特定工作负载分配专用节点,例如仅运行数据库 Pod 或仅运行前端 Pod。这可以通过以下方式实现:

  1. 用特定的污点标记专用节点。
  2. 为应调度到专用节点上的 Pod 添加相应的容忍度。

示例:

## 给节点添加污点
kubectl taint nodes node1 app=database:NoSchedule

## 创建具有匹配容忍度的 Pod
apiVersion: v1
kind: Pod
metadata:
name: my-database-pod
spec:
tolerations:
- key: "app"
operator: "Equal"
value: "database"
effect: "NoSchedule"
containers:
- name: my-container
image: my-database-image

特定硬件工作负载

污点和容忍度可用于调度需要特定硬件资源的工作负载,例如 GPU 或高内存节点。这可以通过以下方式实现:

  1. 用所需的硬件资源标记节点。
  2. 为应调度到具有所需硬件的节点上的 Pod 添加相应的容忍度。

示例:

## 给启用 GPU 的节点添加污点
kubectl taint nodes node1 gpu=true:NoSchedule

## 创建具有匹配容忍度的 Pod
apiVersion: v1
kind: Pod
metadata:
name: my-gpu-pod
spec:
tolerations:
- key: "gpu"
operator: "Equal"
value: "true"
effect: "NoSchedule"
containers:
- name: my-container
image: my-gpu-image

节点维护期间驱逐 Pod

NoExecute 污点效果可用于在节点维护或升级期间从节点驱逐 Pod。当一个节点被标记为具有 NoExecute 效果时,任何没有匹配容忍度的 Pod 将被从该节点驱逐。

示例:

## 给节点添加 NoExecute 效果的污点
kubectl taint nodes node1 maintenance=true:NoExecute

## 没有匹配容忍度的 Pod 将被驱逐

通过理解这些实际应用和用例,你可以有效地利用 Kubernetes 污点和容忍度来管理你的集群资源,并确保你的工作负载被调度到合适的节点上。

总结

掌握对 Kubernetes 污点和容忍度的理解对于有效管理你的 Kubernetes 部署至关重要。通过学习如何识别调度到有污点节点上的 Pod,你可以确保你的工作负载在正确的基础设施上运行,并优化资源利用率。本教程为你提供了必要的知识和技术,让你有信心验证在有污点节点上的 Pod 调度,并充分利用 Kubernetes 的这一特性。