陈斯佳
第四十二课:Kubernetes默认调度器调度策略解析
Predicates在调度过程中的作用,可以理解为Filter,也就是按照调度策略从当前的集群所有节点中“过滤”出一些符合条件的节点来运行调度的 Pod。
默认的调度策略有三种,一种是GerenalPredicates,负责最基础的调度策略,比如计算宿主机CPU和内存资源等是否够用的PodFitsResource;还有检查宿主机名字是否和Pod的spec.nodeName一致的PodFitsHost。第二类是和Volume相关的过滤规则,比如NoDiskConflict是检查多个Pod申明挂载的持久化Volume是否有冲突。第三类是宿主机相关的过滤条件,主要考察待调度的Pod是否满足Node本身条件,比PodToleratesNodeTaints,负责检查Node 的“污点”taint机制,而 NodeMemoryPressurePredicate,检查的是当前节点的内存是不是已经不够充足,如果是的话,那么待调度 Pod 就不能被调度到该节点上。第四种类型是和Pod相关的过滤规则,这一组规则,跟 GeneralPredicates 大多数是重合的。而比较特殊的,是 PodAffinityPredicate。在具体执行的时候, 当开始调度一个 Pod 时,Kubernetes 调度器会同时启动 16 个 Goroutine,来并发地为集群里的所有 Node 计算 Predicates,最后返回可以运行这个 Pod 的宿主机列表。
在 Predicates 阶段完成了节点的“过滤”之后,Priorities 阶段的工作就是为这些节点打分。这里打分的范围是 0-10 分,得分最高的节点就是最后被 Pod 绑定的最佳节点。Priorities 里最常用到的一个打分规则,是LeastRequestedPriority。这个算法实际上就是在选择空闲资源(CPU 和 Memory)最多的宿主机。此外,还有 NodeAffinityPriority、TaintTolerationPriority 和 InterPodAffinityPriority 这三种 Priority。在默认 Priorities 里,还有一个叫作 ImageLocalityPriority 的策略。它是在 Kubernetes v1.12 里新开启的调度规则,即:如果待调度 Pod 需要使用的镜像很大,并且已经存在于某些 Node 上,那么这些 Node 的得分就会比较高。
2021-11-03
12
勤劳的小胖子-libo
凭这篇Istio的文章就值回票价。
2021-03-04
3
我在睡觉
老师这节课讲的ingress是一个7层负载均衡
用ingress是否可以搭建一个4层负载均衡?
2021-01-20
2
我在睡觉
是否也可以用云提供的7层负载均衡器+nodeport形式实现的ingress效果。这样做效率是否会更高?
2021-01-20
我在睡觉
是否也可以用云提供的7层负载均衡器+nodeport形式实现的ingress效果。这样做效率是否会更高?
2021-01-20
1
沈洪彬
没看直接做,50分,看了一半做了一下,35分。 看完了做能多少分-_-
2021-01-18
7
张裕尧
有一个问题想请教一下,Flannel 项目为什么不添加NetworkPolicy的功能呢?Flannel应该也可以有能力在宿主机上创建iptables
2021-01-17
单朋荣
calico:
通过veth pair路由规则,实现直接在二层网络通信;对不同子网的三层网络通信,使用ipip来再次封装一次ip包,实现外部的寻址。
flannel vxlan:
它在三层网络外层,又做了一次二层链路寻址(避免tun0的用户态到内核态的切换开销);
mac地址是各个flannel.1的地址,flannel.1所在主机地址,都可以由flannel进程从etcd中获取到。
张老师,这两种方式性能差别在什么地方啊?谢谢!!
2021-01-14
1
单朋荣
把握几个核心,然后串起来,其它需要的东西再去拿就可以了。
问题牵引:
网络方案是谁?它和“CNI标准”的关系(实现)是?kubernetes网络配置由谁来完成?(或者说我要怎么做才能实现它??)
核心支撑点:
1、flannel网络方案本身
2、CNI插件,这里是内置的Flannel插件
3、dockershim(DRI)
两个背景知识:
1、CNI 的设计思想:Kubernetes 在启动 Infra 容器之后,就可以直接调用 CNI 网络插件,为这个 Infra 容器的 Network Namespace,配置符合预期的网络栈。
2、建立网络的“三类”基础组件/可执行文件。
串线(着重描述三个核心点之间的串联关系):
kubelet 创建 Pod ->创建 Infra 容器。主要是由(CRI)**dockershim **调用 Docker API 创建并启动 Infra 容器-> SetUpPod方法。方法的作用是:1.为 CNI 插件准备参数,2.然后调用 CNI 插件为 Infra 容器配置网络。
1.所需参数->实现ADD/DEL方法->CNI插件(*flannel插件*)实现。:
1.1参数一:由 dockershim 设置的一组 CNI 环境变量,ADD/DEL方法参数。
1.2参数二:是 dockershim 从 CNI “配置文件”里加载到的、默认插件的配置信息;由*flannel网络方案本身*安装时生成。
2.调用 CNI 插件:
引:"dockershim 对 *Flannel CNI 插件*的调用,其实就是走了个过场。Flannel CNI 插件唯一需要做的,就是对 dockershim 传来的 Network Configuration (CNI配置文件)进行补充。"
接下来,Flannel CNI 插件->调用 CNI bridge 插件(参数一:“CNI环境变量/ADD", 参数二:”Network Confiuration/Delegate"),-->“代表”Flannel,将容器加入CNI网络(cni0网桥)。
2021-01-14
28
Jay66
golang程序如果用容器发布,程序内指定了可执行的cpu数,实际上这个是取决于宿主机的cpu数?因为内核是一样的么?
2021-01-13
1
编辑推荐
包含这门课的学习路径
架构师
28门课程 151.9w人学习
运维工程师
32门课程 149.1w人学习
云原生工程师
14门课程 86.5w人学习
后端工程师
27门课程 184.1w人学习
看过的人还看了