这是我参与「第四届青训营 」笔记创作活动的第18天。
深入理解 K8S 资源管理和调度
什么是K8S?
Kubernetes是一个开源的,用于管理云平台中多个主机上的容器化的应用。 Kubernetes的目标是让部署容器化的应用简单高效。 Kubernetes提供了应用部署、规划、更新、维护的一种机制。 在Kubenetes中,所有的容器均在Pod中运行,一个Pod可以承载一个或者多个相关的容器。同一个Pod中的容器会部署在同一个物理机器上并且能够共享资源。 一个Pod也可以包含0个或者多个磁盘卷,即volumes,这些卷组将会以目录的形式提供给一个容器,或者被所有Pod中的容器共享。
资源管理
-
在kubernetes中,所有的内容都抽象为资源,用户需要通过操作资源来管理kubernetes。
-
由于kubernetes的本质上就是一个集群系统,用户可以在集群中部署各种服务,所谓的部署服务,其实就是在kubernetes集群中运行一个个的容器,并将指定的程序跑在容器中。
-
kubernetes的最小管理单元是pod而不是容器,所以只能将容器放在Pod中,而kubernetes一般也不会直接管理Pod,而是通过Pod控制器来管理Pod的。
-
Pod可以提供服务之后,就要考虑如何访问Pod中服务,kubernetes提供了Service资源实现这个功能。
-
但是,如果Pod中程序的数据需要持久化,kubernetes还提供了各种存储系统。
资源管理方式
- 命令式对象管理:直接使用命令去操作kubernetes资源
- 命令式对象配置:通过命令配置和配置文件去操作kubernetes资源
- 声明式对象配置:通过apply命令和配置文件去操作kubernetes资源
k8s的资源调度策略
操作系统中,对于一个进程来说,如果希望运行必须需要cpu和存储,同样的道理一个pod想要运行,也必须有这两部分,于是k8s把pod运行所需要的资源划分成了两大类:可压缩资源和不可压缩资源。
可压缩资源:指的是cpu这一类资源,这类资源的特点是,在资源不够的时候,只会导致pod等运行的时间越来越久也就是会导致“饥饿”,并不会退出。
不可压缩资源:指的是mem这一类,一旦资源不足,就会被内核杀死,并强制pod退出。
K8S的调度过程
在 Kubernetes 项目中,默认调度器的主要职责,就是为给一个新创建出来的 Pod,寻找一个最合适的节点。主要有两步操作:
1、从集群所有的节点中,根据调度算法挑选出所有可以运行该 Pod 的节点;
2、从第一步的结果中,再根据调度算法挑选一个最符合条件的节点作为最终结果。
调度流程:
1.默认调度器会首先调用一组叫作 Predicate 的调度算法,来检查每个 Node。
2.再调用一组叫作 Priority 的调度算法,来给上一步得到的结果里的每个 Node进行打分,最终的调度结果,就是得分最高的那个 Node。
3.调度器对一个 Pod 调度成功,实际上就是将它的 spec.nodeName 字段填上调度结果的节点名字。