Kubernetes Scheduler 原理分析
Kubernetes Scheduler 在整个系统中起到“承上启下”的重要作用,“承上”是指它负责接收 Controller Manager 创建的新 Pod,为其安 排一个落脚的“家”——目标 Node;“启下”是指安置工作完成后,目标 Node 上的 kubelet 服务进程接管后继工作,负责 Pod 生命周期中的“下半生”。
1.Scheduler 的作用
(1)监听 API Server,获取还没有绑定(bind)到 Node 上的 Pod。
(2)根据预选、优先、抢占策略,将 Pod 调度到合适的 Node 上。
(3)调用 API Server,将调度信息写入到 etcd。
2.Scheduler 的原则
(1)公平。确保每个 Pod 都要被调度,即使因为资源不够而无法调用。
(2)资源合理分配。根据多种策略选择合适的 Node,并且使资源利用率尽量高。
(3)可自定义。内部支持多种调度策略,用户可以选择亲和性、优先级、污点等控制调度结果,另外也支持自定义 Scheduler 的方式进行扩展。
Kubernetes Scheduler 当前提供的默认调度流程分为以下两步。
(1)预选调度过程。即遍历所有目标 Node,筛选出符合要求的候选节点。为此,Kubernetes 内置了多种预选策略(xxx Predicates)供用户选择。
(2)确定最优节点。在第一步的基础上,采用优选策略(xxx Priority)计算出每个候选节点的积分,积分最高者胜出。
3.节点管理
在 Kubernetes 集群中,在每个 Node 上都会启动一个 kubelet 服务的进程。该进程用于处理 Master 下发到本节点的任务,管理 Pod 及 Pod 中的容器。每个 kubelet 进程都会在 API Server 上注册节点自身的信息,定期向 Master 汇报节点资源的使用情况,并通过 cAdvisor 监控容器和节点资源。
节点通过设置 kubelet 的启动参数“--register-node”,来决定是否向 API Server 注册自己。如果该参数的值为 true,那么 kubelet 将尝试通过 API Server 注册自己。
4.Pod 管理
kubelet 通过以下几种方式获取自身 Node 上所要运行的 Pod 清单。
(1)文件。kubelet 启动参数“--config”指定的配置文件目录下的文件(默认目录为“/etc/kubernetes/ manifests/”)。通过--file-check- frequency 设置检查该文件目录的时间间隔,默认为 20 秒。
(2)HTTP 端点(URL)。通过“--manifest-url”参数设置。通过--http-check-frequency 设置检查该 HTTP 端点数据的时间间隔,默认为 20 秒。
(3)API Server。kubelet 通过 API Server 监听 etcd 目录,同步 Pod 列表。
所有以非 API Server 方式创建的 Pod 都称为 Static Pod。kubelet 将 Static Pod 的状态汇报给 API Server,API Server 为该 Static Pod 创建一个 Mirror Pod 与其相匹配。Mirror Pod 的状态将真实反映 Static Pod 的状态。当 Static Pod 被删除时,与之相对应的 Mirror Pod 也会被删除。
5.容器健康检查
Pod 通过以下两类探针来检查容器的健康状态。
(1)一类是 LivenessProbe 探针。用于判断容器是否健康并反馈给 kubelet。如果 LivenessProbe 探针探测到容器不健康,则 kubelet 将删除该容器,并根据容器的重启策略进行相应的处理。如果一个容器不包含 LivenessProbe 探针,那么 kubelet 认为该容器的 LivenessProbe 探针返回的值永远是 Success。
(2)另一类是 ReadinessProbe 探针。用于判断容器是否启动完成,且准备接收请求。如果 ReadinessProbe 探针检测到容器启动失败,则 Pod 的状态将被修改,Endpoint Controller 将从 Service 的 Endpoint 中删除包含该容器所在 Pod 的 IP 地址的 Endpoint 条目。
6.Cadvisor 资源监控
Cadvisor 的特点如下。
(1)Cadvisor 是一个开源的分析容器资源使用率和性能特性的代理工具,它是因容器而生的,因此自然支持 Docker 容器。
(2)在 Kubernetes 项目中,Cadvisor 被集成到 Kubernetes 代码中,kubelet 则通过 Cadvisor 获取其所在节点及容器的数据。
(3)Cadvisor 自动查找所有在其所在 Node 上的容器,自动采集 CPU、内存、文件系统和网络使用的统计信息。
(4)在大部分 Kubernetes 集群中,Cadvisor 通过它所在 Node 的 4194 端口暴露一个简单的 UI。
版权声明: 本文为 InfoQ 作者【穿过生命散发芬芳】的原创文章。
原文链接:【http://xie.infoq.cn/article/87121a53ec6d9e2cb9842dfc4】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论