污点和容忍度
在Kubernetes中,污点(Taints)和容忍度(Tolerations)是用于调度Pod到节点的机制,这在多租户环境下特别有用。污点是对节点的标记,用于指示节点上的某些特性或限制,而容忍度是 Pod 对这些污点的容忍程度,即它们能够容忍在拥有特定污点的节点上运行。
亲和性(Affinity),是pod的一种属性。一种是节点亲和性(Node Affinity):节点亲和性用于指定Pod应该被调度到哪些节点上。它可以根据节点的标签或其他属性进行定义,以确保 Pod 被调度到符合条件的节点上。一种是Pod亲和性(Pod Affinity):Pod亲和性用于指 Pod应该被调度到已经运行着特定类型的Pod的节点上。Pod会被调度到与指定类型的Pod所在的节点相似的节点上,从而使这些Pod彼此之间更加接近,以便实现协同工作。
节点亲和性使Pod被部署到特定的节点,污点(Taints)则相反,它使节点能够排斥一类特定的Pod。污点(Taints)和容忍度(Tolerations)相互配合可以避免Pod被部署到不适合的节点。每个节点上都可以应用一个或多个taint ,这表示对于那些不能容忍这些Taints的pod,是不会被该节点接受的。如果将Tolerations应用于Pod 上,则表示这些Pod 可以(但不要求)被调度到具有匹配Taints的节点上。
污点和容忍度是相互匹配的关系,我们在node上定义一个污点(Taints),如果Pod能够容忍(Tolerations)这个污点(Taints)那么他就会部署到这个节点,如果不能够容忍(Tolerations)这个污点(Taints)他就不能被部署到这个节点上。
污点
我们为什么不能够把Pod部署到Mater节点:
kubectl describe nodes master
kubectl get nodes -o jsonpath='{range .items[*]}{"Node: "}{.metadata.name}{"\nTaints: "}{.spec.taints[*]}{"\n\n"}{end}'
通过上面两个命令都可以查看污点
[root@master ~]# kubectl get nodes -o jsonpath='{range .items[*]}{"Node: "}{.metadata.name}{"\nTaints: "}{.spec.taints[*]}{"\n\n"}{end}'
Node: master
Taints: {"effect":"NoSchedule","key":"node-role.kubernetes.io/control-plane"}
Node: node01
Taints:
Node: node02
Taints:
mastar节点有一个NoSchedule的污点,这导致Pod不能被部署到master上。
把Pod部署到master节点
- Tolerations(容忍度):您可以在Pod的YAML文件中定义一个与主节点污点匹配的容忍度规则,以允许Pod被调度到带有 NoSchedule污点的节点上。
- NodeAffinity(节点亲和性):您可以使用节点亲和性规则,指定Pod要求调度到具有指定标签的节点上,从而选择带有 NoSchedule污点的主节点。
- 个人理解:先有容忍度后有亲和性,如果Pod不能容忍污点,那它就不能使用亲和性去调度到有该污点的node上。在Pod调度的时候要先处理污点和容忍度的关系,在考虑亲和性的调度。
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-dy
labels:
web: nginx
namespace: default
spec:
minReadySeconds: 10
#新创建的Pod成为就绪状态之前,Deployment控制器等待的最短时间(秒数)。确保Pod中的业务程序能正常工作之前有做狗的时候完成初始化和准备工作。
paused: false
progressDeadlineSeconds: 60
#该字段用于指定部署操作的进度检查的超时时间(以秒为单位)。这个字段的作用是为了确保部署操作能够在指定的时间内完成,并在超时后进行相应的处理。
replicas: 2
revisionHistoryLimit: 5
#该用于指定要保留的 Deployment 版本历史记录的最大数量。Deployment 版本历史记录包含了过去创建的每个 Deployment 的详细信息,包括创建时间、更新时间、副本数量等。
#如果设置为 0,则不会保留任何历史记录;如果设置为负值,则表示将保留所有历史记录。
selector:
matchLabels:
ser: nginx-test
strategy:
#定义滚动更新策略
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
name: nginx
#namespeace
labels:
ser: nginx-test
spec:
nodeSelector:
app: to
hostname: nginx-dy
tolerations:
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
#配置容忍度部署到master节点
affinity:
nodeAffinity:
#requiredDuringSchedulingIgnoredDuringExecution:
#这种类型的节点亲和性规则是必需的,它指定了Pod被调度时必须满足的节点亲和性条件。如果无法满足这些条件,则调度器不会将Pod调度到任何节点上。
preferredDuringSchedulingIgnoredDuringExecution:
#这种类型的节点亲和性规则是首选的,它指定了 Pod 首选被调度到的节点亲和性条件。如果满足这些条件,调度器会尽量将Pod调度到满足条件的节点上,
#但如果无法满足,则会选择其他节点
- weight: 1
preference:
matchExpressions:
- key: node-role.kubernetes.io/control-plane
operator: In
values:
- NoSchedule
containers:
- image: docker.io/library/nginx:v1
name: nginx-dy
imagePullPolicy: IfNotPresent
ports:
- name: nginx-post
containerPort: 80
查看资源对象:kubectl explain deployment.spec.template.spec.tolerations.effect,effect是一个字符串类型,定义Pod的容忍度规则,用于指定容忍度规则的生效效果。
- NoSchedule:表示如果节点上存在与规则匹配的污点,则不会将新的 Pod 调度到该节点上。最常见的情况。
- PreferNoSchedule:表示调度器会尽量避免将Pod调度到具有与规则匹配的污点的节点上,但不会严格遵守。如果没有其他可用的节点,则仍然会将Pod调度到这些节点上。
- NoExecute:表示除了不会调度新的Pod外,还会把节点上运行的Pod被删除或驱逐。这通常用于表示节点上已经存在的Pod需要被驱逐。这可以确保节点上的现有Pod不会受到污点的影响,并且可以按计划进行维护或清理工作。
查看资源对象:kubectl explain deployment.spec.template.spec.tolerations.key,key字段是容忍度规则中用于指定污点键的字段。污点键是用来标识节点上的污点的标识符。(污点是K/V形式的)
查看资源对象:kubectl explain deployment.spec.template.spec.tolerations.operator,operator字段用于指定容忍度规则中的操作符,用于定义容忍规则的匹配逻辑。(effect用于指定容忍度规则的生效效果)
- Exists:表示容忍度规则将匹配具有指定键的任何污点的节点。即使节点上的污点值不重要,只要节点上存在指定键的污点,规则就会匹配。
- Equal:表示容忍度规则将匹配具有指定键和指定值的污点。只有节点上的污点键和值与规则中指定的键和值完全匹配时,规则才会生效。
- NotEqual:表示容忍度规则将匹配不具有指定键或者具有指定键但值与规则中指定的值不匹配的污点。只有节点上的污点键与规则中指定的键相同但值不同,或者节点上没有指定键的污点时,规则才会生效。
- 其他操作符:
- “DoesNotExist”:如果指定的键不存在于节点的污点中,则匹配成功。
- “In”:如果指定的键的值在给定的值列表中,则匹配成功。
- “NotIn”:如果指定的键的值不在给定的值列表中,则匹配成功。
- “Gt”:如果指定的键的值大于给定的值,则匹配成功。
- “Lt”:如果指定的键的值小于给定的值,则匹配成功。
查看资源对象:kubectl explain deployment.spec.template.spec.tolerations.value,value字段在容忍度规则中用于指定匹配污点的值。在定义容忍度规则时,value字段通常与key字段一起使用,以确保规则匹配到具有指定键和指定值的污点。
亲和性(Affinity)
nodeAffinity
查看资源对象:kubectl explain deployment.spec.template.spec.affinity.nodeAffinity,nodeAffinity下面有两个参数:
requiredDuringSchedulingIgnoredDuringExecution(硬限制):
这种类型的节点亲和性规则是必需的,node节点必须满足指定的所有规则才可以。如果无法满足这
些条件,则调度器不会将Pod调度到任何节点上。
preferredDuringSchedulingIgnoredDuringExecution(软限制):
这种类型的节点亲和性规则是首选,优先调度到满足指定的规则的node。如果满足这些条件,
调度器会尽量将Pod调度到满足条件的节点上,但如果无法满足,则会选择其他节点
preferredDuringSchedulingIgnoredDuringExecution下有一个weight参数倾向权重。这个字段只在优选节点亲和性规则中使用。节点亲和性规则可以使用优选(Preferred)规则来定义。优选规则允许调度器尽量将Pod调度到满足规则的节点上,但如果没有满足条件的节点,则可以调度到其他节点上。weight 字段用于指定优选规则的权重,范围为1到 100,数值越高表示优选级别越高。
podAffinity
段用于指定Pod亲和性规则,即控制 Pod 如何被调度到具有特定标签的其他 Pod 所在的节点上。
- requiredDuringSchedulingIgnoredDuringExecution 规则表示 Pod 必须被调度到具有特定标签的其他 Pod 所在的节点上。如果没有满足条件的节点,则 Pod 不会被调度。
- preferredDuringSchedulingIgnoredDuringExecution 规则表示调度器会尽量将 Pod 调度到具有特定标签的其他 Pod 所在的节点上,但如果没有满足条件的节点,则可以调度到其他节点上,只不过会更倾向于选择满足规则的节点。
podAntiAffinity
字段用于指定Pod的反亲和性规则,即控制Pod不应该被调度到具有特定标签的其他Pod所在的节点上。
- requiredDuringSchedulingIgnoredDuringExecution规则表示Pod不应该被调度到具有特定标签的其他 Pod 所在的节点上。如果存在满足条件的节点,则Pod不会被调度。
- preferredDuringSchedulingIgnoredDuringExecution规则表示调度器会尽量避免将Pod调度到具有特定标签的其他Pod
所在的节点上,但如果没有满足条件的节点,则可以调度到其他节点上,只不过会更倾向于选择不满足规则的节点。
命令行补充
设置污点:kubectl taint nodes =:
kubectl taint nodes node01 app=web:NoSchedule
查看污点:kubectl describe node node01
[root@master taits]#
Taints: app=web:NoSchedule
删除污点:
删除某个污点:kubectl taint node node01 app:NoSchedule-
删除所有污点:kubectl taint node node01 app-