k8s之亲和性和反亲和性
一、亲和性和反亲和性
1.概述
k8s的亲和性(Affinity)是一种用于控制 Pod 调度的机制,它允许你指定 Pod 如何与节点进行互动,以便将 Pod 调度到合适的节点上。
2.类型
-
节点亲和性 nodeAffinity
根据用户的设置,选择性的根据节点来部署pod。
-
pod亲和性 podAffinity
根据pod的标签和拓扑域来选择性部署pod到节点上。
-
pod反亲和性 podAntiAffinity
Pod 反亲和性用于将新 Pod 安排到与具有特定标签的现有 Pod 不同的节点上,这有助于实现高可用性和故障隔离。
3.软策略和硬策略
-
软策略
preferredDuringSchedulingIgnoredDuringExecution
可以根据设置的偏好,尽量的满足设置需求,如果没有节点能够满足偏好设置,依然可以部署。
-
硬策略
requiredDuringSchedulingIgnoredDuringExecution
必须把pod调度到满足偏好设置的节点,如果没有节点满足条件,pod会pending,不会部署到其他节点。
4.键值的运算关系
根据相应的条件来匹配节点或者是pod的标签
-
In (在)
选择的标签值要匹配到节点或者是pod。字符串匹配,也可以是数字。
-
NotIn (不在)
选择的标签值不在节点或者是pod。字符串匹配,也可以是数字。
-
Gt (大于)
只能比较数字。
-
Lt (小于)
只能比较数字。
-
Exists (存在)
只是用来判断标签的key,和value无关。
-
DoesNotExist (不存在)
只是用来判断不存在标签的key,和value无关。
5.实例
节点亲和性
kubectl label nodes node01 test1=a #给节点增加标签
pod亲和性
topologyKey 定义节点拓扑关系的字段
topologyKey:test1
test1的标签作为拓扑的关键词
该节点上必须同时满足app=nginx2和标签test1
pod反亲和性
节点亲和性是非容忍性:如果是硬策略,必须满足条件才可以部署
pod的亲和以及反亲和(容忍性):虽然...但是满足了一定的条件,还是可以继续部署的(硬策略)
node01有app=nginx2,node02没有app=...,node01的标签是test1=a, node02的标签无
反亲和性的策略要求不能app=nginx1,node01满足了一个条件就可以创建pod,node02满足了两个条件既没有app=nginx1又没有标签所以也可以创建pod,反之如果两个条件都不满足,则pod进入pending状态
二、 污点
1.概述
污点和节点的亲和性正好相反,节点亲和性是为吸引特定的pod,但是污点是为了排斥pod。
2.污点类型
-
NoSchedule
节点上有此污点的标签,K8s不会把pod调度到这和,但是已部署的pod不受影响。
一般是设置在主节点上,防止pod部署到主节点(主节点的资源比较小,就是用来控制集群的)。
-
PreferNoSchedule
尽量避免把pod部署到该节点上,但是也可以部署。
多主节点的情况下,主节点可以满足部署的情况,为了平衡其他的节点的负载,把matser作为部署的节点,但是优先级相对较低。
-
NoExecute
不仅会不部署到该节点,而且还会驱逐该节点上已有的pod。
节点出现故障,节点需要维护,但为了保证业务不中断,于是选择这种方法把pod迁移到其他的节点,保证业务正常运行。
3.命令行
kubectl describe node master01 | grep -i taints #查看master01上面的污点
kubectl taint node node01 test1=a:PreferNoSchedule #新增node01上面的污点
kubectl taint node node01 test1=a:PreferNoSchedule- #删除污点
设置节点的污点只能在命令行完成,不能在yaml执行。