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的原因.