9-2 Scheduler--- 玩转pod调度(上)
调度过程
首先需要知道调度哪个pod,pod的信息 pod的信息需要去优先级队列里拿.优先级队列用于存储等待调度的pod的信息,每个pod并不是对等,优先级高的需要提前调度.
informer会通用apiserver 去监听etcd的数据变化,如果发现有等待调度的pod,那就把pod的信息放到优先级队列中,然后informer的工作就完成了.然后循环开始工作.(新增的pod在刚刚创建的时候是没有nodeName的,只有在调度之后才会有.)
cache会从apiserver 拿到节点列表,以及节点的详细信息(cpu mem disk images pods),并缓存在cache中.
然后开始调度,调度一般分为两步,1 预选策略(predicate) 排除不满足要求的节点 剩余的资源满足要求,端口不冲突,vpc满足需要,node状态属于健康. 2 优选策略,对上述节点进行评分,选择最高分的node 成为最终调度的节点.
然后Pod和Node就建立一个绑定关系,并把信息告诉apiserver,然后apiserver就会去更新pod的nodename的字段.
然后指定node上的kubelet会把服务给调度起来
可以通过修改label,影响这个预选策略.
实践
创建 web-dev-node.yaml
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 表示或的关系
nodeSelectorTerms:
# 匹配一个表达式 必须是
- matchExpressions:
- key: beta.kubernetes.io/arch
operator: In
values:
- amd64
# 最好是满足条件 不过没有也没关系
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 1
preference:
matchExpressions:
- key: disktype
operator: NotIn
values:
- ssd
查看node架构
kubectl get nodes
kubectl get nodes kubernetes-node-03 -o yaml
kubectl apply -f web-dev-node.yaml
的确是调度在不是ssd的node上
如果架构不满足 pod会处于pending状态,可以通过describe 查看pending的原因.