Taints and Tolerations

node affnity是一种pod选择node的资源(表述倾向或者强制约束),taint是相反的,taint和toleration协同工作从而防止pod调度到不恰当的节点名上面,一个或多个taint可以被应用到node上面,标记了node不接收那些不能容忍这些污点的pod,耐受应用于pod,允许pods调度到有污点的节点上面
使用 kubectl命令给node添加污点
kubectl taint nodes node1 key=value:NoSchedule
给node1添加了一个taint,taint包含键 key 值 value,和一个taint effect noschedule,这意味着pod不能调度到这个节点上面除非pod包含一个合适的toleraction,指定tolerations在pod 的podspec字段,下面的两个tolertion都匹配了上面创建的taint,因此包含下面任意toleraction的pod都可以被调度到node1


tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"
tolerations:
- key: "key"
  operator: "Exists"
  effect: "NoSchedule"
一个toleraction 匹配一个raint如果keys相同并且effects也是一样的,operator 为Exists(在这种情况不能指定value),当operator为Equal时value必须指定,在operator默认为equal
注:
一个空的key并且operator为exists 匹配所有的key和value effects意味着容忍所有
tolerations:
- operator: "Exists"
空的effect意味匹配所有具有该key的effect
tolerations:
- key: "key"
  operator: "Exists"
这上面的例子使用 noschedule的effect类型,另外你可以使用 prefernoscheduler ,这是一种倾向火软限制版本的noschdule,系统将尽可能把pod放在不能容忍的节点上,但是非必要


第三种effect noexecute 稍后介绍
你可以将多种taint添加到同一个node上面,也可以将多个roleraction在相同的pod,k8s处理多个taints和toleraction的方式类似一个filter,从所有的taints开始,然后忽略已经匹配到的toleraction,剩余没有被忽略的taint将被标明,特殊情况:
如果包含一个未被忽略的taint effect为noschedule,该pod将不会被调度到这个pod


如果包含noscheduler也包含prefernoscheduler k8s将试图将pod调度到该node


如果未被忽略的taint包含noexecute 该pod将被驱逐




例如
kubectl taint nodes node1 key1=value1:NoSchedule
kubectl taint nodes node1 key1=value1:NoExecute
kubectl taint nodes node1 key2=value2:NoSchedule
创建一个包含两个roleractions的pod


tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoSchedule"
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoExecute
在这个例子中pod无法调度到node上面因为没有roleraction匹配第三个taint,任何包含tolerate 该taint的pod将不会被驱逐,一个noexecute的effect可以设置一个时间参数,


tolerations:
- key: "key1"
  operator: "Equal"
  value: "value1"
  effect: "NoExecute"
  tolerationSeconds: 3600
意味着如果一个pod运行在一个匹配的污点node上面,这个pod奖杯保持3600秒,然后被驱逐,如果这个taint被移除在驱逐之前,这个pod不会被驱逐


用例说明:
1.专用节点
2.节点包含特殊硬件
3.基于污点的驱逐 每个节点可以配置驱逐行为当节点出问题的时候


前面我们提到的noexecute taint作用,从而影响pods已经运行在节点如下
1.pod没有配置tolerate奖杯立即驱逐

2.包含驱逐时间的将会到驱逐时间后驱逐



kubeadm 启动的master包含

taints:
    - effect: NoSchedule
      key: node-role.kubernetes.io/master
      timeAdded: null

kubectl taint nodes --all node-role.kubernetes.io/master- 

手动添加

kubectl taint node node1 node-role.kubernetes.io/master="":NoSchedule



### 如何在 Jenkins Cloud 环境下配置 Pod Labels #### 配置云环境中的 Kubernetes 插件 为了使 Jenkins 能够识别并利用特定的 Pod 进行构建作业,在配置 Kubernetes 作为云提供商时,需指定 Pod 的标签 (Labels),以便于调度合适的 Pod 来执行任务。 通过进入 Jenkins 的“系统管理”下的“节点管理和云配置”,找到“Configure Clouds”。在此界面中点击“Add a new cloud”,选择“Kubernetes”。 #### 设置 Pod Labels 参数 在添加新的 Kubernetes 云配置过程中,有一个重要的部分就是定义 **Pod Templates**。在这个模板里可以设定多个容器以及它们各自的属性。对于想要应用到整个 Pod 上面的元数据,则可以在高级选项里面填写 `Pod Labels` 字段[^3]: - 输入自定义键值对来标记这些由 Jenkins 启动用于运行工作的 Pods。 例如,如果希望给所有的 CI/CD 流水线使用的 Pod 添加一个名为 `role=ci-cd-worker` 的标签,那么就在相应的输入框内填入此字符串形式的内容:“`role=ci-cd-worker`”。 这样做的目的是为了让 Kubernetes Scheduler 可以根据预先设定好的 Node Selector 或 Taints and Tolerations 更精确地安排资源位置;同时也方便后续运维人员查找和管理相关联的工作负载实例。 ```yaml apiVersion: v1 kind: Pod metadata: labels: role: "ci-cd-worker" spec: containers: - name: jnlp-container image: jenkins/inbound-agent ``` 一旦完成上述操作之后保存更改即可生效。每当触发一次流水线执行的时候,Jenkins 就会按照所设条件请求带有匹配标签的新建临时性的 Slave Nodes(Pods) 来处理具体的编译部署等工作流程环节[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值