Kubernetes 亲和性、反亲和性、污点与容忍机制

1. 概述

在 Kubernetes(K8s)中,为了更好地控制 Pod 在集群中的调度,K8s 提供了 亲和性(Affinity)、反亲和性(Anti-Affinity)、污点(Taints)和容忍(Tolerations) 机制。这些机制可以帮助我们合理安排 Pod 运行的节点,优化资源利用率,提高系统稳定性。

2. 亲和性(Affinity)和反亲和性(Anti-Affinity)

2.1 亲和性(Node Affinity)

亲和性允许 指定 Pod 期望调度到某些特定的节点,通常基于节点的标签(Labels)。Kubernetes 提供了两种亲和性规则:

  • requiredDuringSchedulingIgnoredDuringExecution(硬性规则):Pod 必须 调度到符合条件的节点,否则不会被调度。
  • preferredDuringSchedulingIgnoredDuringExecution(软性规则):Pod 优先 调度到符合条件的节点,但如果没有符合的节点,也不会阻止调度。

示例:将 Pod 只调度到 zone=us-east-1 的节点上

apiVersion: v1
kind: Pod
metadata:
  name: affinity-example
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: zone
            operator: In
            values:
            - us-east-1
  containers:
  - name: my-container
    image: nginx

说明

  • key: zone:指定用于匹配的节点标签键。
  • operator: In:表示 zone 需匹配 values 列表中的值。
  • values: [us-east-1]:只有 zone=us-east-1 的节点才符合条件。

2.2 反亲和性(Pod Anti-Affinity)

反亲和性(Pod Anti-Affinity)用于 避免特定的 Pod 运行在相同的节点上,通常用于高可用性(HA)部署。

示例:确保 Pod 分布在不同的节点上,避免单点故障

apiVersion: apps/v1
kind: Deployment
metadata:
  name: anti-affinity-example
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  app: my-app
              topologyKey: kubernetes.io/hostname
      containers:
      - name: my-container
        image: nginx

说明

  • labelSelector.matchLabels:用于匹配 Pod 标签。
  • topologyKey: kubernetes.io/hostname:表明 Pod 不能运行在相同的节点。
  • requiredDuringSchedulingIgnoredDuringExecution:强制规则,必须执行。

3. 污点(Taints)与容忍(Tolerations)

3.1 污点(Taints)

污点(Taint)用于 标记节点,使特定 Pod 无法调度到该节点上,除非 Pod 具有相应的容忍(Toleration)。常用于隔离工作负载,例如:

  • 预留节点给特定类型的应用(如专门用于 AI 训练的 GPU 计算节点)。
  • 保护核心服务,防止不必要的 Pod 占用资源。

添加污点到节点

kubectl taint nodes node1 key=value:NoSchedule

说明

  • key=value:污点的键值对。
  • NoSchedule:表示 K8s 不会调度新的 Pod 到该节点,除非 Pod 具有相应的 toleration

3.2 容忍(Tolerations)

容忍(Toleration)用于 允许 Pod 运行在带有特定污点的节点上

示例:让 Pod 可以运行在 key=value:NoSchedule 的污点节点上

apiVersion: v1
kind: Pod
metadata:
  name: toleration-example
spec:
  tolerations:
  - key: "key"
    operator: "Equal"
    value: "value"
    effect: "NoSchedule"
  containers:
  - name: my-container
    image: nginx

说明

  • key: "key":指定容忍的污点键。
  • operator: "Equal":表示 key 必须匹配 value
  • effect: "NoSchedule":表示该 Pod 可以调度到带有 NoSchedule 污点的节点。

4. 相关配置参数说明

亲和性 & 反亲和性参数

参数 说明
key 需要匹配的标签键
operator 匹配运算符(InNotInExistsDoesNotExist
values 需要匹配的值(仅 InNotIn 适用)
topologyKey 影响调度的拓扑键(如 kubernetes.io/hostname
requiredDuringSchedulingIgnoredDuringExecution 必须满足的硬性规则
preferredDuringSchedulingIgnoredDuringExecution 尽量满足的软性规则

污点 & 容忍参数

参数 说明
key 污点的键(Label Key)
value 污点的值
effect 污点的影响(NoSchedulePreferNoScheduleNoExecute
operator 匹配方式(EqualExists

5. 总结

  • 亲和性和反亲和性 控制 Pod 选择哪些节点进行调度。
  • 污点和容忍 允许管理员 限制某些 Pod 运行在特定的节点上,提高资源管理灵活性。
  • 这些调度机制可以 结合使用,提高 Kubernetes 集群的稳定性和资源利用率。

在生产环境中,可以根据业务需求 合理设置亲和性、反亲和性、污点和容忍机制,以优化 Kubernetes 集群的调度策略。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容