污点与容忍

KubernetesKubernetesBeginner
立即练习

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

介绍

Taints(污点)和 tolerations(容忍)在 Kubernetes 中用于指定哪些节点适合调度特定的 Pod。Taints 应用于节点以排斥 Pod,而 tolerations 应用于 Pod 以吸引它们到特定节点。在本实验中,我们将学习如何使用 taints 和 tolerations 在特定节点上调度 Pod。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicsGroup(["`Basics`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/BasicCommandsGroup(["`Basic Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/AdvancedCommandsGroup(["`Advanced Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/TroubleshootingandDebuggingCommandsGroup(["`Troubleshooting and Debugging Commands`"]) kubernetes(("`Kubernetes`")) -.-> kubernetes/ConfigurationandVersioningGroup(["`Configuration and Versioning`"]) kubernetes/BasicsGroup -.-> kubernetes/initialization("`Initialization`") kubernetes/BasicCommandsGroup -.-> kubernetes/get("`Get`") kubernetes/BasicCommandsGroup -.-> kubernetes/cordon("`Cordon`") kubernetes/BasicCommandsGroup -.-> kubernetes/taint("`Taint`") kubernetes/AdvancedCommandsGroup -.-> kubernetes/apply("`Apply`") kubernetes/TroubleshootingandDebuggingCommandsGroup -.-> kubernetes/describe("`Describe`") kubernetes/ConfigurationandVersioningGroup -.-> kubernetes/label("`Label`") subgraph Lab Skills kubernetes/initialization -.-> lab-34029{{"`污点与容忍`"}} kubernetes/get -.-> lab-34029{{"`污点与容忍`"}} kubernetes/cordon -.-> lab-34029{{"`污点与容忍`"}} kubernetes/taint -.-> lab-34029{{"`污点与容忍`"}} kubernetes/apply -.-> lab-34029{{"`污点与容忍`"}} kubernetes/describe -.-> lab-34029{{"`污点与容忍`"}} kubernetes/label -.-> lab-34029{{"`污点与容忍`"}} end

启动 Minikube 集群

在创建资源之前,你需要一个正在运行的 Kubernetes 集群。Minikube 是一个轻量级的 Kubernetes 环境,可以在你的本地机器上运行。

  1. 导航到工作目录

    打开终端并导航到默认的项目文件夹:

    cd /home/labex/project
  2. 启动 Minikube

    启动 Minikube 以初始化一个 Kubernetes 集群:

    minikube start
    • 此命令将在你的本地机器上设置一个单节点的 Kubernetes 集群。
    • 根据系统性能,Minikube 可能需要几分钟才能启动。
  3. 验证 Minikube 是否正在运行

    检查 Minikube 集群的状态:

    minikube status
    • 查找 kubeletapiserver 等组件是否显示为 Running
    • 如果集群未运行,请重新运行 minikube start

如果启动 Minikube 时遇到问题,可以使用 minikube delete 重置环境(如有需要)。

创建带有污点的节点

在这一步骤中,我们将创建一个带有污点的节点,该污点将排斥某些 Pod。

  1. 使用自定义标签标记节点:
kubectl label nodes minikube disk-type=ssd
  1. 使用以下命令为节点添加污点:
kubectl taint nodes minikube disk-type=ssd:NoSchedule

NoSchedule 效果将阻止没有容忍配置的 Pod 被调度到该节点上。

创建没有容忍配置的 Pod

在这一步骤中,我们将创建一个没有容忍配置的 Pod,并验证它无法被调度到带有污点的节点上。

  1. 创建一个名为 pod-without-toleration.yaml 的文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
  name: pod-without-toleration
spec:
  containers:
    - name: nginx
      image: nginx:latest
  1. 应用更改:
kubectl apply -f pod-without-toleration.yaml
  1. 验证 Pod 未被调度到带有污点的节点上:
kubectl describe pod pod-without-toleration | grep -i taint

输出应显示 Pod 未被调度到带有污点的节点上。

创建带有容忍配置的 Pod

在这一步骤中,我们将创建一个带有容忍配置的 Pod,使其能够被调度到带有污点的节点上。

  1. 创建一个名为 pod-with-toleration.yaml 的文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-toleration
spec:
  containers:
    - name: nginx
      image: nginx:latest
  tolerations:
    - key: "disk-type"
      operator: "Equal"
      value: "ssd"
      effect: "NoSchedule"
  1. 应用更改:
kubectl apply -f pod-with-toleration.yaml
  1. 验证 Pod 是否被调度到带有污点的节点上:
kubectl get pod pod-with-toleration -o wide

容忍多个污点

在这一步骤中,我们将创建一个带有多个容忍配置的 Pod,使其能够被调度到带有多个污点的节点上。

  1. 创建一个名为 pod-with-multiple-tolerations.yaml 的文件,内容如下:
apiVersion: v1
kind: Pod
metadata:
  name: pod-with-multiple-tolerations
spec:
  containers:
    - name: nginx
      image: nginx:latest
  tolerations:
    - key: "disk-type"
      operator: "Equal"
      value: "ssd"
      effect: "NoSchedule"
    - key: "gpu"
      operator: "Equal"
      value: "true"
      effect: "NoSchedule"
  1. 应用更改:
kubectl apply -f pod-with-multiple-tolerations.yaml
  1. 验证 Pod 是否被调度到同时带有这两个污点的节点上:
kubectl get pod pod-with-multiple-tolerations -o wide

总结

在本实验中,我们学习了如何使用污点(taints)和容忍(tolerations)将 Pod 调度到特定节点上。我们首先创建了一个带有污点的节点,并验证了没有容忍配置的 Pod 无法被调度到该节点上。接着,我们创建了一个带有容忍配置的 Pod,并验证了它能够被调度到带有污点的节点上。最后,我们创建了一个带有多个容忍配置的 Pod,并验证了它能够被调度到带有多个污点的节点上。

污点和容忍是 Kubernetes 的强大功能,可用于确保某些工作负载仅被调度到特定节点上。

您可能感兴趣的其他 Kubernetes 教程