K8S是通过 list-watch 机制实现每个组件的协同工作
controller-manager、scheduler、kubelet 通过 list-watch 机制监听 apiserver 发出的事件,apiserver 也会监听 etcd 发出的事件
scheduler的调度策略:
预选策略(Predicates):通过调度算法过滤掉不满足条件的node节点;如果没有满足条件的node节点,Pod会处于Pending状态,直到有符合条件的node节点出现
PodFitsResources(根据Pod的requests资源量)、PodFitsHost(根据Pod的nodeName)、PodFitsHostPorts(根据Pod使用的端口)、PodSelectorMatches(根据Pod的节点标签选择器)、NoDiskConflict(根据Pod使用存储卷)
优选策略(Priorities):根据优先级选项为满足预选策略条件的node节点进行优先级排序,最终选择优先级最高的node节点来调度Pod
LeastRequestedPriority(倾向资源使用率更低的节点)、BalancedResourceAllocation(倾向CPU和内存使用率更接近的节点)、ImageLocalityPriority(倾向本地已有要使用的镜像的节点)
标签的管理操作:
kubectl label <资源类型> <资源名称> 标签key=value #添加标签
kubectl label <资源类型> <资源名称> 标签key=value --overwrite #修改标签
kubectl label <资源类型> <资源名称> 标签key- #删除标签
kubectl get <资源类型> [资源名称] --show-labels
kubectl get <资源类型> -l 标签key[=value]
如何指定node节点调度Pod?
键值运算关系
●In:label 的值在某个列表中
●NotIn:label 的值不在某个列表中
●Gt:label 的值大于某个值
●Lt:label 的值小于某个值
●Exists:某个 label 存在
●DoesNotExist:某个 label 不存在
1)使用 nodeName 指定node节点名称
2)使用 nodeSelector 指定node节点的标签
3)使用 节点亲和性、Pod亲和性、Pod反亲和性'
节点亲和:
pod亲和:
pod反亲和:
4)使用 给node节点设置污点,Pod设置容忍
设置容忍:
Pod设置容忍:tolerations(与containers字段同一层级)
spec:
tolerations:
- operator: Exists|Equal
key: 污点key
value: 污点value
effect: NoSchedule|NoExecute|PreferNoSchedule
#其中的 key、vaule、effect 都要与 Node 上设置的 taint 保持一致
#operator 的值为 Exists 将会忽略 value 值,即存在即可
#tolerationSeconds 用于描述当 Pod 需要被驱逐时可以在 Node 上继续保留运行的时间
设置污点:
Kubctl taint node 节点名称 污点key=[value]:类型
类型:NoSchedule(一定不被调度) PreferNoSchedule(尽量不被调度) NoExecute(不会被调度并驱逐Pod)
kubectl taint node 节点名称 污点key-
kubectl describle node 节点名称 | grep - A taints
设置节点不可调度:
kubectl cordon 节点名称
kubectk uncordon 节点名称
kubectl taint node <节点名称> key=:NoSchedule
设置节点不可调度并驱逐Pod
kubectl drain <节点名称> --ignore-daemonsets --delete-emptydir-data --force
kubectl taint node <节点名称> key=:NoExecute