kubernetes调度——节点亲缘性、pod亲缘性
一、 节点亲缘性nodeAffinity
本质上还是根据节点上的标签进行调度,调度策略更丰富
1、nodeAffinity调度策略
-
requiredDuringSchedulingIgnoredDuringExecution
表示pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试。
IgnoreDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,pod也会继续运行。 -
requiredDuringSchedulingRequiredDuringExecution
表示pod必须部署到满足条件的节点上,如果没有满足条件的节点,就不停重试
RequiredDuringExecution表示pod部署之后运行的时候,如果节点标签发生了变化,不再满足pod指定的条件,则重新选择符合要求的节点 -
preferredDuringSchedulingIgnoredDuringExecution
表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署 -
preferredDuringSchedulingRequiredDuringExecution
表示优先部署到满足条件的节点上,如果没有满足条件的节点,就忽略这些条件,按照正常逻辑部署。
RequiredDuringExecution表示如果后面节点标签发生了变化,满足了条件,则重新调度到满足条件的节点。
2、单条件使用
[root@k8s-master ~]# kubectl label node k8s-node01.linux.com yewu=dev
node/k8s-node01.linux.com labeled
[root@k8s-master ~]#
apiVersion: apps/v1
kind: Deployment
metadata:
name: test6
spec:
replicas: 2
selector:
matchLabels:
app: test6
template:
metadata:
labels:
app: test6
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: yewu
operator: NotIn
values:
- dev
containers:
- name: test6
image: centos:7
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
[root@k8s-master schedulerTest]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test6-7b9cbdc7fd-7gnqw 1/1 Running 0 90s 10.88.242.131 k8s-node02.linux.com <none> <none>
test6-7b9cbdc7fd-7tspc 1/1 Running 0 90s 10.88.242.130 k8s-node02.linux.com <none> <none>
支持的操作符:
In: label的值在某个列表中
NotIn:label的值不在某个列表中
Exists:某个label存在
DoesNotExist:某个label不存在
Gt:label的值大于某个值(字符串比较)
Lt:label的值小于某个值(字符串比较)
3、多条件组合使用
apiVersion: apps/v1
kind: Deployment
metadata:
name: test7
spec:
replicas: 2
selector:
matchLabels:
app: test7
template:
metadata:
labels:
app: test7
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/os
operator: In
values:
- linux
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: yewu
operator: In
values:
- dev
containers:
- name: test7
image: centos:7
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
[root@k8s-master schedulerTest]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
test7-955c44fcc-8spqz 1/1 Running 0 6s 10.88.201.196 k8s-node01.linux.com <none> <none>
test7-955c44fcc-vfcz6 1/1 Running 0 6s 10.88.201.195 k8s-node01.linux.com <none> <none>
二、podAffinity pod亲缘性
根据已有pod的标签进行调度
1、创建pod
apiVersion: v1
kind: Pod
metadata:
name: basic-pod
labels:
security: "s1"
app: "basic"
spec:
containers:
- name: basic-pod
image: centos:7
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
[root@k8s-master schedulerTest]# kubectl get pod -o wide --show-labels
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES LABELS
basic-pod 1/1 Running 0 73s 10.88.242.132 k8s-node02.linux.com <none> <none> app=basic,security=s1
2、podAffinity控制新建的pod和已有pod在同一个节点
apiVersion: v1
kind: Pod
metadata:
name: test8
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- s1
topologyKey: kubernetes.io/hostname
containers:
- name: test8
image: centos:7
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
[root@k8s-master schedulerTest]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
basic-pod 1/1 Running 0 3m48s 10.88.242.132 k8s-node02.linux.com <none> <none>
test8 1/1 Running 0 17s 10.88.242.133 k8s-node02.linux.com <none> <none>
[root@k8s-master schedulerTest]#
3、podAntiAffinity 反亲缘性
apiVersion: v1
kind: Pod
metadata:
name: test9
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- basic
topologyKey: kubernetes.io/hostname
containers:
- name: test9
image: centos:7
imagePullPolicy: IfNotPresent
command:
- sleep
- "3600"
[root@k8s-master schedulerTest]# kubectl get pod -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
basic-pod 1/1 Running 0 8m27s 10.88.242.132 k8s-node02.linux.com <none> <none>
test8 1/1 Running 0 4m56s 10.88.242.133 k8s-node02.linux.com <none> <none>
test9 1/1 Running 0 19s 10.88.201.197 k8s-node01.linux.com <none> <none>