跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kubernetes污点与容忍
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Kubernetes污点与容忍 = '''污点(Taints)与容忍(Tolerations)'''是Kubernetes中用于控制Pod调度到特定节点的一种机制。它们允许集群管理员标记节点(污点),并允许Pod声明它们能够容忍哪些污点(容忍)。这种机制常用于确保某些Pod只在特定节点上运行,例如专用硬件节点或具有特殊配置的节点。 == 概念介绍 == === 污点(Taints) === 污点是应用于节点的属性,用于排斥那些不能容忍该污点的Pod。一个污点由三部分组成: * '''键(Key)''':标识污点的名称 * '''值(Value)''':污点的可选值 * '''效果(Effect)''':定义Pod不能容忍该污点时的行为,有以下三种: * <code>NoSchedule</code>:不能容忍的Pod不会被调度到该节点(已运行的Pod不受影响) * <code>PreferNoSchedule</code>:尽量不调度不能容忍的Pod到该节点 * <code>NoExecute</code>:不能容忍的Pod不会被调度到该节点,且已运行但不容忍的Pod会被驱逐 === 容忍(Tolerations) === 容忍是Pod的属性,允许Pod被调度到带有特定污点的节点上。容忍需要匹配污点的键、值和效果(可选)。 == 基本用法 == === 管理节点污点 === 使用<code>kubectl taint</code>命令管理节点污点: <syntaxhighlight lang="bash"> # 添加污点 kubectl taint nodes node1 key1=value1:NoSchedule # 查看污点 kubectl describe node node1 | grep Taints # 删除污点 kubectl taint nodes node1 key1:NoSchedule- </syntaxhighlight> === 定义Pod容忍 === 在Pod规范中添加<code>tolerations</code>字段: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Pod metadata: name: my-pod spec: containers: - name: nginx image: nginx tolerations: - key: "key1" operator: "Equal" value: "value1" effect: "NoSchedule" </syntaxhighlight> == 高级配置 == === 操作符 === 容忍支持两种操作符: * <code>Equal</code>:键和值必须完全匹配(默认) * <code>Exists</code>:只需键存在,忽略值 <syntaxhighlight lang="yaml"> tolerations: - key: "key1" operator: "Exists" effect: "NoSchedule" </syntaxhighlight> === 容忍所有污点 === 特殊容忍可以忽略所有污点(谨慎使用): <syntaxhighlight lang="yaml"> tolerations: - operator: "Exists" </syntaxhighlight> == 实际应用场景 == === 专用硬件节点 === 为GPU节点添加污点,只有需要GPU的Pod才能调度: <syntaxhighlight lang="bash"> kubectl taint nodes gpu-node gpu=true:NoSchedule </syntaxhighlight> 对应的Pod配置: <syntaxhighlight lang="yaml"> tolerations: - key: "gpu" operator: "Equal" value: "true" effect: "NoSchedule" </syntaxhighlight> === 节点维护 === 在维护节点时添加<code>NoExecute</code>污点: <syntaxhighlight lang="bash"> kubectl taint nodes node1 maintenance=true:NoExecute </syntaxhighlight> === 基于污点的节点亲和性 === 结合节点亲和性实现复杂调度: <mermaid> graph LR A[Pod] -->|容忍| B[污点节点] B --> C{节点选择器} C -->|匹配| D[特定节点] </mermaid> == 数学表示 == 污点与容忍的匹配可以表示为: <math> T_{match} = \begin{cases} true, & \text{如果 } (T_{key} = P_{key}) \land (T_{effect} = P_{effect}) \land (T_{operator} = \text{Exists} \lor T_{value} = P_{value}) \\ false, & \text{其他情况} \end{cases} </math> 其中: * <math>T</math> 表示污点 * <math>P</math> 表示容忍 * <math>\land</math> 表示逻辑与 * <math>\lor</math> 表示逻辑或 == 最佳实践 == 1. 为专用节点(如GPU、高内存)添加污点 2. 避免使用<code>Exists</code>操作符容忍所有污点 3. 谨慎使用<code>NoExecute</code>效果,可能导致Pod被驱逐 4. 结合节点亲和性使用实现更精细的调度控制 5. 为系统组件(如DaemonSet)配置适当的容忍 == 常见问题 == '''Q: 如何查看节点的所有污点?''' <syntaxhighlight lang="bash"> kubectl get nodes -o jsonpath='{range .items[*]}{.metadata.name}{"\t"}{.spec.taints[*].key}{"\n"}{end}' </syntaxhighlight> '''Q: 为什么我的Pod没有被调度到有污点的节点?''' 检查: 1. Pod是否配置了正确的容忍 2. 污点和容忍的键、值、效果是否匹配 3. 节点是否有其他限制(如资源不足) '''Q: NoSchedule和NoExecute有什么区别?''' * <code>NoSchedule</code>只影响新Pod调度 * <code>NoExecute</code>还会驱逐已运行但不匹配的Pod == 总结 == Kubernetes的污点与容忍机制提供了强大的Pod调度控制能力,特别适合: * 专用硬件管理 * 节点隔离和维护 * 特殊工作负载调度 * 多租户环境隔离 通过合理使用这一机制,可以优化集群资源利用率并确保工作负载在合适的节点上运行。 [[Category:集成部署]] [[Category:Kubernetes]] [[Category:Kubernetes资源管理]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)