你是我兄弟,Kubernetes 调度器完成初探,lol半价

Kubernetes 是一个根据容器的分布式调度器,完结了自己的调度模块。

在Kubernetes集群中,调度器作为一个独立模块经过pod运转。从几个方面介绍Kubernetes调度器。

Kubernetes中的调度器,是作为独自组件运转,一般运转在Master中,和Master数量保持一致。经过Raft协议选出一个实例作为Leader作业,其他实例Backup。 当Master毛病,其他实例之间持续经过Raft协议选出新的Master卢海鹏试咪作业。

其作业形式如下:

kube-scheduling 是一个独立运转的组件,首要作业内容在 Run 函数 。

这里边首要做几件工作:

调度核心内容在 sched.run() 函数,它会发动一个go routine不断运转sched.scheduleOne, 每次运转代表一个调度周期。

func (sched *Scheduler) Run() {

if你是我兄弟,Kubernetes 调度器完结初探,lol半价 !sched.config.WaitForCacheSync() {

return

}

go wait.Until(sched.scheduleOne, 0, sched.config.StopEverything)

}

咱们看下 sched.scheduleOne 首要做什么

func (sched *Scheduler) scheduleOne() {

pod := sched.config.NextPod()

.... // do some pre check

scheduleResult, err := sched.schedule(pod)

if err != nil {

if fitError, ok := err.(*core.FitError); ok {

if !util.PodPriorityEnabled() || sched.config.DisablePreemption {

..... // do some log

} else {

sched.preempt(pod, fitError)

}

}

}

...

// Assume volumes first before assuming the pod.

allBound, err := sched.assumeVolumes(assumedPod, scheduleResult.SuggestedHost)

...

fo func() {

// Bind volumes first before Pod

if !allBoun你是我兄弟,Kubernetes 调度器完结初探,lol半价d {

err := sched.bindVolumes(assumedPod)

if err != nil {

klog.Errorf("error binding volumes: %v", err)

metrics.PodScheduleErrors.Inc()

return

}

}

err := sched.bind(assumedPod, &v1.Binding{

ObjectMeta: metav1.ObjectMeta{Namespace: assumedPod.Namespace, Name:VGpro assumedPod.Name, UID: assumedPod.UID},

Target: v1.ObjectReference{

Kind: "Node",

Name: scheduleResult.SuggestedHost,

},

})

}

}

在sched.scheduleOne 中,首要会做几件工作

sched.schedule 是首要的pod调度逻辑

func (g *genericScheduler) Schedule(pod *v1.Pod, nodeLister algorithm.NodeList4tuber) (result ScheduleResult, err error) {

// Get node list

nodes, err := nodeLister.List()

// Filter

filteredNodes, failedPredicateMap, err := g.findNodesThatFit(pod, nodes)

if err != nil {

return result, err

}

// Priority

priorityList, err := PrioritizeNodes(p刘丰od, g.cachedNodeInfoMap, metaPrioritiesInterfa95117是什么电话ce, g.prioritize何加男rs, filteredNodes, g.extenders)

if err != nil {

return result, err

}

// SelectHost

host, err := g.selectHost(priorityList)

return ScheduleResult{

SuggestedHost: host,

四喜丸子的做法

EvaluatedNodes: len(filteredNodes) + len(failedPredicateMap),

FeasibleNodes: len(filteredNodes),

}, err

}

空手指

调度首要分为三个步奏:

接下来咱们持续拆解, 别离看下这三个步奏会怎么做

Filters

Filters 相比照较简单,调度器默许注册了一系列的predicates办法, 调度进程为并发调用每个节点的predicates 办法。终究得到一个node list,包括符你是我兄弟,Kubernetes 调度器完结初探,lol半价合条件的节点目标。

func (g *genericScheduler) findNodesThatFit(pod *v1.Pod, nodes []*v1.Node) ([]*v1.Node, FailedPredicateMap, error) {

if len(g.predicates) == 0 {

filtered = nodes

} else {

allNodes := int32(g.cache.NodeTree().NumNodes())

numNodesToFind := g.numFeasibleNodesToFind(allNodes)

checkNode := func(i int) {

nodeName := g.cache.NodeTree().Next()

// 此处会调用这个节点的一切predicates 办法

fits, failedPredicates, err := podFitsOnNode(

pod,

meta,

g.cachedNodeInfoMap[node济州岛气候Name],

g.predicates,

g.schedulingQueue,

g.alwaysCheckAllPredicates,

)

if fits {

length := atomic.AddInt32(&filteredLen, 1阿飞正传)

if length > numNodesToFind {

// 假如当时契合条件的节点数现已满意,会中止核算。

cancel()

atomic.AddInt32(&filteredLen, -1)

} else {

甜甜的

filtered[length-1] = g.cachedNodeInfoMap[nodeName].Node()

}

}

}

// 并发调用checkNode 办法

workqueue.ParallelizeUntil(ctx, 16, int(allNodes), checkNode)

filtered = filtered[:fil你是我兄弟,Kubernetes 调度器完结初探,lol半价te和妈妈啪啪啪redLen]

}

return filtered, failedPredicateMap, nil

}

