一文带你看透kubernetes 容器编排系统 (6)

每个节点通过优选策略时都会算出一个得分,计算各项得分,最终选出得分值最大的节点作为优选的结果(也是调度算法的结果)。LeastRequestedPriority,选择资源消耗最小节点:

(1)计算出所有备选节点上运行的pod和备选pod的CPU占用量totalMilliCPU

(2)计算出所有备选节点上运行的pod和备选pod的内存占用量totalMomory

(3)计算每个节点的得分,计算规则大致如下: score=int(((nodeCpuCapacity-totalMilliCPU)10)/nodeCpuCapacity+((nodeMemoryCapacity-totalMemory)10/nodeMemoryCapacity)/2) CalculateNodeLabelPriority,根据CheckNodeLabelPresence策略打分 BalancedResourceAllocation,选择资源使用最均衡节点

(1)计算出所有备选节点上运行的pod和备选pod的CPU占用量totalMilliCPU

(2)计算出所有备选节点上运行的pod和备选pod的内存占用量totalMomory

(3)计算每个节点的得分,计算规则大致如下: score=int(10-math.abs(totalMilliCPU/nodeCpuCapacity-totalMemory/nodeMemoryCapacity) * 10)

节点管理

节点管理包含节点的注册、状态上报、Pod管理、容器健康检查、资源监控等部分。

img

节点注册

在kubernetes集群中,在每个node节点上都会启动一个kubelet服务进程。该进程用于处理master节点下发到本节点的任务,管理pod及pod中的容器。每个kubelet进程会在API Server上注册节点自身信息,定期向master节点汇报节点资源使用情况,并通过cAdvisor监控容器和节点资源。

节点通过设置kubelet的启动参数“—register-node”,来决定是否向API Server注册自己。如果该参数为true,那么kubelet将试着通过API Server注册自己。作为自注册,kubelet启动还包含下列参数:

--api-servers,告诉kubelet API Server的位置; --kubeconfig,告诉kubelet在哪儿可以找到用于访问API Server的证书; --cloud-provider,告诉kubelet如何从云服务商(IAAS)那里读取到和自己相关的元数据。

状态上报

kubelet在启动时通过API Server注册节点,并定时向API Server发送节点新消息,API Server在接收到这些信息后,将这些信息写入etcd。通过kubelet的启动参数“—node-status-update-frequency”设置kubelet每隔多少时间向API Server报告节点状态,默认为10秒。

Pod管理

kubelet通过以下几种方式获取自身node上所要运行的pod清单: (1)文件:kubelet启动参数“--config”指定的配置文件目录下的文件。通过—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也会被删除。Kubelet通过API Server client使用watch+list的方式监听“/registry/node/<当前node名称>”和“/registry/pods”目录,将获取的信息同步到本地缓存中。

kubelet监听etcd,所有针对pod的操作将会被kubelet监听到。如果发现有新的绑定到本节点的pod,则按照pod清单的要求创建该pod。如果发现本地的pod被修改,则kubelet会做出相应的修改,如删除pod中的某个容器时,则通过docker client删除该容器。如果发现删除本节点的pod,则删除相应的pod,并通过docker client删除pod中的容器。

kubelet读取监听到的信息,如果是创建和修改pod任务,则做如下处理:

(1)为该pod创建一个数据目录。

(2)从API Server读取该pod清单。

(3)为该pod挂载外部卷(Extenal Volume)。

(4)下载pod用到的secret。

(5)检查已经运行在节点中的pod,如果该 pod没有容器或pause容器没有启动,则先停止pod里所有容器进程。如果在pod中有需要删除的容器,则删除这些容器。

(6)用“kubernetes/pause”镜像为每个pod创建一个容器,该pause容器用于接管pod中所有其他容器的网络。

(7)为pod中的每个容器做如下处理:

为容器计算一个hash值,然后用容器的名字去docker查询对应容器的hash值。若查到容器,且两者hash值不同,则停止docker中容器进程,并停止与之关联的pause容器进程;若两者相同不做任何处理。

如果容器被中止了,且容器没有指定的restartPolicy(重启策略),则不做任何处理。

调用docker client下载容器镜像,调用docker client运行容器。

容器健康检查

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyygxf.html