Kubernetes 高级调度 02
目录
一:Taint(污点)和Toleration(容忍)
1、污点和容忍的基本概念
2、污点的使用
3、容忍的定义
4、示例
5、容忍的基本用法
(1)容忍污点的条件
1.不完全匹配,operato的值为Exists,这时无需指定value
2.完全匹配,operator的值为Equal并且value相等(可以设置多个tolerations)
3.如果不指定operator,则默认值为Equal
(2)另外还有如下两个特例
1.空的key、value、effect配合Exists操作符能够匹配所有的键和值,即能容忍所有污点。
2.空的effect匹配所有的effect,即能容忍任何key名为check的污点。
(3)一些特殊的使用场景
1.有多个Master存在时,为了防止资源浪费,可以将master节点设置为PreferNoSchedule污点,让 Pod可在Master上临时创建
2.如果某个Node更新升级系统组件,为了防止业务长时间中断,可以先在该Node设置NoExecute污 点,把该Node上的Pod都驱逐出去
3.此时如果别的Node资源不够用,可临时给Master设置PreferNoSchedule污点,让Pod可在Master上临时创建
4.待所有Node的更新操作都完成后,再去除污点
6、多污点与多容忍配置
二、警戒(cordon)和转移(drain)
1、设置警戒
2、kubectl uncordon将Node标记为可调度的状态(取消警戒)
3、驱逐(转移)pod
三、K8s 亲和性和非亲和性
1、亲和性调度可以分成软策略和硬策略两种方式
2、亲和性的配置规则
3、节点硬亲和性
(1)设置节点标签
(2)查看节点标签
(3)设置pod 亲和性为type=node01
(4)部署pod并查看其信息
(5)设置pod亲和性为type=node02
(6)部署pod并查看其信息
4、节点软亲和性
(1)为pod设置软亲和性
(2)部署pod并查看其信息
5、Pod硬亲和度
(1)部署第一个基础Pod,名字为pod4,使其节点硬亲和到node01
(2)部署并查看其信息
(3)部署第二个基础Pod,名字为pod5,使其节点硬亲和到node02
(4)部署并查看其信息
(5)用pod硬亲和创建一个亲和pod05的pod
(6)部署此pod
7、Pod软亲和度
8、pod反亲和
一:Taint(污点)和Toleration(容忍)
1、污点和容忍的基本概念
对象 | 作用 | 关系 |
---|---|---|
污点 (Taint) | 打在 Node 节点 上,用于排斥一类不符合条件的 Pod。 | 污点与容忍是互斥机制:有污点的 Node 只会接受能容忍该污点的 Pod。 |
容忍 (Toleration) | 配置在 Pod 上,允许 Pod 被调度到带有匹配污点的 Node 上(不强制调度)。 | 无污点的 Node 可调度所有 Pod(无需容忍)。 |
典型应用场景
- 节点资源隔离:例如 GPU 节点仅允许需 GPU 的 Pod 调度(通过污点限制其他 Pod)。
- Master 节点保护:kubeadm 部署的集群默认给 Master 节点添加
node-role.kubernetes.io/master:NoSchedule
污点,防止业务 Pod 占用 Master 资源。- 节点维护:通过
NoExecute
污点临时驱逐节点上的 Pod,便于节点升级或故障修复。- 新节点测试:给新节点添加污点,测试通过后移除污点再允许业务 Pod 调度。
2、污点的使用
如果一个节点被标记为有污点,那么意味着不允许pod调度到该节点,除非pod也被标记为可以容忍 污点节点。
在使用kubeadm部署的k8s集群的时候应该会发现,通常情况下,应用是不会调度到master节点的。 因为kubeadm部署的k8s集群默认给master节点加了Taints(污点)。
给节点node01增加一个污点,它的键名是key1,键值是value1,效果是NoSchedule。这表示只有拥有和这个污点相匹配的容忍度的Pod才能够被分配到node01这个节点
kubectl taint nodes k8s-node01 key1=value1:NoSchedule
查看节点是否为污点:
[root@k8s-master ~]# kubectl describe node k8s-node01 | grep Taints
Taints: key1=value1:NoSchedule
若要移除上述命令所添加的污点,在后面加一个横杠即可,可以执行:
kubectl taint nodes k8s-node01 key1=value1:NoSchedule-
每个污点有一个key和value作为污点的标签,其中value可以为空,effect描述污点的作用效果。语法为:
key=value:effect
当前taint effect支持如下三个选项:
Effect | 调度规则 | 对现有 Pod 的影响 |
---|---|---|
NoSchedule | 禁止新 Pod 调度到该节点(除非有匹配容忍)。 | 不驱逐已有 Pod。 |
PreferNoSchedule | 尽量避免调度新 Pod 到该节点(软限制)。 | 不驱逐已有 Pod。 |
NoExecute | 禁止新 Pod 调度,并驱逐已有 Pod(除非有匹配容忍)。 | 无容忍的 Pod 立即驱逐;有容忍的可设置停留时间(tolerationSeconds )。 |
备注:
NoExecute这个Taint效果对节点上正在运行的pod有以下影响:
(1)没有设置Toleration的Pod会被立刻驱逐
(2)配置了对应Toleration的pod,如果没有为tolerationSeconds赋值,则会一直留在这一节 点中
(3)配置了对应Toleration的pod且指定了tolerationSeconds值,则会在指定时间后驱逐
tolerationSeconds用于描述当Pod需要被驱逐时可以在Node上继续保留运行的时间,即60 秒后该pod会被驱逐掉,默认的是一天。
3、容忍的定义
设置了污点的Node将根据taint的effect:NoSchedule、PreferNoSchedule、NoExecute和Pod 之间产生互斥的关系,Pod将在一定程度上不会被调度到Node上。但我们可以在Pod 上设置容忍(Toleration),意思是设置了容忍的Pod将可以容忍污点的存在,可以被调度到存在污点的Node上。
4、示例
设置污点
kubectl taint nodes k8s-node01 check=mycheck:NoExecute
kubectl taint nodes k8s-node02 check=mycheck:NoExecute
创建测试模板
vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: nginx:1.7.9
运行
kubectl create -f pod1.yaml
在两个Node上都设置了污点后,此时Pod将无法创建成功
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp01 0/1 Pending 0 47s <none> <none> <none> <none>kubectl delete -f pod1.yaml
修改测试模板
在pod1.yaml的基础上增加容忍度参数
vim pod1.yaml
apiVersion: v1
kind: Pod
metadata:name: myapp01labels:app: myapp01
spec:containers:- name: with-node-affinityimage: nginx:1.7.9tolerations:- key: checkoperator: Equalvalue: mycheckeffect: NoExecutetolerationSeconds: 60
注:tolerationSeconds用于描述当Pod需要被驱逐时可以在Node上继续保留运行的时间,即60秒 后该pod会被驱逐掉,默认的是一天。其中的key、vaule、effect都要与Node上设置的taint保 持一致。
运行新的pod
kubectl create -f pod1.yaml
在设置了容忍之后,Pod创建成功
[root@k8s-master ~]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
myapp01 1/1 Running 0 10s 10.244.85.197 k8s-node01 <none> <none>kubectl delete -f pod1.yaml
注:完成此试验后,将污点取消
kubectl taint nodes k8s-node01 check=mycheck:NoExecute-
kubectl taint nodes k8s-node02 check=mycheck:NoExecute-
5、容忍的基本用法
(1)容忍污点的条件
operator的值为Exists将会忽略value值,即存在即可,为Equal时需要指定污点的value。
pod的Toleration声明中的key和effect需要与Taint的设置保持一致,并且满足以下条件之一:
1.不完全匹配,operato的值为Exists,这时无需指定value
tolerations:- key: checkoperator: "Exists"effect: NoExecute
2.完全匹配,operator的值为Equal并且value相等(可以设置多个tolerations)
tolerations:- key: checkoperator: Equalvalue: mycheckeffect: NoExecute
3.如果不指定operator,则默认值为Equal
tolerations:- key: checkvalue: mycheckeffect: NoExecute
(2)另外还有如下两个特例
1.空的key、value、effect配合Exists操作符能够匹配所有的键和值,即能容忍所有污点。
tolerations:operator: "Exists"
2.空的effect匹配所有的effect,即能容忍任何key名为check的污点。
tolerations:- key: checkoperator: "Exists"
(3)一些特殊的使用场景
1.有多个Master存在时,为了防止资源浪费,可以将master节点设置为PreferNoSchedule污点,让 Pod可在Master上临时创建
kubectl taint node k8s-master node-role.kubernetes.io/master=:PreferNoSchedule
2.如果某个Node更新升级系统组件,为了防止业务长时间中断,可以先在该Node设置NoExecute污 点,把该Node上的Pod都驱逐出去
kubectl taint node k8s-node01 check=mycheck:NoExecute
3.此时如果别的Node资源不够用,可临时给Master设置PreferNoSchedule污点,让Pod可在Master上临时创建
kubectl taint node k8s-master node-role.kubernetes.io/master=:PreferNoSchedule
4.待所有Node的更新操作都完成后,再去除污点
kubectl taint node node01 check=mycheck:NoExecute-
6、多污点与多容忍配置
系统允许在同一个node上设置多个taint,也可以在pod上设置多个Toleration
Kubernetes调度器处理多个Taint和Toleration能够匹配的部分,剩下的没有忽略掉的 Taint就是对Pod的效果了。下面是几种特殊情况
- 如果剩余的Taint中存在effect=NoSchedule,则调度器不会把该pod调度到这一节点上。
- 如果剩余的Taint中没有NoSchedule的效果,但是有PreferNoSchedule效果,则调度器会尝 试不会将pod指派给这个节点。
- 如果剩余Taint的效果有NoExecute的,并且这个pod已经在该节点运行,则会被驱逐;如果没 有在该节点运行,也不会再被调度到该节点上。
kubectl taint nodes k8s-node01 key1=value1:NoSchedule
kubectl taint nodes k8s-node01 key1=value1:NoExecute
kubectl taint nodes k8s-node01 key2=value2:NoSchedule
去除污点:
kubectl taint nodes k8s-node01 key1=value1:NoSchedule-
kubectl taint nodes k8s-node01 key1=value1:NoExecute-
kubectl taint nodes k8s-node01 key2=value2:NoSchedule-
二、警戒(cordon)和转移(drain)
1、设置警戒
警戒是指将Node标记为不可调度的状态
这样就不会让新创建的Pod在此Node上运行,命令如下
kubectl cordon k8s-node01
该node将会变为SchedulingDisabled状态
[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 9d v1.23.0
k8s-node01 Ready,SchedulingDisabled <none> 9d v1.23.0
k8s-node02 Ready <none> 9d v1.23.0
2、kubectl uncordon将Node标记为可调度的状态(取消警戒)
kubectl uncordon k8s-node01[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 9d v1.23.0
k8s-node01 Ready <none> 9d v1.23.0
k8s-node02 Ready <none> 9d v1.23.0
3、驱逐(转移)pod
kubectl drain可以让Node节点开始释放所有pod,并且不接收新的pod进程。drain本意排水, 意思是将出问题的Node下的Pod转移到其它Node下运行。
[root@k8s-master ~]# kubectl drain k8s-node01 --ignore-daemonsets --delete-local-data --force
Flag --delete-local-data has been deprecated, This option is deprecated and will be deleted. Use --delete-emptydir-data.
node/k8s-node01 cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-sngdc, kube-system/kube-proxy-bhzr6
node/k8s-node01 drained
[root@k8s-master ~]# kubectl get node
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 9d v1.23.0
k8s-node01 Ready,SchedulingDisabled <none> 9d v1.23.0
k8s-node02 Ready <none> 9d v1.23.0
执行drain命令,会自动做了两件事情:
- 设定此node为不可调度状态(cordon)
- evict(驱逐)了Pod
-ignore-daemonsets:无视DaemonSet管理下的Pod
-delete-local-data:如果有mount local volume 的pod,会强制杀掉该pod
-force:强制释放不是控制器管理的Pod,例如kube-proxy
注:实验完成后,将节点设置为可调度
kubectl uncordon k8s-node01[root@k8s-master ~]# kubectl get nodes
NAME STATUS ROLES AGE VERSION
k8s-master Ready control-plane,master 9d v1.23.0
k8s-node01 Ready <none> 9d v1.23.0
k8s-node02 Ready <none> 9d v1.23.0
三、K8s 亲和性和非亲和性
关于K8S对Pod的调度,通常情况下Pod被分配到哪些Node是不需要我们操心的,这个过程会由scheduler自动实现。但有时,我们需要让Pod按照我们的预想运行在Node上(例如某些应用"必须/ 或者尽量"跑在具有SSD存储的节点上,有些彼此相关的Pod 应用应该跑在同一个节点上)。为此,k8s 为我们提供了这样的策略,我们可以通过使用"亲和性/非亲和性"制定一些规则来实现我们的需求。
1、亲和性调度可以分成软策略和硬策略两种方式
硬策略:可以理解为必须,就是如果没有满足条件的节点的话,就不断重试直到满足条件为止。 对应的配置规则为requiredDuringSchedulingIgnoredDuringExecution。
软策略:可以理解为尽量,就是如果现在没有满足调度要求的节点的话,pod就会忽略这条规则, 继续完成调度的过程,说白了就是满足条件最好了,没有的话也无所谓。对应的配置规则为 preferredDuringSchedulinggnoredDuringExecution。
2、亲和性的配置规则
分为Node亲和性、Pod亲和性、Pod反亲和性:
nodeAffinity:节点亲和性,用来控制Pod要部署在哪些节点上,以及不能部署在哪些节点上的,这个是Pod与Node之间匹配规则的。
podAffinity:pod亲和性,这个是Pod与Pod之间匹配规则的。
podAntiAffinity:pod反亲和性,与podAffinity相反,用来指定Pod不要部署到哪些节点上。
3、节点硬亲和性
节点的亲和性可以通过pod.spec.affinity.nodeAffinity字段定义,nodeAffinity字段中支持使用matchExpressions属性构建更为复杂的标签选择器。
(1)设置节点标签
首先对两个node加标签,设置两个node标签分别为node1和node2。加标签的语法如下。
kubectl label nodes <node-name> <label-key>=<label-value>
kubectl label nodes k8s-node01 type=node01
kubectl label nodes k8s-node02 type=node02
注:
如果需要重命名node标签,可以使用如下命令:
kubectl label nodes k8s-node01 type=node01 --overwrite
如果要删除node标签(标签名为"type"),可以使用如下命令:
kubectl label nodes k8s-node01 type=node01 type-
(2)查看节点标签
[root@k8s-master ~]# kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
k8s-master Ready control-plane,master 9d v1.23.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=,node.kubernetes.io/exclude-from-external-load-balancers=
k8s-node01 Ready <none> 9d v1.23.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node01,kubernetes.io/os=linux,type=node01
k8s-node02 Ready <none> 9d v1.23.0 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node02,kubernetes.io/os=linux,type=node02
(3)设置pod 亲和性为type=node01
vim test01.yaml
apiVersion: v1
kind: Pod
metadata:name: pod01
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- {key: type, operator: In, values: ["node01"]}containers:- name: pod01image: nginx:1.7.9
注:values: ["node01"] node01为节点的标签,该pod要调度到标签为node01的节点,即k8s-node01。
(4)部署pod并查看其信息
kubectl create -f test01.yaml [root@k8s-master ~]# kubectl get pod pod01 -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod01 1/1 Running 0 22s 10.244.85.198 k8s-node01 <none> <none>
(5)设置pod亲和性为type=node02
vim test02.yaml
apiVersion: v1
kind: Pod
metadata:name: pod02
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- {key: type, operator: In, values: ["node02"]}containers:- name: pod02image: nginx:1.7.9
注:values: ["node02"] node02为节点的标签,该pod要调度到标签为node02的节点,即k8s-node02。
(6)部署pod并查看其信息
kubectl create -f test02.yaml [root@k8s-master ~]# kubectl get pod pod02 -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod02 1/1 Running 0 7s 10.244.58.205 k8s-node02 <none> <none>
4、节点软亲和性
节点软亲和性为节点选择提供了一种柔性的控制器逻辑,当条件不满足时,也能够接受被编排在其他 不符合条件的节点之上。同时他还为每种倾向性提供了weight属性以便用于自定义优先级,范围是1-100, 越大越优先。
(1)为pod设置软亲和性
vim test03.yaml
apiVersion: v1
kind: Pod
metadata:name: pod03
spec:affinity:nodeAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 60preference:matchExpressions:- {key: type, operator: In, values: ["node02"]}- weight: 90preference:matchExpressions:- {key: tpye, operator: In, values: ["node01"]}containers:- name: pod03image: nginx:1.7.9
(2)部署pod并查看其信息
kubectl create -f test03.yaml[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod01 1/1 Running 0 6m46s 10.244.85.198 k8s-node01 <none> <none>
pod02 1/1 Running 0 4m21s 10.244.58.205 k8s-node02 <none> <none>
pod03 1/1 Running 0 8s 10.244.58.206 k8s-node02 <none> <none>
可以看到,由于Pod对node01的亲和性,被部署到了node01上。
注:
node软亲和中的权重值不影响pod的调度,谁在前面,就亲和谁。
pod软亲和中的权重值是会影响调度到的节点的,pod软亲和中谁的权重高就调度到谁那里。
5、Pod硬亲和度
出于某些需求,将一些Pod对象组织在相近的位置(同一节点、机架、区域等),此时这些pod对象间的关系为pod亲和性。
Pod的亲和性调度也存在硬亲和性和软亲和性的区别,他们表示的约束意义同节点亲和性相似。
Pod硬亲和性调度也使用requiredDuringSchedulinggnoreDuringExecution属性进行定义。
首先创建两个基础Pod,并对它打标签,分别部署到node01和node02上。
(1)部署第一个基础Pod,名字为pod4,使其节点硬亲和到node01
vim test04.yaml
apiVersion: v1
kind: Pod
metadata:name: pod04labels:app: pod04
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- {key: type, operator: In, values: ["node01"]}containers:- name: pod04image: nginx:1.7.9
注:pod04的标签是pod04,所在的节点标签是node01
(2)部署并查看其信息
kubectl create -f test04.yaml [root@k8s-master ~]# kubectl get pod pod04 -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod04 1/1 Running 0 18s 10.244.85.199 k8s-node01 <none> <none>
(3)部署第二个基础Pod,名字为pod5,使其节点硬亲和到node02
vim test05.yaml
apiVersion: v1
kind: Pod
metadata:name: pod05labels:app: pod05
spec:affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- {key: type, operator: In, values: ["node02"]}containers:- name: pod05image: nginx:1.7.9
注:pod05的标签是pod05,所在的节点标签是node02
(4)部署并查看其信息
kubectl create -f test05.yaml [root@k8s-master ~]# kubectl get pod pod05 -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod05 1/1 Running 0 5s 10.244.58.207 k8s-node02 <none> <none>
可以看到,一个位于node01,一个位于node02.
(5)用pod硬亲和创建一个亲和pod05的pod
vim test06.yaml
apiVersion: v1
kind: Pod
metadata: name: pod06
spec:affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- {key: app, operator: In, values: ["pod05"]}topologyKey: kubernetes.io/hostnamecontainers:- name: pod06image: nginx:1.7.9
注:
matchExpressions的values值为pod的标签。是哪个pod的标签,就亲和到哪个pod所在的node节 点
pod05的标签是pode5,所在的节点标签是node02
pod06亲和了podo5,于是也被调度到node02
(6)部署此pod
kubectl create -f test06.yaml [root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod01 1/1 Running 0 14m 10.244.85.198 k8s-node01 <none> <none>
pod02 1/1 Running 0 12m 10.244.58.205 k8s-node02 <none> <none>
pod03 1/1 Running 0 7m50s 10.244.58.206 k8s-node02 <none> <none>
pod04 1/1 Running 0 3m3s 10.244.85.199 k8s-node01 <none> <none>
pod05 1/1 Running 0 2m17s 10.244.58.207 k8s-node02 <none> <none>
pod06 1/1 Running 0 8s 10.244.58.208 k8s-node02 <none> <none>
此时,pod05和pod06两个pod位于同一个node节点。
7、Pod软亲和度
Pod软亲和调度使用方法与Node软亲和调度方法类似。
vim test07.yaml
apiVersion: v1
kind: Pod
metadata:name: pod07
spec:affinity:podAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 20podAffinityTerm:labelSelector:matchExpressions:- {key: app, operator: In, values: ["pod05"]}topologyKey: kubernetes.io/hostname- weight: 80podAffinityTerm:labelSelector:matchExpressions:- {key: app, operator: In, values: ["pod04"]}topologyKey: kubernetes.io/hostnamecontainers:- name: pod07image: nginx:1.7.9
values: ["pode5"]是pod05的pod的标签
values: ["podo4"])是pod04的pod的标签
正则匹配了pod的标签"pode5",带有pod05标签的pod是pod05,该pod在node02上,于是pod07 的pod也调度到了node02上。
注:
node软亲和中的权重值不影响pod的调度,谁在前面,就亲和谁
pod软亲和中的权重值是会影响调度到的节点的,pod软亲和中谁的权重高就调度到谁那里。
kubectl create -f test07.yaml[root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod01 1/1 Running 0 17m 10.244.85.198 k8s-node01 <none> <none>
pod02 1/1 Running 0 14m 10.244.58.205 k8s-node02 <none> <none>
pod03 1/1 Running 0 10m 10.244.58.206 k8s-node02 <none> <none>
pod04 1/1 Running 0 5m43s 10.244.85.199 k8s-node01 <none> <none>
pod05 1/1 Running 0 4m57s 10.244.58.207 k8s-node02 <none> <none>
pod06 1/1 Running 0 2m48s 10.244.58.208 k8s-node02 <none> <none>
pod07 1/1 Running 0 20s 10.244.85.200 k8s-node01 <none> <none>
pod04的标签是pod04,所在的节点标签是node01
pod05的标签是pod05,所在的节点标签是node02
pod07软亲和了pod05,所以也在node01上
8、pod反亲和
vim test09.yaml
apiVersion: v1
kind: Pod
metadata: name: pod09
spec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- {key: app, operator: In, values: ["pod05"]}topologyKey: kubernetes.io/hostnamecontainers:- name: test09image: nginx:1.7.9
kubectl create -f test09.yaml [root@k8s-master ~]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod01 1/1 Running 0 19m 10.244.85.198 k8s-node01 <none> <none>
pod02 1/1 Running 0 17m 10.244.58.205 k8s-node02 <none> <none>
pod03 1/1 Running 0 12m 10.244.58.206 k8s-node02 <none> <none>
pod04 1/1 Running 0 8m6s 10.244.85.199 k8s-node01 <none> <none>
pod05 1/1 Running 0 7m20s 10.244.58.207 k8s-node02 <none> <none>
pod06 1/1 Running 0 5m11s 10.244.58.208 k8s-node02 <none> <none>
pod07 1/1 Running 0 2m43s 10.244.85.200 k8s-node01 <none> <none>
pod09 1/1 Running 0 6s 10.244.85.201 k8s-node01 <none> <none>
查看podo9所在的节点,因为设置的反亲和pode5,所以,pod05在node02的话,poda9就会在node01。
污点是阻止Pod调度的硬性条件,而亲和性是影响调度决策的软性指导。在Kubernetes调度过程中, 污点的约束始终优先于亲和性的指导。
污点优先级高于亲和性:如果一个节点上有污点,而Pod没有相应的容忍度,那么无论亲和性规 则如何,Pod都不能被调度到该节点上。
亲和性不影响污点的约束:即使Pod的亲和性规则允许它被调度到某个节点,如果该节点上有污 点而Pod没有容忍度,Pod仍然不能被调度上去。