K8s污点(Taint)与容忍(Toleration)介绍

污点和容忍是Kubernetes调度机制的核心组成部分,用于控制Pod在节点上的部署逻辑。污点是节点属性,用于标记节点拒绝某些Pod;容忍是Pod属性,允许Pod调度到带有特定污点的节点上。

  • 污点(Taint)

    • 由键(key)、值(value)和效果(effect)组成,格式为 key=value:effect
    • 效果分为三类:
      • NoSchedule:禁止调度(已运行的Pod不受影响)。
      • PreferNoSchedule:尽量避免调度。
      • NoExecute:禁止调度且驱逐已运行但不满足容忍的Pod。
  • 容忍(Toleration)

    • 定义在Pod的spec.tolerations中,匹配节点的污点以实现调度。
    • 支持精确匹配(keyvalueoperator: Equal)或模糊匹配(operator: Exists)。

典型应用案例

  1. 专用节点隔离

    • 节点标记污点:
      kubectl taint nodes node1 dedicated=teamA:NoSchedule
      
    • 仅允许特定Pod(如TeamA的服务)容忍该污点:
      tolerations:
      - key: "dedicated"
        operator: "Equal"
        value: "teamA"
        effect: "NoSchedule"
      
  2. GPU节点调度

    • 节点标记污点:
      kubectl taint nodes gpu-node hardware=gpu:NoSchedule
      
    • GPU工作负载Pod需添加对应容忍:
      tolerations:
      - key: "hardware"
        operator: "Equal"
        value: "gpu"
        effect: "NoSchedule"
      
  3. 节点维护驱逐

    • 维护前标记节点为NoExecute
      kubectl taint nodes node2 maintenance=yes:NoExecute
      
    • 关键Pod添加容忍以避免被驱逐:
      tolerations:
      - key: "maintenance"
        operator: "Exists"
        effect: "NoExecute"
      

核心用途

  • 资源隔离:将节点专用于特定团队或任务(如机器学习、数据库)。
  • 硬件调度:确保Pod运行在具备特殊硬件的节点(如GPU、SSD)。
  • 节点维护:优雅驱逐Pod或保留关键服务。
  • 故障隔离:通过污点标记问题节点,限制Pod调度。

注意事项

  • 权限控制:污点操作需管理员权限,避免误操作导致调度问题。
  • 容忍过度:滥用容忍可能导致Pod调度到不合适的节点(如资源不足)。
  • 效果选择
    • NoExecute需谨慎使用,可能触发Pod大规模驱逐。
    • PreferNoSchedule适合软性约束场景。
  • 默认容忍:Kubernetes会自动为部分系统组件(如DaemonSet)添加容忍,无需手动配置。

调试技巧

  • 查看节点污点:
    kubectl describe node <node-name> | grep Taints
    
  • 模拟调度结果:
    kubectl describe pod <pod-name> | grep -A10 Tolerations
    
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