一、k8s的架构及工作原理
基本架构
1. Master
K8S中的Master是集群控制节点,负责整个集群的管理和控制,其中master节点的基本组件有:
- apiserver:提供了k8s各类资源对象(pod,RC,Service等)的增删改查及watch等HTTP Rest接口,是整个系统的数据总线和数据中心。
- controller-manager:负责对所有资源对象进行控制,通过 apiserver 监控整个集群的状态,并确保集群处于预期的工作状态。
- scheduler:负责资源调度的进程,通过API Server的Watch接口监听新建Pod副本信息,并通过调度算法为该Pod选择一个最合适的Node。
- etcd:负责保存k8s里的所有资源对象以及状态的数据。
2.Node
Node是k8s集群中的工作节点,每个Node都会被Master分配一些进程,当某个Node发生异常时,其上的工作负载会被Master自动转移到其他节点上,node节点的基本组件包括:
- kubelet:负责Pod对应的容器的创建等任务,同时与Master密切协作,实现集群管理的基本功能
- kube-proxy:实现svc的通信与负载均衡机制的重要组件。
- Docker Engine:就是docker,负责本node节点上的容器的创建与管理。
在默认情况下Kubelet会向Master注册自己,一旦Node被纳入集群管理范围,kubelet进程就会定时向Master汇报自身的信息(例如机器的CPU和内存情况以及有哪些Pod在运行等),这样Master就可以获知每个Node的资源使用情况,并实现高效均衡的资源调度策略。而某个Node在超过指定时间不上报信息时,会被Master判定为失败,Node的状态被标记为不可用,随后Master会触发工作负载转移的自动流程
工作原理
创建pod的过程
- 用户通过kubectl命令行工具发送创建pod的请求
- apiserver处理用户请求,并将pod数据存储到etcd
- scheduler通过apiserver的watch机制,查看到新的pod,并为pod绑定node
- 绑定过程中需要过滤掉有污点的node,污点包括主观上不想调用的node,一般会被用户主动打上污点,另外还有被自动打上的污点,包括资源被限制的node(内存或者磁盘不符合pod的标准,空间不足等),node状态异常的(Ready处于false或者unknown状态)等。
- 在过滤后留下来的主机中选择最合适的node节点,比如负载最低的节点,将不同副本分布在不同节点上等等,最终得到最优化的节点,并将数据存入etcd
- 之后kubelet根据调度结果执行Pod创建操作,在相应节点上,使用docker engine根据相应的镜像创建相对应的容器,产生所需的pod节点。
- pod开始正常运行之后,由controller-manager来管理副本数等。
- pod节点创建成功!
集群调度
简介
Scheduler 是 kubernetes 的调度器,主要的任务是把定义的 pod 分配到集群的节点上。听起来非常简单,但有很多要考虑的问题:
- 公平:如何保证每个节点都能被分配资源
- 资源高效利用:集群所有资源最大化被使用
- 效率:调度的性能要好,能够尽快地对大批量的 pod 完成调度工作
- 灵活:允许用户根据自己的需求控制调度的逻辑
Sheduler 是作为单独的程序运行的,启动之后会一直监听 API Server,获取Pod中Sp