Pod 亲和与互斥的调度具体做法:
通过在Pod 的定义上增加topologyKey属性,来声明对应的目标拓扑区域内几种相关联的Pod 要“在一起或不在一起”,与节点亲和相同,Pod亲和与互斥的条件设置也是requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedlingIgnoredDuringExecution。 Pod 的亲和性被定义于PodSpec的affinity字段的podAffinity 子字段中。Pod 间的互斥性则被定义于同一层次的podAntiAffinity 子字段中。
下面通过实例来说明Pod 间的亲和性和互斥策略设置。
1. 参考目标Pod
首先,创建一个名pod-flag 的Pod ,带有标签security = S1 和 app = nginx ,后面的例子将使用pod-flag 作为Pod 亲和与互斥的目标Pod:
apiVersion: v1
kind: Pod
metadata:
name: pod-flag
labels:
security: "S1"
app: "nginx"
spec:
containers:
- name: nginx
image: nginx
创建运行该Pod
[root@k8s-master ~]
pod/pod-flag created
查看pods ,在标签栏显示我们设置的标签
[root@k8s-master ~]
NAME READY STATUS RESTARTS AGE LABELS
pod-flag 1/1 Running 0 109s app=nginx,security=S1
2. Pod 的亲和性调度
下面创建第2个Pod 来说明Pod的亲和性调度,这里定义的亲和性标签是“security=S1” 对应上面的Pod “pod-flag” , topologyKey 的值 被设置为 “kubernetes.io/hostname”:
apiVersion: v1
kind: Pod
metadata:
name: pod-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: kubernetes.io/hostname
containers:
- name: with-pod-affinity
image: gcr.io/google_containers/pause:2.0
创建Pod 之后,使用kubectl get pods -o wide 命令可以看到这两个Pod 在同一个Node 上运行。
[root@k8s-master ~]
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-affinity 0/1 ErrImagePull 0 25s 10.244.140.118 k8s-node-2 <none> <none>
pod-flag 1/1 Running 0 5m22s 10.244.140.117 k8s-node-2 <none> <none>
注意的是这个status 字段是失败的,我通过如下命令查看日志,发现报错了,不过这里的报错不用管,因为我们这里讲不是这个内容,我们看到这两个Pod都在同一个Node 上。
[root@k8s-master ~]
Error from server (BadRequest): container "with-pod-affinity" in pod "pod-affinity" is waiting to start: image can't be pulled
3. Pod 的互斥性调度
创建第3个Pod ,我们希望它不与目标Pod 运行在同一个Node 上:
apiVersion: v1
kind: Pod
metadata:
name: anti-affinity
spec:
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: security
operator: In
values:
- S1
topologyKey: topology.kubernetes.io/zone
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- nginx
topologyKey: topology.kubernetes.io/hostname
containers:
- name: anti-affinity
image: gcr.io/google_containers/pause:2.0
这里要求这个新Pod与security=S1 的Pod 为同一个zone , 但是不与app=nginx 的Pod 为同一个Node,创建Pod 之后,同样用kubectl get pods -o wide 来查看,会看到新的Pod被调度到了同一个 Zone 内的不同Node 上。
|