了解Kubernetes调度程序如何发现新的pod并将它们分配给节点。Kubernetes已成为容器和容器化工作负载的标准编排引擎。它提供了一个跨公共和私有云环境的通用开源抽象层。对于那些已经熟悉Kuberbetes及其组件的人来说,讨论通常围绕着如何充分利用Kuberbetes。但是当你刚刚开始学习Kubernetes时,在尝试将其用于生产环境之前,开始学习一些Kubernetes相关组件(包括Kubernetes调度器)是明智的,如下抽象视图所示:Kubernetes也是分为controlplane和WorkerNodes:ControlPlane:也称为master,负责集群的全局决策,以及检测和响应集群事件。控制平面组件包括:etcdkube-apiserverkube-controller-managerscheduler工作节点:也称为节点,这些节点是工作负载所在的地方。它始终与主节点保持联系,以获取工作负载运行所需的信息,并与集群外部进行通信和连接。工作节点组件包括:kubeletkube-proxyCRI我希望这些背景信息可以帮助您了解Kubernetes组件是如何绑定在一起的。Kubernetes调度程序如何工作一个Kubernetespodpod由一个或多个共享存储和网络资源的容器组成。Kubernetes调度器的工作是确保每个pod都被分配到一个节点上运行。(LCTT译注:容器技术领域大量使用航海比喻,pod这个词的意思是“豆荚”,在航海领域指的是“豆荚”——都是指盛装多个物品的容器。经常不翻译,考虑到上下文,可译为“豆荚”。)在高层次上,Kubernetes调度器是这样工作的:每个需要调度的pod都需要添加到队列中。当创建新的pod时,它们也将被添加到队列中。scheduler源码(scheduler.go)很大,大约9000行,相当复杂,但是解决了重要的问题:wait/monitorpodcreation的代码监控pod创建的代码从scheduler.go的8970行开始,keepswaitingfornewpod://Run开始监视和调度。它等待缓存同步,然后启动一个goroutine并立即返回。func(sched*Scheduler)Run(){if!sched.config.WaitForCacheSync(){return}gowait.Until(sched.scheduleOne,0,sched.config.StopEverything)Thecoderesponsibleforqueuingthepods负责对pod进行排队的函数是://queueforpodsthatneedsschedulingpodQueue*cache.FIFO负责对pod进行排队的代码从scheduler的第7360行开始。去。此代码在事件处理程序触发时将新的pod排入队列,表明新的pod可用:func(f*ConfigFactory)getNextPod()*v1.Pod{for{pod:=cache.Pop(f.podQueue).(*v1.Pod)iff.ResponsibleForPod(pod){glog.V(4).Infof("Abouttotryandschedulepod%v",pod.Name)returnpod}}}handleerrors代码难免遇到调度错误pod调度。下面的代码是如何处理调度器错误的。它监听podInformer并抛出一个错误,指出此pod尚未被调度并被终止://scheduledpodcachepodInformer.Informer().AddEventHandler(cache.FilteringResourceEventHandler{FilterFunc:func(objinterface{})bool{switcht:=obj.(type){case*v1.Pod:returnassignedNonTerminatedPod(t)default:runtime.HandleError(fmt.Errorf("unabletohandleobjectin%T:%T",c,obj))returnfalse}}换句话说,Kubernetes调度器负责以下工作:将新创建的Pod调度到有足够空间满足Pod资源需求的节点上。监听kube-apiserver和controller以查看是否创建了新的Pod,然后进行调度它转到集群中的一个可用节点。监听未调度的pod并使用/bindingsubresourceAPI将pod绑定到一个节点。例如,假设您正在部署一个需要1GB内存和双核CPU的应用程序。所以创建应用程序需要有足够的资源es在pod的节点上可用,然后调度程序将继续运行以查看是否有要调度的pod。了解更多要使Kubernetes集群正常工作,您需要让上述所有组件同步运行。调度程序是一段复杂的代码,但Kubernetes是一款很棒的软件,在讨论或采用云原生应用程序时,它仍然是我们的首选。学习Kubernetes需要付出努力和时间,但将其作为您的专业技能之一可以为您的职业带来优势和回报。有很多很好的学习资源,官方文档也很棒。如果您有兴趣了解更多信息,我建议您从:KubernetesthehardwayKubernetesthehardwayonbaremetalKubernetesthehardwayonAWS
