跳转到内容

Kubernetes节点亲和性

来自代码酷
Admin留言 | 贡献2025年5月1日 (四) 22:19的版本 (Page creation by admin bot)

(差异) ←上一版本 | 已核准修订 (差异) | 最后版本 (差异) | 下一版本→ (差异)

Kubernetes节点亲和性[编辑 | 编辑源代码]

节点亲和性(Node Affinity)是Kubernetes中一种调度机制,允许用户指定Pod应该运行在哪些节点上。它通过定义规则来匹配节点的标签(Labels),从而影响Pod的调度决策。节点亲和性提供了比传统的nodeSelector更灵活、更强大的控制方式,支持复杂的逻辑表达式和软性约束(preferred)与硬性约束(required)。

基本概念[编辑 | 编辑源代码]

节点亲和性通过两种主要方式实现:

  • requiredDuringSchedulingIgnoredDuringExecution(硬性规则):Pod必须部署在满足条件的节点上,否则无法调度。
  • preferredDuringSchedulingIgnoredDuringExecution(软性规则):调度器优先选择满足条件的节点,但不强制。

节点亲和性 vs. nodeSelector[编辑 | 编辑源代码]

特性 nodeSelector 节点亲和性
语法复杂度 简单键值匹配 支持复杂表达式(In、NotIn、Exists等)
约束类型 仅硬性约束 支持硬性和软性约束
灵活性

语法与示例[编辑 | 编辑源代码]

节点亲和性规则在Pod的spec.affinity.nodeAffinity字段中定义。

硬性约束示例[编辑 | 编辑源代码]

以下示例要求Pod必须运行在带有标签disktype=ssd的节点上:

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

软性约束示例[编辑 | 编辑源代码]

以下示例优先选择带有gpu=true标签的节点,但不强制:

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

运算符说明[编辑 | 编辑源代码]

Kubernetes支持以下运算符:

  • In:标签值在指定列表中
  • NotIn:标签值不在指定列表中
  • Exists:节点必须包含该标签(不检查值)
  • DoesNotExist:节点不得包含该标签
  • GtLt:数值比较(适用于整数标签)

实际案例[编辑 | 编辑源代码]

场景:混合环境调度[编辑 | 编辑源代码]

假设集群中有以下节点:

  • 节点A:env=prod, zone=us-east-1
  • 节点B:env=dev, zone=us-west-2

需要将生产环境的Pod调度到env=prod且区域为us-east-1us-east-2的节点:

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
      - matchExpressions:
        - key: env
          operator: In
          values: ["prod"]
        - key: zone
          operator: In
          values: ["us-east-1", "us-east-2"]

权重分配示例[编辑 | 编辑源代码]

pie title 软性约束权重分配 "gpu=true (Weight 80)" : 80 "ssd=true (Weight 20)" : 20

对应YAML配置:

preferredDuringSchedulingIgnoredDuringExecution:
- weight: 80
  preference:
    matchExpressions:
    - key: gpu
      operator: In
      values: ["true"]
- weight: 20
  preference:
    matchExpressions:
    - key: ssd
      operator: In
      values: ["true"]

数学表达[编辑 | 编辑源代码]

软性约束的最终节点评分计算公式: NodeScore=i=1n(weighti×matchi) 其中:

  • matchi 为1(匹配)或0(不匹配)
  • weighti 是用户定义的权重值

最佳实践[编辑 | 编辑源代码]

1. 硬性约束可能导致Pod无法调度,建议与软性约束结合使用 2. 避免过度使用节点亲和性,可能降低集群利用率 3. 结合Pod间亲和性(Pod Affinity)实现更复杂的调度策略 4. 使用kubectl describe nodes查看节点标签

常见问题[编辑 | 编辑源代码]

Q:节点亲和性与污点/容忍度有什么区别?

  • 节点亲和性是"吸引"Pod到特定节点
  • 污点/容忍度是"排斥"Pod从特定节点

Q:如何检查节点标签?

kubectl get nodes --show-labels