当前位置: 首页 > news >正文

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(无需容忍)。

典型应用场景

  1. 节点资源隔离:例如 GPU 节点仅允许需 GPU 的 Pod 调度(通过污点限制其他 Pod)。
  2. Master 节点保护:kubeadm 部署的集群默认给 Master 节点添加node-role.kubernetes.io/master:NoSchedule污点,防止业务 Pod 占用 Master 资源。
  3. 节点维护:通过NoExecute污点临时驱逐节点上的 Pod,便于节点升级或故障修复。
  4. 新节点测试:给新节点添加污点,测试通过后移除污点再允许业务 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的效果了。下面是几种特殊情况

  1. 如果剩余的Taint中存在effect=NoSchedule,则调度器不会把该pod调度到这一节点上。
  2. 如果剩余的Taint中没有NoSchedule的效果,但是有PreferNoSchedule效果,则调度器会尝 试不会将pod指派给这个节点。
  3. 如果剩余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仍然不能被调度上去。

http://www.dtcms.com/a/278890.html

相关文章:

  • victoriametrics Operator 安装
  • 雅思练习总结(二十九)
  • 前端docx库实现将html页面导出word
  • AI革命,分布式存储也在革命,全闪化拐点已至
  • 【第一章编辑器开发基础第二节编辑器布局_2GUI中滚动列表(2/4)】
  • Web Socket 学习笔记
  • C# 入门学习教程(三)
  • Python基础语法1:注释与输入输出、变量与简单数据类型、运算符与表达式、条件判断与循环
  • 云原生技术与应用-Containerd容器技术详解
  • MySQL数据库的基础操作
  • AI驱动的软件工程(下):AI辅助的质检与交付
  • nvidia-smi命令参数解释
  • 机器学习(ML)、深度学习(DL)、强化学习(RL):人工智能的三驾马车
  • 外星人电脑Alienware Aurora R11原装出厂OEM预装Windows10系统
  • 自动驾驶数据仓库:时间片合并算法。
  • 【React Native】ScrollView 和 FlatList 组件
  • 基于ASP.NET+SQL Server实现(Web)排球赛事网站
  • Java文件操作
  • PTKQuery
  • 大规模测试自动化测试指南
  • day9 串口通信
  • 如何单独安装设置包域名
  • Kafka Broker源码解析(上篇):存储引擎与网络层设计
  • Java HTTP应用开发:从基础到实战
  • C语言-流程控制
  • 使⽤Pytorch构建⼀个神经⽹络
  • Linux 消息队列接收与处理线程实现
  • 【HTTP版本演变】
  • 考完数通,能转云计算/安全方向吗?转型路径与拓展路线分析
  • Elasticsearch9.x核心架构概述