9-3 Scheduler --- 玩转pod调度(下)
创建web-dev-pod.yaml 验证pod的亲和性
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo-pod
namespace: dev
spec:
selector:
matchLabels:
app: web-demo-pod
replicas: 1
template:
metadata:
labels:
app: web-demo-pod
spec:
containers:
- name: web-demo-pod
image: harbor.pdabc.com/kubernetes/web:v3
ports:
- containerPort: 8080
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
# 和app 名为web-demo的pod 运行在一起
matchExpressions:
- key: app
operator: In
values:
- web-demo
# 运行的条件 会运行在同一个节点
topologyKey: kubernetes.io/hostname
# 倾向于和名为web-demo-node 的pod运行在一起
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-demo-node
topologyKey: kubernetes.io/hostname
启动pod 的确是在一起的
kubectl apply -f web-dev-pod.yaml
修改matchExpressions的app值为web-demo-2 并启动pod
kubectl apply -f web-dev-pod.yaml
matchExpressions的pod一定要存在 否则创建pod的时候 会一直处于pending
pod的反亲和性调度
修改 web-dev-pod.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo-pod
namespace: dev
spec:
selector:
matchLabels:
app: web-demo-pod
replicas: 1
template:
metadata:
labels:
app: web-demo-pod
spec:
containers:
- name: web-demo-pod
image: harbor.pdabc.com/kubernetes/web:v3
ports:
- containerPort: 8080
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-demo-node
topologyKey: kubernetes.io/hostname
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-demo-node
topologyKey: kubernetes.io/hostname
启动并查看 发现的确没有和web-demo-node在一台node上
修改web-dev-pod.yaml 表示不想和自己在一个pod (类似于多可用区?)
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-demo-pod
如果这时候修改web-dev.yaml为如下 表示要和自己的pod 运行在一起
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo-pod
namespace: dev
spec:
selector:
matchLabels:
app: web-demo-pod
replicas: 1
template:
metadata:
labels:
app: web-demo-pod
spec:
containers:
- name: web-demo-pod
image: harbor.pdabc.com/kubernetes/web:v3
ports:
- containerPort: 8080
affinity:
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-demo-pod
topologyKey: kubernetes.io/hostname
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-demo-node
topologyKey: kubernetes.io/hostname
启动之后发现新pod 一直处于pending状态
通过查看日志kubectl describe pod -n dev web-demo-pod-856d8bdf89-t6zml发现,是因为目前的规则违背了之前pod的规则,之前不想和web-dev-pod在一起,现在又想在一起了。那之前的pod的规则就不满足了,会有排斥。可以通过删除重建解决
污点
可以将拥有GPU ssd等设备的node 打上污点,避免正常pod被分配上来。
污点的效果
NoSchedule 不会调度
PreferNoSchedule 最好不要调度
NoExcute 不仅不会调度 如果node上还有pod 会进行驱逐,如果没有设置容忍时间则立刻驱逐
给node打上污点
kubectl taint nodes kubernetes-node-01 gpu=true:NoSchedule
重新修改web-dev-node.yaml 如下 可以再给node1 添加一个ssd标签 测试
kubectl label node kubernetes-node-01 disktype=ssd
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo-node
namespace: dev
spec:
selector:
matchLabels:
app: web-demo-node
replicas: 1
template:
metadata:
labels:
app: web-demo-node
spec:
containers:
- name: web-demo-node
image: harbor.pdabc.com/kubernetes/web:v3
ports:
- containerPort: 8080
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: disktype
operator: In
values:
- ssd
可以发现pod从有污点的带有ssd标签的node1上跑到node3上了
创建新的web-dev-taint.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-demo-taint
namespace: dev
spec:
selector:
matchLabels:
app: web-demo-taint
replicas: 1
template:
metadata:
labels:
app: web-demo-taint
spec:
containers:
- name: web-demo-taint
image: harbor.pdabc.com/kubernetes/web:v3
ports:
- containerPort: 8080
# 污点容忍的key
tolerations:
# 这个要和打污点时一样
- key: "gpu"
# 还有exists 只要污点存在就行 和值没有关系
operator: "Equal"
value: "true"
# 这个要和打污点时一样
effect: "NoSchedule"
启动pod
第一次运行在node2
第二次 修改replicas=3 测试污点容忍 可以在node1上创建pod
其中有一次写错了 容忍度没配置对 就是不会到有污点的node1上
来源:CSDN
作者:爷来辣
链接:https://blog.csdn.net/xujiamin0022016/article/details/103883930