#属性解析:如果第一条件满足不了,那就用第二条件,第二条件不满足,就用其他条件

发布时间:2026/7/19 5:42:53
#属性解析:如果第一条件满足不了,那就用第二条件,第二条件不满足,就用其他条件 kubectl apply -f scheduler-pod-affinity-redis-preferred.yaml#可以看到pod分布到多个节点复制代码[rootmaster1 scheduler]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATESpod-affinity-preferred-69bdd98999-6jlk6 1/1 Running 0 79s 10.244.1.152 node1.orgpod-affinity-preferred-69bdd98999-b88x4 1/1 Running 0 79s 10.244.3.194 node2.orgpod-affinity-preferred-69bdd98999-drqmw 1/1 Running 0 79s 10.244.3.195 node2.orgpod-affinity-preferred-69bdd98999-h8x78 1/1 Running 0 79s 10.244.1.151 node1.orgpod-affinity-preferred-69bdd98999-k2d8b 1/1 Running 0 79s 10.244.3.193 node2.orgpod-affinity-preferred-69bdd98999-zdpt7 1/1 Running 0 79s 10.244.3.196 node2.orgredis-preferred-5d76988d8-4zb8p 1/1 Running 0 79s 10.244.1.150 node1.org复制代码kubectl delete -f scheduler-pod-affinity-redis-preferred.yamlPod 反亲和性 podAntiAffinityPod 反亲和性说明所谓的反亲和其实就是满足条件就不能pod调度在一起与亲和正好相反注意反亲和的优化级低于NodeName反亲和功能:避免单点失败kubernetes 集群的节点分布在不同的区域或者不同的机房, 当服务A需要做冗余操作那么多个服务A必须在不同的位置Redis集群的Pod 分别部署至不同的节点避免资源竞争和冲突使用hostNetwork, 避免端口冲突Pod 反亲和性分为: 硬反亲和和软反亲和属性解析kubectl explain pod.spec.affinity.podAntiAffinity复制代码#硬反亲和requiredDuringSchedulingIgnoredDuringExecution #硬反亲和性labelSelector #选择跟哪组具有此标签的Pod反亲和namespaces #选择哪个命名空间进行匹配,如果namespace值为空,表示所有namespace,如果没有namespace表示当前namespacetopologyKey #指定节点上的哪个键做为同一位置的条件这是一个必选项#注意上面三个条件是一个逻辑与的关系#软反亲和preferredDuringSchedulingIgnoredDuringExecution #软反亲和性podAffinityTerm #与权重关联的亲和选项这是一个必选项labelSelectornamespacestopologyKeyweight #权重这是一个必选项#注意Pod反亲和性场景当应用服务A和数据库服务B要求尽量不要在同一台节点上的时候。复制代码Pod 反亲和性案例范例: 硬性反亲和性两个pod不能放在一起#准备工作,准备两个有不同标签的Pod#创建资源配置实现两个有不同标签的Pod复制代码[rootmaster1 scheduler]# cat scheduler-pod-affinity-base.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: controller-deployment-demo-devspec:replicas: 1selector:matchLabels:env: devtemplate:metadata:labels:env: dev #注意此处labels和selector中label必须相同spec:nodeSelector: #确保Pod调度至不同的节点env: devcontainers:- name: deployment-2image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1apiVersion: apps/v1kind: Deploymentmetadata:name: controller-deployment-demo-testspec:replicas: 1selector:matchLabels:env: testtemplate:metadata:labels:env: test #注意此处labels和selector中label必须相同spec:nodeSelector:env: testcontainers:- name: deployment-2image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1复制代码#应用资源配置文件kubectl apply -f scheduler-pod-affinity-base.yaml[rootmaster1 scheduler]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScontroller-deployment-demo-dev-55947b644-zw28d 1/1 Running 0 12s 10.244.1.153 node1.orgcontroller-deployment-demo-test-7685c5779d-b6ccv 1/1 Running 0 12s 10.244.3.197 node2.org#创建资源配置文件复制代码[rootmaster1 scheduler]# cat scheduler-pod-antiaffinity-required.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: controller-deployment-demo-1spec:replicas: 1selector:matchLabels:app: myapp2template:metadata:labels:app: myapp2spec:containers:- name: deployment-2image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1affinity:podAntiAffinity: #反亲和requiredDuringSchedulingIgnoredDuringExecution: #硬反亲和- labelSelector:matchExpressions:- key: envoperator: Invalues:- devtopologyKey: kubernetes.io/hostname复制代码kubectl label node node1.org rack-kubectl label node node2.org rack-#应用资源配置文件kubectl apply -f scheduler-pod-antiaffinity-required.yaml#查看效果, 肯定不会部署到有dev标签的pod所在的节点上复制代码[rootmaster1 scheduler]# kubectl get pod -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATEScontroller-deployment-demo-1-56bfccf4f5-56kk4 1/1 Running 0 6s 10.244.3.198 node2.orgcontroller-deployment-demo-dev-55947b644-zw28d 1/1 Running 0 6m26s 10.244.1.153 node1.orgcontroller-deployment-demo-test-7685c5779d-b6ccv 1/1 Running 0 6m26s 10.244.3.197 node2.org[rootmaster1 scheduler]#[rootmaster1 scheduler]#复制代码复制代码[rootmaster1 scheduler]# kubectl get node --show-labelsNAME STATUS ROLES AGE VERSION LABELSmaster1.org Ready control-plane 27d v1.35.6 beta.kubernetes.io/archamd64,beta.kubernetes.io/oslinux,kubernetes.io/archamd64,kubernetes.io/hostnamemaster1.org,kubernetes.io/oslinux,node-role.kubernetes.io/control-plane,node.kubernetes.io/exclude-from-external-load-balancersnode1.org Ready 27d v1.35.6 beta.kubernetes.io/archamd64,beta.kubernetes.io/oslinux,envdev,kubernetes.io/archamd64,kubernetes.io/hostnamenode1.org,kubernetes.io/oslinuxnode2.org Ready 27d v1.35.6 beta.kubernetes.io/archamd64,beta.kubernetes.io/oslinux,envtest,kubernetes.io/archamd64,kubernetes.io/hostnamenode2.org,kubernetes.io/oslinuxnode3.org NotReady 27d v1.35.6 beta.kubernetes.io/archamd64,beta.kubernetes.io/oslinux,kubernetes.io/archamd64,kubernetes.io/hostnamenode3.org,kubernetes.io/oslinux复制代码#清理环境kubectl delete -f scheduler-pod-antiaffinity-required.yaml范例: 软性反亲和性最好不要哪些pod放在一起#创建资源配置文件复制代码[rootmaster1 scheduler]# cat scheduler-pod-antiaffinity-preferred.yamlapiVersion: apps/v1kind: Deploymentmetadata:name: controller-deployment-demo-1spec:replicas: 1selector:matchLabels:app: myapp2template:metadata:labels:app: myapp2spec:containers:- name: deployment-2image: registry.cn-beijing.aliyuncs.com/wangxiaochun/pod-test:v0.1affinity:podAntiAffinity: #反亲和preferredDuringSchedulingIgnoredDuringExecution:- weight: 60podAffinityTerm:labelSelector:matchExpressions:- key: envoperator: Invalues:- devtopologyKey: kubernetes.io/hostname- weight: 30podAffinityTerm:labelSelector:matchExpressions:- key: envoperator: Invalues:- testtopologyKey: kubernetes.io/hostname复制代码#应用资源配置文件kubectl apply -f scheduler-pod-antiaffinity-preferred.yaml#查看效果复制代码[rootmaster1 scheduler]#[rootmaster1 scheduler]# kubectl get pod --show-labels -o wideNAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELScontroller-deployment-demo-1-7969c68f44-n9c4p 1/1 Running 0 3s 10.244.5.51 node3.org appmyapp2,pod-template-hash7969c68f44controller-deployment-demo-dev-55947b644-zw28d 1/1 Running 0 45m 10.244.1.153 node1.org envdev,pod-template-hash55947b644controller-deployment-demo-test-7685c5779d-b6ccv 1/1 Running 0 45m 10.244.3.197 node2.org envtest,pod-template-hash7685c5779d[rootmaster1 scheduler]#复制代码#结果显示:所有满足条件的都不能部署了#清理环境kubectl delete -f scheduler-pod-antiaffinity-preferred.yamlkubectl delete -f scheduler-pod-affinity-base.yaml节点污点和Pod容忍污点Taint和容忍tolerations介绍生产中可能希望让新的pod基于node节点的属性,创建在某些节点或不能创建在某些节点之上通过前面的节点调度可以实现将Pod运行在指定的节点但是如果想让Pod不要运行在哪此节点上Kubernetes 却没有提供所谓的节点反亲和性功能但是有一种类似的策略污点和容忍度。可以实现类似的功能节点亲和性是 Pod 的一种属性它使 Pod 被吸引到一类特定的节点 这可能出于一种偏好也可能是硬性要求。污点Taint 则相反——它使节点能够排斥一类特定的 Pod是定义在节点的属性容忍度Toleration 是应用于 Pod 上的属性。容忍度允许调度器调度 Pod到有污点的节点上。 容忍度允许调度但并不保证调度作为其功能的一部分 调度器也会评估其他参数。术语解析污点(taints)定义在node节点上的键值属性数据。主要作用是让节点拒绝pod尤其是不符合node规则的pod。容忍度(tolerations)定义在Pod上的键值属性数据用于配置可容忍的污点调度器将其调度至容忍Taint(污点)和 Toleration(容忍)是相互配合的可以用来避免 pod 被分配到不合适的节点上每个节点上都可以拥有一个或多个 taint 这表示对于那些不能容忍这些 taint 的 pod是不会被该节点接受的。比如A节点是集群中很重要的节点不要将无关的pod来这里运行那么就可以在A上面添加一些污点标识。如果节点只打上Taint,但Pod上没有添加容忍度,则默认不会调度Pod至该节点作用来源我们可以使用PodToleratesNodeTaints预选策略和TaintTolerationPriority优选函数完成该机制内置的污点功能Kubernetes自1.6起支持使用污点自动标识问题节点它通过节点控制器在特定条件下自动为节点添加污点信息实现。它们都使用NoExecute效用标识因此非能容忍此类污点的现在Pod对象也会遭到驱逐。节点状态相关的某种条件为真时节点控制器会自动给节点添加一个污点目前内建使用的此类污点有如下几个。node.kubernetes.io/not-ready节点进入NotReady状态时被自动添加的污点。node.alpha.kubernetes.io/unreachable节点进入NotReachable状态时被自动添加的污点。node.kubernetes.io/out-of-disk节点进入OutOfDisk状态时被自动添加的污点。node.kubernetes.io/memory-pressure节点内存资源面临压力。node.kubernetes.io/disk-pressure节点磁盘资源面临压力node.kubernetes.io/pid-pressure节点PID资源紧张node.kubernetes.io/network-unavailable节点网络不可用node.kubernetes.io/unschedulable节点不可用于调度node.cloudprovider.kubernetes.io/uninitializedkubelet由外部的云环境程序启动时它自动为节点添加此污点待到云控制器管理器中的控制器初始化此节点时再将其删除。不过Kubernetes的核心组件通常都要容忍此类的污点以确保其相应的DaemonSet控制器能够无视此类污点于节点上部署相应的关键Pod对象例如kube-proxy或kube-flannel等。属性解析Taint 污点属性Taint是节点上的属性Taints如下定义复制代码kubectl explain node.spec.taints对象列表key #定义一个keyvalue:effectvalue #定义一个值这是一个可选项effect #pod不能容忍这个污点时有三个行为值NoSchedule、PreferNoSchedule、NoExecutetimeAdded #记录污点被添加的具体时间,此属性仅与NoExecute类型的污点相关,在使用kubectltaint命令添加或删除污点时Kubernetes会自动处理TimeAdded属性的更新或移除,此字段由系统自动添加无需人为管理复制代码污点处理方式effect的属性值(优先级从低到高)属性 解析PreferNoSchedule处于在调度优选阶段属于柔性约束即调度器尽量确保不会将那些不能容忍此污点的Pod对象调度至当前节点除非不存在其他任何能够容忍此污点的节点可用添加该类效用的污点同样对节点上现存的Pod对象不产生影响。NoSchedule处于在调度预选阶段不能容忍此污点的新Pod对象不可以调度至当前节点属于强制型约束关系但新添加的污点对节点上现存的Pod对象不产生影响NoExecute不能容忍此污点的新Pod对象不可调度至当前节点属于强制型约束关系节点上现存的Pod因节点污点变动或Pod容忍度变动而不再满足匹配条件时Pod对象将可能会被驱逐可能会对节点上已有的业务Pod产生如下影响1)不能容忍该污点的Pod将立即被驱逐2)若Pod能够容忍该污点且Pod的容忍度上未定义tolerationSeconds则Pod可以一直运行于该节点3)若Pod能够容忍该污点且Pod的容忍度上定义了tolerationSeconds则Pod运行指定的时长后即会被驱逐范例: 查看属性#查看节点上的污点#所有master节点默认都有污点[rootmaster1 ~]# kubectl describe node master1.org |grep TaintTaints: node-role.kubernetes.io/control-plane:NoSchedule#所有worker节点默认都没有污点[rootmaster1 ~]# kubectl describe node node1.org |grep TaintTaints:复制代码[rootmaster1 ~]#kubectl get node master1.wang.org -o yaml…taints: #污点effect: NoSchedule #效用标识key: node-role.kubernetes.io/master…复制代码污点管理命令命令格式#添加污点#指定节点添加污点kubectl taint node : …kubectl taint node node1.org titlesre:NoSchedulekubectl get node node1.org -o yaml |grep taint -iA 10复制代码[rootmaster1 ~]# kubectl get node node1.org -o yaml |grep taint -iA 10taints:effect: NoSchedulekey: titlevalue: srestatus:addresses:address: 192.168.3.63type: InternalIPaddress: node1.orgtype: Hostnameallocatable:复制代码kubectl taint node node1.org studynohard:NoSchedule