Kubernetes 配置 Taint 和 Toleration(污点和容忍)
通过污点和容忍让pod运行在特定节点上
参考官网:https://k8smeetup.github.io/docs/concepts/configuration/taint-and-toleration/
1、taint 排斥效果
taint的effect定义对Pod排斥效果:
NoSchedule:仅影响调度过程,对现存的Pod对象不产生影响;但容忍的pod同时也能够被分配到集群中的其它节点
NoExecute:既影响调度过程,也影响现在的Pod对象;不容忍的Pod对象将被驱逐
PreferNoSchedule:NoSchedule的柔性版本,最好别调度过来,实在没地方运行调过来也行
2、添加污点
给 worker1,worker2,worker3 三个节点添加污点
kubectl taint node rancher-k8s-worker1 item-name=assistant:NoExecute
kubectl taint node rancher-k8s-worker2 item-name=sca:NoExecute
kubectl taint node rancher-k8s-worker3 item-name=kuiyuan:NoExecute
说明:
1)给 worker1 节点设置 key 为 item-name,value 为 assistant 的 taint(污点),只要拥有和这个 taint 相匹配的 toleration(容忍) 的 pod 才能够被分配到 worker1 这个节点上。worker2 和 worker3 同理。
2)taint 的 effect 值 NoExecute ,它会影响已经在节点上运行的 pod :
如果 pod 不能忍受effect 值为 NoExecute 的 taint,那么 pod 将马上被驱逐
如果 pod 能够忍受effect 值为 NoExecute 的 taint,但是在 toleration 定义中没有指定 tolerationSeconds,则 pod 还会一直在这个节点上运行。
如果 pod 能够忍受effect 值为 NoExecute 的 taint,而且指定了 tolerationSeconds,则 pod 还能在这个节点上继续运行这个指定的时间长度。
附:删除污点命令
kubectl taint node rancher-k8s-worker1 item-name-
kubectl taint node rancher-k8s-worker2 item-name-
kubectl taint node rancher-k8s-worker3 item-name-
3、pod添加容忍
分别在三个节点上运行对应容忍的pod。
1)pod 定义 toleration,匹配 key 为 item-name,value 为 assistant 的 taint
cat > nginx-assistant.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-assistant
labels:
app: nginx-assistant
spec:
containers:
- name: nginx-assistant
image: nginx
resources:
limits:
cpu: 30m
memory: 20Mi
requests:
cpu: 20m
memory: 10Mi
tolerations:
- key: item-name
value: assistant
operator: Equal
effect: NoExecute
EOF
2)pod 定义 toleration,匹配 key 为 item-name,value 为 sca 的 taint
cat > nginx-sca.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-sca
labels:
app: nginx-sca
spec:
containers:
- name: nginx-sca
image: nginx
resources:
limits:
cpu: 30m
memory: 20Mi
requests:
cpu: 20m
memory: 10Mi
tolerations:
- key: item-name
value: sca
operator: Equal
effect: NoExecute
EOF
3)pod 定义 toleration,匹配 key 为 item-name,value 为 kuiyuan 的 taint
cat > nginx-kuiyuan.yaml <<EOF
apiVersion: v1
kind: Pod
metadata:
name: nginx-kuiyuan
labels:
app: nginx-kuiyuan
spec:
containers:
- name: nginx-kuiyuan
image: nginx
resources:
limits:
cpu: 30m
memory: 20Mi
requests:
cpu: 20m
memory: 10Mi
tolerations:
- key: item-name
value: kuiyuan
operator: Equal
effect: NoExecute
EOF
#创建pod
kubectl apply -f ./
4、查看 pod 运行主机
kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-79748b4cb-25cqr / Running 111s 10.42.10.25 rancher-k8s-worker4 <none> <none>
nginx-79748b4cb-tnknc / Running 107s 10.42.10.26 rancher-k8s-worker4 <none> <none>
nginx-79748b4cb-xpx76 / Running 101s 10.42.10.27 rancher-k8s-worker4 <none> <none>
nginx-assistant 1/1 Running 0 33m 10.42.4.246 rancher-k8s-worker1 <none> <none>
nginx-kuiyuan 1/1 Running 0 33m 10.42.5.239 rancher-k8s-worker3 <none> <none>
nginx-sca 1/1 Running 0 33m 10.42.3.203 rancher-k8s-worker2 <none> <none>
可以看到三个pod都运行到了对应的节点上,而未定义容忍度的 nginx 的三个pod都被驱逐到了worker4上。(如果没有匹配到对应的污点,则会调度到未配置污点的节点上)
5、基于 taint 的驱逐(alpha 特性)
这是在每个 pod 中配置的在节点出现问题时的驱逐行为。
1)当某种条件为真时,node controller会自动给节点添加一个 taint。
当前内置的 taint 包括:
node.kubernetes.io/not-ready:节点未准备好。这相当于节点状态 Ready 的值为 “False“。
node.alpha.kubernetes.io/unreachable:node controller 访问不到节点. 这相当于节点状态 Ready 的值为 “Unknown“。
node.kubernetes.io/out-of-disk:节点磁盘耗尽。
node.kubernetes.io/memory-pressure:节点存在内存压力。
node.kubernetes.io/disk-pressure:节点存在磁盘压力。
node.kubernetes.io/network-unavailable:节点网络不可用。
node.cloudprovider.kubernetes.io/uninitialized:如果 kubelet 启动时指定了一个 “外部” cloud provider,它将给当前节点添加一个 taint 将其标志为不可用。在 cloud-controller-manager 的一个 controller 初始化这个节点后,kubelet 将删除这个 taint。
在启用了 TaintBasedEvictions 这个 alpha 功能特性后,NodeController 会自动给节点添加这类 taint,上述基于节点状态 Ready 对 pod 进行驱逐的逻辑会被禁用。
注意:为了保证由于节点问题引起的 pod 驱逐rate limiting行为正常,系统实际上会以 rate-limited 的方式添加 taint。在像 master 和 node 通讯中断等场景下,这避免了 pod 被大量驱逐。使用这个 alpha 功能特性,结合 tolerationSeconds ,pod 就可以指定当节点出现一个或全部上述问题时还将在这个节点上运行多长的时间。
比如:可以查看之前创建的 nginx-assistant 的 tolerations:
kubectl describe nginx-assistant
Tolerations: item-name=assistant:NoExecute
node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
除了我们定义的容忍匹配的 taint 外,还默认匹配了 not-ready,unreachable 这两个 taint,并且指定 tolerationSeconds 为 5 分钟。这种自动添加 toleration 机制保证了在其中一种问题被检测到时 pod 默认能够继续停留在当前节点运行 5 分钟;这两个默认 toleration 是由 DefaultTolerationSeconds admission controller添加的。
另外:我们可以指定这个时间,在网络断开时,仍然希望停留在当前节点上运行一段较长的时间,愿意等待网络恢复以避免被驱逐。在这种情况下,pod 的 toleration 可能是下面这样的:
tolerations:
- key: "node.alpha.kubernetes.io/unreachable"
operator: "Exists"
effect: "NoExecute"
tolerationSeconds: 6000
2)DaemonSet 中的 pod 被创建时,针对 taint 自动添加的 NoExecute 的 toleration 将不会指定 tolerationSeconds。
比如:系统pod(canal,dns等)不会指定 tolerationSeconds
kubectl describe pod/canal-75pct -n kube-system
Tolerations: :NoSchedule
:NoExecute
CriticalAddonsOnly
node.kubernetes.io/disk-pressure:NoSchedule
node.kubernetes.io/memory-pressure:NoSchedule
node.kubernetes.io/network-unavailable:NoSchedule
node.kubernetes.io/not-ready:NoExecute
node.kubernetes.io/unreachable:NoExecute
node.kubernetes.io/unschedulable:NoSchedule
这保证了出现上述问题时 DaemonSet 中的 pod 永远不会被驱逐,这和 TaintBasedEvictions 这个特性被禁用后的行为是一样的。
Kubernetes 配置 Taint 和 Toleration(污点和容忍)的更多相关文章
- Kubernetes之Taints与Tolerations 污点和容忍
NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上,而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod. Taints(污 ...
- kubernetes(k8s)Pod污点与容忍
污点(taints)与容忍(tolerations) 对于nodeAffinity无论是硬策略还是软策略方式,都是调度 pod 到预期节点上,而Taints恰好与之相反,如果一个节点标记为 Taint ...
- Kubernetes高级调度- Taint和Toleration、Node Affinity分析
此文分享了污点和Node Affinity实际使用过程中的细节.坑和思维误区.同时整理且回答了诸多细节问题,尤其那些在官方文档中不曾提及的细节. 阅读提示:文中的节点指Node (避免Pod和Node ...
- Kubernetes对Pod调度指定Node以及Node的Taint 和 Toleration
由于博客园不支持markdown,推荐以下url阅读: 原创url:https://blog.csdn.net/weixin_42495873/article/details/103364868 ## ...
- Kubernetes 调度 - 污点和容忍度详解
当我们使用节点亲和力(Pod 的一个属性)时,它会将Pod吸引到一组节点(作为偏好或硬性要求).污点的行为完全相反,它们允许一个节点排斥一组 Pod. 在 Kubernetes 中,您可以标记(污染) ...
- Kubernetes的污点和容忍(下篇)
背景 继上一篇<Kubernetes的污点和容忍(上篇)>,这是https://kubernetes.io/docs/concepts/configuration/taint-and-to ...
- 七、kubernetes污点和容忍
Kubernetes污点和容忍 一.Taint 和 Toleration介绍 节点亲和性,是 pod 的一种属性(偏好或硬性要求),它使 pod 被吸引到一类特定的节点.Taint 则相反,它使节点能 ...
- Kubernetes的污点和容忍(上篇)
背景 搭建了一个k8s(Kubernetes)的事件监听服务,监听事件之后对数据做处理.有天报了一个问题经调查是新版本的k8s集群添加会把unschedule等信息通过污点的方式反映.而这些污点是只有 ...
- 009.kubernets的调度系统之污点和容忍
Taints和Tolerations(污点和容忍) Taint需要与Toleration配合使用,让pod避开那些不合适的node.在node上设置一个或多个Taint后,除非pod明确声明能够容忍这 ...
随机推荐
- Python学习笔记(3)动态类型
is运算符 ==是值相等而is必须是相同的引用才可以 l=[1,2,3] m=[1,2,3] print(l==m) # True print(l is m) # False sys模块 getref ...
- Go:值类型、引用类型
值类型,变量存的就是值本身: in系列t.float系列.bool.string.数组和struct 引用类型,变量存的是一个地址,这是地址存的才是值本身: 指针.slice.map.chan.int ...
- Django加载静态文件失败,已解决
1.css文件以及js文件要放在static目录下,static和templates属于同级目录 2.在Django项目的同名项目文件的setting.py中,最后添加静态文件夹static目录路径 ...
- 洛谷 4768 LOJ 2718「NOI2018」归程
[题解] 本题有多种做法,例如可持久化并查集.kruskal重构树等. kruskal重构树的做法是这样的:先把边按照海拔h从大到小的顺序排序,然后跑kruskal建立海拔的最大生成树,顺便建krus ...
- [bzoj1005][HNOI2008][明明的烦恼] (高精度+prufer定理)
Description 自从明明学了树的结构,就对奇怪的树产生了兴趣......给出标号为1到N的点,以及某些点最终的度数,允许在任意两点间连线,可产生多少棵度数满足要求的树? Input 第一行为N ...
- AtCoder Beginner Contest 131 Solution
前言 这次ABC还是有一点难度的吧. TaskA Security Solution 直接模拟就好了. Code /* mail: mleautomaton@foxmail.com author: M ...
- 【Codeforces 382C】Arithmetic Progression
[链接] 我是链接,点我呀:) [题意] 让你在n个数字中再加入一个数字 使得这n+1个数字排序之后 相邻两个数字的差都相同 [题解] 注意相邻为0的情况 这种情况 只有全都相同才行 只有一种情况 然 ...
- Scala解析Json格式
Scala解析Json格式 代码块 Scala原生包 导入包 import scala.util.parsing.json._ def main(args: Array[String]): Unit ...
- POJ——1061 青蛙的约会
青蛙的约会 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 117858 Accepted: 24599 Descript ...
- 解DBA之惑:数据库承载能力评估及优化手段
原创 2016-08-29 韩锋 DBAplus社群 作者介绍 韩锋,宜信技术研发中心数据库架构师.精通多种关系型数据库,曾任职于当当网.TOM在线等公司,曾任多家公司首席DBA.数据库架构师等职 ...