kind: Pod
metadata:
name: pod-node-affinity-demo
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: zone
operator: In
values:
- foo
- bar
以上内容表示将 pod-node-affinity-demo调度到一个拥有标签zone是foo/bar的node节点上,kubectl apply -f pod-nodeaffinity-demo.yaml创建后,查看pod,kubectl get pods -o wide | grep pod-node,显示pod的状态是pending挂起,因为此处是required应亲和(与此对应的是软亲和preferred),所以必须满足调度条件才会完成调度。
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 0/1 Pending 0 20s <none> <none> <none> <none>
接着,对任意一个node工作节点打一个类似的zone标签,例如对node1节点打标签,如下所示:
[root@master1 pods]# kubectl label nodes node1 zone=bar
node/node1 labeled
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 0/1 ContainerCreating 0 11m <none> node1 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 0/1 ContainerCreating 0 11m <none> node1 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 0/1 ContainerCreating 0 11m <none> node1 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 0/1 ContainerCreating 0 11m <none> node1 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 0/1 ContainerCreating 0 11m <none> node1 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 0/1 ContainerCreating 0 11m <none> node1 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 1/1 Running 0 11m 172.16.166.131 node1 <none> <none>
可以看到经过对node1打标签后满足了pod-nodeaffinity-demo的调度条件,开始在node1上调度创建,最终显示running状态。
例二(nodeAffinity软亲和):
apiVersion: v1
kind: Pod
metadata:
name: pod-node-affinity-demo-2
namespace: default
labels:
app: myapp
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- preference:
matchExpressions:
- key: zone1
operator: In
values:
- foo1
- bar1
weight: 60
直接运行,结果是在node1节点上调度创建完成,由此可见nodeAffinity(preferred)软亲和并不一定需要满足对应的匹配表达式条件,调度所需条件更低更试用。
Node节点亲和性针对的是pod和node的关系,Pod调度到node节点的时候匹配的条件
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 1/1 Running 0 19m 172.16.166.131 node1 <none> <none>
pod-node-affinity-demo-2 0/1 ContainerCreating 0 17s <none> node1 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 1/1 Running 0 19m 172.16.166.131 node1 <none> <none>
pod-node-affinity-demo-2 0/1 ContainerCreating 0 21s <none> node1 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 1/1 Running 0 19m 172.16.166.131 node1 <none> <none>
pod-node-affinity-demo-2 0/1 ContainerCreating 0 22s <none> node1 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 1/1 Running 0 19m 172.16.166.131 node1 <none> <none>
pod-node-affinity-demo-2 0/1 ContainerCreating 0 24s <none> node1 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod-node
pod-node-affinity-demo 1/1 Running 0 19m 172.16.166.131 node1 <none> <none>
pod-node-affinity-demo-2 1/1 Running 0 26s 172.16.166.132 node1 <none> <none>
例三(podAffinity亲和度,前提条件是依据一个已经创建运行的pod作为参照标准)
apiVersion: v1
kind: Pod
metadata:
name: pod-first
labels:
app2: myapp2
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:
name: pod-second
labels:
app: backend
tier: db
spec:
containers:
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["sh","-c","sleep 3600"]
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- {key: app2, operator: In, values: ["myapp2"]}
topologyKey: kubernetes.io/hostname
[root@master1 pods]# kubectl apply -f pod-required-affinity-demo.yaml
pod/pod-first created
pod/pod-second created
[root@master1 pods]# kubectl get pods -o wide | grep pod
pod-first 0/1 ContainerCreating 0 27s <none> node2 <none> <none>
pod-node-affinity-demo 1/1 Running 0 33m 172.16.166.131 node1 <none> <none>
pod-node-affinity-demo-2 1/1 Running 0 14m 172.16.166.132 node1 <none> <none>
pod-second 0/1 ContainerCreating 0 25s <none> node2 <none> <none>
[root@master1 pods]# kubectl get pods -o wide | grep pod
pod-first 1/1 Running 0 37s 172.16.104.4 node2 <none> <none>
pod-node-affinity-demo 1/1 Running 0 33m 172.16.166.131 node1 <none> <none>
pod-node-affinity-demo-2 1/1 Running 0 14m 172.16.166.132 node1 <none> <none>
pod-second 1/1 Running 0 35s 172.16.104.5 node2 <none> <none>
上面说明第一个pod调度到哪,第二个pod也调度到哪,这就是pod节点亲和性
例四
apiVersion: v1
kind: Pod
metadata:
name: pod-first
labels:
app1: myapp1
tier: frontend
spec:
containers:
- name: myapp
image: ikubernetes/myapp:v1
---
apiVersion: v1
kind: Pod
metadata:
name: pod-second
labels:
app: backend
tier: db
spec:
containers:
- name: busybox
image: busybox:latest
imagePullPolicy: IfNotPresent
command: ["sh","-c","sleep 3600"]
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- {key: app1, operator: In, values: ["myapp1"]}
topologyKey: kubernetes.io/hostname
[root@master1 pods]# kubectl apply -f pod-required-anti-affinity-demo.yaml
[root@master1 pods]# kubectl get pods -o wide | grep node
pod-first 1/1 Running 0 42s 172.16.104.6 node2 <none> <none>
pod-node-affinity-demo 1/1 Running 0 56m 172.16.166.131 node1 <none> <none>
pod-node-affinity-demo-2 1/1 Running 0 37m 172.16.166.132 node1 <none> <none>
pod-second 1/1 Running 0 42s 172.16.166.133 node1 <none> <none>
显示两个pod不在一个node节点上,这就是pod节点反亲和性
网友评论