【kubernetes】-6污点与污点容忍

污点与污点容忍

1、 污点(taint)

  • 污点是节点的属性,用于排斥一类特定的 Pod。
  • 通过污点,可以避免 Pod 被调度到不合适的节点上

污点组成

key=value:effect
  • key:污点的键。
  • value:污点的值(可为空)。
  • effect:污点的作用效果。

污点效果(effect)

效果描述
NoSchedule不会将 Pod 调度到具有该污点的节点上。
PreferNoSchedule尽量避免将 Pod 调度到具有该污点的节点上。
NoExecute不会将 Pod 调度到具有该污点的节点上,并驱逐节点上已有的 Pod。

2、操作命令

  • 设置污点
kubectl taint node <节点名称> <污点key>=<value>:<effect>
#示例
kubectl taint node node01 key1=value1:NoSchedule
  • 查看污点
kubectl describe node <node-name>
kubectl describe nodes <节点名称> | grep -A 5 Taints
  • 删除污点
kubectl taint node <节点名称> <污点key>:<effect>-

#示例
kubectl taint node node01 key1:NoSchedule-

3、污点容忍

  • 容忍是 Pod 的属性,允许 Pod 被调度到具有匹配污点的节点上。

容忍配置

在 Pod 的 YAML 文件中的 spec.tolerations 字段进行配置:

spec:
  tolerations:
  - operator: Equal|Exists
    key: <污点key>
    value: <污点value>
    effect: NoSchedule|PreferNoSchedule|NoExecute
	tolerationSeconds: 3600

字段说明:

字段描述
key污点的键,需与节点污点一致。
operator匹配操作符,Equal(值相等)或 Exists(存在即可,忽略值)。
value污点的值(operatorEqual 时需指定)。
effect污点的效果,需与节点污点一致。
tolerationSecondsPod 被驱逐前可在节点上继续运行的时间(仅对 NoExecute 有效)。

示例:

apiVersion: v1
kind: Pod
metadata:
  name: myapp01
  labels:
    app: myapp01
spec:
  containers:
  - name: with-node-affinity
    image: soscscs/myapp:v1
  tolerations:
  - key: "check"
    operator: "Equal"
    value: "mycheck"
    effect: "NoExecute"
    tolerationSeconds: 3600

应用场景

  1. 专用节点
    • 为某些节点设置污点,确保只有特定 Pod 可以调度到这些节点。
    • 示例:GPU 节点仅运行需要 GPU 的任务。
  2. 节点维护
    • 设置 NoExecute 污点,驱逐节点上的 Pod 以便维护。
  3. 高可用部署
    • 使用 NoSchedulePreferNoSchedule,确保 Pod 分散在不同节点上。

示例:

设置污点

kubectl taint node node01 check=mycheck:NoExecute

查看污点

kubectl describe node node01

创建容忍pod

kubectl apply -f pod-with-toleration.yaml

验证pod步骤

kubectl get pods -o wide

4、污点扩展

污点(Taints)注意事项

  1. 容忍所有污点 key

    • 当不指定 key 值时,使用 Exists 操作符可以容忍节点上的所有污点 key。
    tolerations:
    - operator: "Exists"
    
  2. 容忍所有污点作用

    • 当不指定 effect 值时,只要污点的 key 匹配,无论其作用(如 NoSchedule, PreferNoSchedule, NoExecute)是什么,都会被容忍。
    tolerations:
    - key: "key"
      operator: "Exists"
    
  3. 多 Master 节点设置

    • 在有多个 Master 节点的情况下,为了避免资源浪费,可以将 Master 节点设置为 PreferNoSchedule,这样默认情况下不会调度 Pod 到 Master 节点,但在必要时可以调度。
    kubectl taint node Master-Name node-role.kubernetes.io/master=:PreferNoSchedule
    

污点应用实例

  • 设置 NoExecute 污点

    • 当某个 Node 需要更新升级系统组件时,可以先在该 Node 上设置 NoExecute 污点,以驱逐该 Node 上的所有 Pod。
    kubectl taint node node01 check=mycheck:NoExecute
    
  • 临时设置 PreferNoSchedule 污点

    • 如果其他 Node 资源不足,可以临时将 Master 节点设置为 PreferNoSchedule,允许在必要时调度 Pod 到 Master 节点。
    kubectl taint node master node-role.kubernetes.io/master=:PreferNoSchedule --overwrite
    
  • 移除污点

    • 更新操作完成后,移除之前设置的污点。
    kubectl taint node node01 check=mycheck:NoExecute-  
    

节点维护操作

  1. 查看节点

    • 使用 kubectl get nodes 查看集群中的所有节点。
  2. 标记节点为不可调度

    • 使用 kubectl cordon <NODE_NAME> 将节点标记为不可调度状态,防止新创建的 Pod 调度到此节点。
    kubectl cordon <NODE_NAME>
    
  3. 驱逐节点上的 Pod

    • 使用 kubectl drain <NODE_NAME> 命令驱逐节点上的所有 Pod,并设置节点为不可调度状态。
    kubectl drain <NODE_NAME> --ignore-daemonsets --delete-emptydir-data --force
    
    • 参数解释:
      • --ignore-daemonsets:忽略 DaemonSet 管理的 Pod。
      • --delete-emptydir-data:强制删除挂载了本地卷的 Pod。
      • --force:强制驱逐非控制器管理的 Pod。
  4. 标记节点为可调度

    • 使用 kubectl uncordon <NODE_NAME> 将节点标记为可调度状态,允许新 Pod 调度到此节点。
    kubectl uncordon <NODE_NAME>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值