昨日考题
昨日答案
第一个deployment:cka-1122-01
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cka-1122-01
name: cka-1122-01
spec:
replicas: 2
selector:
matchLabels:
app: cka-1122-01
template:
metadata:
labels:
app: cka-1122-01
spec:
containers:
- image: nginx
name: cka-1122-01
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- cka-1122-01
topologyKey: "kubernetes.io/hostname"
第二个deployment:cka-1122-02
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: cka-1122-02
name: cka-1122-02
spec:
replicas: 2
selector:
matchLabels:
app: cka-1122-02
template:
metadata:
labels:
app: cka-1122-02
spec:
containers:
- image: nginx
name: cka-1122-02
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- cka-1122-01
topologyKey: "kubernetes.io/hostname"
最终调度结果:
NAME READY STATUS RESTARTS AGE IP NODE
cka-1122-01-5df9bdf8c9-qwd2v 1/1 Running 0 8m 10.192.4.2 node-1
cka-1122-01-5df9bdf8c9-r4rhs 1/1 Running 0 8m 10.192.4.3 node-2
cka-1122-02-749cd4b846-bjhzq 1/1 Running 0 10m 10.192.4.4 node-1
cka-1122-02-749cd4b846-rkgpo 1/1 Running 0 10m 10.192.4.5 node-2
昨日解析
考点:k8s中的高级调度及用法。
亲和性和反亲和性调度官方文档:
https://kubernetes.io/docs/concepts/configuration/assign-pod-node/
将 Pod 调度到特定的 Node 上:nodeSelector
nodeSelector是节点选择约束的最简单推荐形式。 nodeSelector是PodSpec下的一个字段。它指定键值对的映射。为了使Pod可以在节点上运行,该节点必须具有每个指定的键值对作为label。
nodeSelector 升级版:nodeAffinity
节点亲和性在概念上类似于nodeSelector,它可以根据节点上的标签来限制Pod可以被调度在哪些节点上。
红色框为硬性过滤:排除不具备指定label的node;在预选阶段起作用;
绿色框为软性评分:不具备指定label的node打低分, 降低node被选中的几率;在优选阶段起作用;
与nodeSelector关键差异
让某些 Pod 分布在同一组 Node 上:podAffinity
Pod亲和性和反亲和性可以基于已经在节点上运行的Pod上的标签而不是基于节点上的标签,来限制Pod调度的节点。
规则的格式为:
如果该X已经在运行一个或多个满足规则Y的Pod,则该Pod应该(或者在反亲和性的情况下不应该)在X中运行。
Y表示为LabelSelector。X是一个拓扑域,例如节点,机架,云提供者区域,云提供者区域等。
红框硬性过滤: 排除不具备指定pod的node组;在预选阶段起作用;
绿框软性评分: 不具备指定pod的node组打低分, 降低该组node被选中的几率;在优选阶段起作用;