1. node调度
nodeName指定
nodeName 是节点选择最简单方法,但一般不推荐。如果 nodeName 在 PodSpec 中指定了,则优先于其他的节点选择方法。如果指定的节点没有资源来容纳 pod,则pod 调度失败。
vim node.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx
spec:
containers:
- name: nginx
image: myapp:v1
nodeName: server3 # 指定server3
kubectl apply -f node.yaml
成功调度至server3
nodeSelector选择
给选择的节点添加标签:
kubectl label nodes server4 disktype=ssd
vim aff-node.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-2
labels:
env: test
spec:
containers:
- name: nginx
image: myapp:v1
imagePullPolicy: IfNotPresent
nodeSelector:
disktype: ssd
应用文件,节点被调度到有ssd标签的server4上
而此时去掉server4的ssd标签,已经被调度到节点上的pod不会受到影响。
node 亲和性与反亲和性
- nodeaffinity还支持多种规则匹配条件的配置
- 亲和性
apiVersion: v1
kind: Pod
metadata:
name: node-affinity
spec:
containers:
- name: nginx
image: nginx
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: disktype
operator: In #匹配disktype的值为下列值之一
values:
- ssd
优先调度至disktype=ssd的节点。
- 反亲和性
vim aff-node.yaml
apiVersion: v1
kind: Pod
metadata:
name: node-affinity
spec:
containers:
- name: nginx
image: myapp:v1
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: NotIn #反亲和
values:
- server2 #优先不调度至server2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1 # 亲和权重为1
preference:
matchExpressions:
- key: disktype #匹配disktype的值为下列值之一
operator: In
values:
- ssd
优先不调度至server2,优先匹配标签为disktype=ssd的节点。
2. pod调度
pod 亲和与反亲和
与node亲和与反亲和类似支持nodeaffinity规则
示例:
apiVersion: v1
kind: Pod
metadata:
name: busybox-anti
labels:
app: busybox
spec:
containers:
- name: busybox
image: busybox
affinity:
podAntiAffinity: #反亲和匹配
#podAntiAffinity: #亲和匹配
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions: #匹配label为env 值为列出的test
- key: env
operator: In
values:
- test
topologyKey: kubernetes.io/hostname
检查符合反亲和条件的pod,以及所在的node
匹配到pod为nginx-2,位于server4,运行配置文件部署pod,新建pod被部署到了server3
kubectl apply -f pod-af.yaml
污点
kubectl taint nodes node1 key=value:NoSchedule #创建污点
kubectl describe nodes server1 |grep Taints #查询server1上的污点
kubectl taint nodes node1 key:NoSchedule- #删除污点
其中key=value:后接effect值,有三种选择项
NoSchedule:POD 不会被调度到标记为 taints 节点。
PreferNoSchedule:NoSchedule 的软策略版本。
NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 POD 没有对应 Tolerate 设置,会直接被逐出。
部署nginx deployment示例:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
selector:
matchLabels:
app: nginx
replicas: 3
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
应用deployment文件,查看调度情况
默认全部调度至server3,为server3设置污点
kubectl taint node server3 key1=v1:NoExecute
server3开始驱逐pod,在server4上重新拉起
为pod设置容忍标签,部分被驱逐到server4的pod开始回归server3
tolerations:
- key: "key1"
operator: "Equal"
value: "v1"
effect: "NoExecute"
kubectl apply -f deploy.yaml
toleration示例:
tolerations: #匹配kv都符合并且effect为NoSch的node
- key: "key"
operator: "Equal"
value: "value"
effect: "NoSchedule"
---
tolerations: # 匹配K存在且effect为NoSch的node
- key: "key"
operator: "Exists"
effect: "NoSchedule"
// ``如果 operator 为 Exists ,可以略去value。``
//``若operator为 Equal , key与value必须对应相等。``
//``若不指定operator,则默认值为Equal。``
//``若不指定key,再配合Exists 就能匹配所有的key与value ,可以容忍所有污点。``
//``若不指定effect ,则匹配所有的effect。``
3. 暴力调度
影响Pod调度的指令还有:cordon、drain、delete,应用这些指令之后后续的pod都不会被调度至该节点
cordon
停止调度
:
影响最小,将节点标记为SchedulingDisabled,新创建的pod不会被调度到该节点,节点原有pod不受影响
kubectl cordon server3
kubectl uncordon server3
drain
驱逐节点
:
首先会驱逐该节点上的pod,在其他节点重建,然后将该节点标记为SchedulingDisabled。
kubectl drain server3
kubectl uncordon server3
delete
删除节点
:
首先驱逐节点上的pod,在其他节点重新创建,然后,从master节点删除该node 。如要恢复调度,需进入node节点,重启kubelet服务.
kubectl delete node server3
在server3端
systemctl restart kubelet #在删掉的节点重新启动kubelet 后可以恢复使用