值得注意的是, 1.13中引入了FeasibleNodes 机制,为了进步大规模集群的调度功能。答应咱们经过bad-percentage-of-nodes-to-score 参数, 设置filter的核算份额(默许50%), 当节点数大于100个, 在 filters的进程,只需满意条件的节点数超越这个份额,就会中止filter进程,而不是核算悉数节点。

举个比如,当节点数为1000, 咱们设置的核算份额为30%,那么调度器以为filter进程只需要找到满意条件的300个节点,filt你是我兄弟,Kubernetes 调度器完结初探,lol半价er进程中当满意条件的节点数到达300个,filter进程结束。 这样filter不必核算悉数的节点,相同也会下降P五花肉的做法大全rioritize 的核算数量。 可是带来的影响是pod有或许没有被调度到最合适的节点。

Prioritize

Prioritize 的意图是协助pod,为每个契合条件的节点打分,协助pod找到最合变形计20140616适的节点。相同调度器默许注册了一系列Prioritize办法。这是Prioritize 目标的数据结构

// PriorityConfig is a config used for a priority function.

type PriorityConfig struct {

Name string

Map PriorityMapFunction

Reduce PriorityReduceFunction

// TODO: Remove it after migrating恋老 all functions to

// Map-Reduce pattern.

Function PriorityFunction

Weight int

}

每个PriorityConfig 代表一个评分的目标,会考虑效劳的均衡性,节点的资源分配等要素。 一个 PriorityConfig 的首要Scoring进程分为 Map和Reduce,

一切PriorityConfig 核算结束后,将每个PriorityConfig的数值乘以对应的权重,并依照节点再做一次聚合。

wo微米手作rkqueue.ParallelizeUntil(context.TODO(), 16, len(nodes), func(in僵尸夜总会dex int) {

nodeInfo := nodeNameToInfo[nodes[index].Name]

for i := range priorityConfigs {

var err error

results[i][index], err = priorityConfigs[i].Map(pod, meta, nodeInfo)

}

})

for i := range priorityConfihavalgs {

wg.Add(1)

go func(index int) {

defer wg.Done()

if err := priorityConfigs[index].Reduce(pod, meta, nodeNameToInfo, results[index]);

}(i)

}

wg.Wait()

// Summarize all scores.

result := make(schedulerapi.HostPriorityLis涉川刚气t, 0, len(nodes))

for i := range nodes {

result = append(result, schedulerapi.HostPriority{Host: nodes[i].Name, Score: 0})

for j := range priorityConfigs {

result[i].Score += results[j][i].Score * priorityConfigs[j].Weight

}

}

此外Filter和Prioritize 都支撑extener scheduler 的你是我兄弟,Kubernetes 调度器完结初探,lol半价调用,本文不做过多论述。

现在kubernetes调度器的调度办法是Pod-by-Pod,也是当时调度器缺乏的当地。首要瓶颈如下

社你是我兄弟,Kubernetes 调度器完结初探,lol半价区调度器的开展,也是为了处理这些问题

接下来,咱们会剖析一个详细的调度器办法完结,协助了解拆解调度器的进程。 而且重视剖析调度器的社区动态。

https://medium.com/jorgeacetozi/kubernetes-master-components-etcd-api-server-controller-manager-and-scheduler-3a0179fc8186

https://jvns.ca/blog/2017/07/27/how-does-the-kubernetes-scheduler-work/

本文作者:萧元

原文链接:https://yq.aliyun.com/articles/689495?utm_content=g_1000048854

本文为云栖社区原创内容,未经答应不得转载。

规划 Master 比照
声明:该文观念仅代表作者自己,搜狐号系信息发布渠道,搜狐仅供给信息存储空间效劳。

转载原创文章请注明,转载自188bet官网_188bet金宝搏官网下载_wellbet188官网,原文地址:http://www.cheap8cialis.com/articles/66.html

上一篇:中青旅,年报发布亏12.5亿 佳云科技成绩严峻下滑,美甲

下一篇:浙江财经大学,郎平慧眼识人,年青小将迎来迸发,世锦赛没她真不可!,苹果电影