跳转到内容
主菜单
主菜单
移至侧栏
隐藏
导航
首页
最近更改
随机页面
MediaWiki帮助
代码酷
搜索
搜索
中文(中国大陆)
外观
创建账号
登录
个人工具
创建账号
登录
未登录编辑者的页面
了解详情
贡献
讨论
编辑“︁
Kubernetes节点亲和性
”︁
页面
讨论
大陆简体
阅读
编辑
编辑源代码
查看历史
工具
工具
移至侧栏
隐藏
操作
阅读
编辑
编辑源代码
查看历史
常规
链入页面
相关更改
特殊页面
页面信息
外观
移至侧栏
隐藏
您的更改会在有权核准的用户核准后向读者展示。
警告:
您没有登录。如果您进行任何编辑,您的IP地址会公开展示。如果您
登录
或
创建账号
,您的编辑会以您的用户名署名,此外还有其他益处。
反垃圾检查。
不要
加入这个!
= Kubernetes节点亲和性 = '''节点亲和性'''(Node Affinity)是Kubernetes中一种调度机制,允许用户指定Pod应该运行在哪些节点上。它通过定义规则来匹配节点的标签(Labels),从而影响Pod的调度决策。节点亲和性提供了比传统的'''nodeSelector'''更灵活、更强大的控制方式,支持复杂的逻辑表达式和软性约束(preferred)与硬性约束(required)。 == 基本概念 == 节点亲和性通过两种主要方式实现: * '''requiredDuringSchedulingIgnoredDuringExecution'''(硬性规则):Pod必须部署在满足条件的节点上,否则无法调度。 * '''preferredDuringSchedulingIgnoredDuringExecution'''(软性规则):调度器优先选择满足条件的节点,但不强制。 === 节点亲和性 vs. nodeSelector === {| class="wikitable" |- ! 特性 !! nodeSelector !! 节点亲和性 |- | 语法复杂度 || 简单键值匹配 || 支持复杂表达式(In、NotIn、Exists等) |- | 约束类型 || 仅硬性约束 || 支持硬性和软性约束 |- | 灵活性 || 低 || 高 |} == 语法与示例 == 节点亲和性规则在Pod的'''spec.affinity.nodeAffinity'''字段中定义。 === 硬性约束示例 === 以下示例要求Pod必须运行在带有标签'''disktype=ssd'''的节点上: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Pod metadata: name: nginx-ssd spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: disktype operator: In values: - ssd containers: - name: nginx image: nginx </syntaxhighlight> === 软性约束示例 === 以下示例优先选择带有'''gpu=true'''标签的节点,但不强制: <syntaxhighlight lang="yaml"> apiVersion: v1 kind: Pod metadata: name: nginx-gpu-preferred spec: affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: gpu operator: In values: - "true" containers: - name: nginx image: nginx </syntaxhighlight> == 运算符说明 == Kubernetes支持以下运算符: * '''In''':标签值在指定列表中 * '''NotIn''':标签值不在指定列表中 * '''Exists''':节点必须包含该标签(不检查值) * '''DoesNotExist''':节点不得包含该标签 * '''Gt'''、'''Lt''':数值比较(适用于整数标签) == 实际案例 == === 场景:混合环境调度 === 假设集群中有以下节点: * 节点A:'''env=prod, zone=us-east-1''' * 节点B:'''env=dev, zone=us-west-2''' 需要将生产环境的Pod调度到'''env=prod'''且区域为'''us-east-1'''或'''us-east-2'''的节点: <syntaxhighlight lang="yaml"> affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: env operator: In values: ["prod"] - key: zone operator: In values: ["us-east-1", "us-east-2"] </syntaxhighlight> === 权重分配示例 === <mermaid> pie title 软性约束权重分配 "gpu=true (Weight 80)" : 80 "ssd=true (Weight 20)" : 20 </mermaid> 对应YAML配置: <syntaxhighlight lang="yaml"> preferredDuringSchedulingIgnoredDuringExecution: - weight: 80 preference: matchExpressions: - key: gpu operator: In values: ["true"] - weight: 20 preference: matchExpressions: - key: ssd operator: In values: ["true"] </syntaxhighlight> == 数学表达 == 软性约束的最终节点评分计算公式: <math> \text{NodeScore} = \sum_{i=1}^{n} (\text{weight}_i \times \text{match}_i) </math> 其中: * <math>\text{match}_i</math> 为1(匹配)或0(不匹配) * <math>\text{weight}_i</math> 是用户定义的权重值 == 最佳实践 == 1. 硬性约束可能导致Pod无法调度,建议与软性约束结合使用 2. 避免过度使用节点亲和性,可能降低集群利用率 3. 结合'''Pod间亲和性'''(Pod Affinity)实现更复杂的调度策略 4. 使用'''kubectl describe nodes'''查看节点标签 == 常见问题 == '''Q:节点亲和性与污点/容忍度有什么区别?''' * 节点亲和性是"吸引"Pod到特定节点 * 污点/容忍度是"排斥"Pod从特定节点 '''Q:如何检查节点标签?''' <syntaxhighlight lang="bash"> kubectl get nodes --show-labels </syntaxhighlight> [[Category:集成部署]] [[Category:Kubernetes]] [[Category:Kubernetes资源管理]]
摘要:
请注意,所有对代码酷的贡献均被视为依照知识共享署名-非商业性使用-相同方式共享发表(详情请见
代码酷:著作权
)。如果您不希望您的文字作品被随意编辑和分发传播,请不要在此提交。
您同时也向我们承诺,您提交的内容为您自己所创作,或是复制自公共领域或类似自由来源。
未经许可,请勿提交受著作权保护的作品!
取消
编辑帮助
(在新窗口中打开)