Kubernetes和Mesos集成的優勢與原理
大小:0.8 MB 人氣: 2017-10-12 需要積分:1
Apache Mesos是一款開源集群管理軟件,由加州大學伯克利分校的AMPLab首先開發;支持Hadoop、ElasticSearch、Spark、Storm 和Kafka等架構。Mesos 為上層的應用框架提供了資源共享,資源監控,動態擴容等集群管理功能。由于其穩定、通用等特性,越來越受到大型公司的青睞,例如Twitter、Facebook、Apple等都在生產環境中使用Mesos進行集群管理。
集成優勢
Kubernetes worker節點自動擴展
一個普通的Kubernetes集群會包含若干臺Master和Worker節點,這些都需要用戶手動或者通過腳本去安裝,如果想實現Kubernets Auto Scaling的話,需要將Kubernetes部署在一個IaaS的云平臺之上,通過云平臺對Kubernetes提供資源,同時對Kubernets監控,根據負載進行自動擴展,但是Kubernetes和云平臺的集成稍顯厚重。
Kubernetes和Mesos集成完成之后,也可以實現Worker節點的自動擴展,所有Worker節點都是自動創建的,不需要用戶手動干預。詳細信息在“集成原理”會介紹。
資源共享
一旦Mesos和Kubernetes集成完成之后,Kubernetes會作為Mesos的一個Framework運行在Mesos之上。因為一個Mesos可以同時為多個Framework提供資源,當Kubernetes作為Mesos的一個Framework之后,Mesos就可以實現Kubernetes和其它Framework之間的資源共享。
集成原理
在Kuberntes與Mesos的集成中,Kubernetes的Scheduler會作為Mesos的Framework對Pod與Offer進行匹配;而Kubernetes 的 kubelet 與 kube-proxy則會被新增加的Mesos Executor進行管理來啟動相應的Worker并對網絡進行配置,從而達到動態擴容的需求。
Kubernetes 與 Mesos集成中包含了多個方面內容;本文的將主要集中介紹資源調度相關部分,后續會有文章介紹其它集成點,如資源執行,環境搭建,測試等等。
Kubernetes Worker節點的創建
K8sm的kubernetes worker節點是動態創建的,不需要用戶手動創建。創建流程如下:
1) 當k8sm的framework注冊成功后,馬上就會收到Mesos發來的Offer。因為Mesos的Offer都是Coarse-grained Offer,所以當前發來的Offer會包含整個host的全部資源。
2) K8sm scheduler收到Offer后,會首先檢查當前的Offer是不是合法的,所謂的合法Offer,需要滿足兩個條件,第一個就當前的這個Offer的資源來自于Kubernetes的某個worker節點,第二個是當前Offer的ExeuctorId必須是沒有或者只有一個,并且Offere的ExeuctorId和k8sm scheduler啟動時設置的ExeuctorId相同。但是在k8s剛注冊的時候,是沒有任何worker節點的,這時候k8sm的scheduler做的事情就是Decline這個Offer,即把這個Offer返回給Mesos,但是會把這個Offer對應的host為Kubernetes創建一個worker節點。一個合法的Offer需要滿足一下幾個條件:
● 當前Offer的資源來自于Kubernetes的某個worker節點。
● 當前Offer的ExeuctorId必須是沒有或者只有一個,并且Offer的ExeuctorId和k8sm scheduler啟動時設置的ExeuctorId相同。
● 如果當前Offer中只有一個ExecutorId,是否有效合法取決Agent的屬性是否有變化:如果屬性沒有變化,認為Offer是合法的;否則認為是無效的。
3) 如此周而復始,一直將Mesos集群中所有的節點加入Kubernetes的worker節點。
4) 當有新的Mesos節點加入Mesos集群時,新加入的節點也會給k8sm scheduler發Offer,k8sm scheduler會將新加入的Mesos節點創建為一個Kunernetes的worker節點。
5) 所有的Kubenetes worker節點都會存在etcd中。用戶可以通過命令“kubectl get nodes”或者直接使用“etcdctl”查看Kubenetes中的所有worker節點。
當Kubernetes Worker節點創建完成后,Mesos再發Offer時,如果發現當前Offer的Host是Kubernetes的一個Worker節點,k8sm scheduler就會把這個Offer作為一個合法的Offer,同時將該Offer緩存起來,默認的緩存時間是5s.
Offer生命周期管理
Framework 實現了 Mesos 的 SchedulerDriver接口;該接口用于Mesos 和 Framework之間的交互。當k8sm scheduler啟動后,會創建一個名為 OfferStorage 的 go routine 用于 Offer 的生命周期管理。下面會根據Offer的創建,使用及銷毀三個階段對Offer進行分析。
Offer的創建
如上文描述的,當Framework注冊到Mesos上后,Mesos會定期 (–allocation_interval) 向Framework發送Offer。k8sm scheduler 通過以下的原則檢測收到的Offer是否合法;如果合法,則放入Offer的緩存中;否則把資源返回給Mesos。
當對Offer進行緩存時,會有兩個隊列對Offer信息進行存儲:delayed 和 Offers。Offers 用于Pod的運行;而當Offer銷毀時會使用 delayed 隊列;具體的銷毀過程會在”Offer的銷毀”進行分析。
Offer的使用
在k8sm scheduler啟動后,會有一個go routine周期性的檢查是不是有新的Pod創建請求。如果有新的Pod創建請求,將這個請求放入k8sm scheduler的任務隊列。k8sm scheduler會從這個任務隊列取出需要創建的Pod進行調度,調度的主要目的是為當前的Pod找到合適的服務器來運行。
因為Kubernetes是作為Mesos的framework來運行的,所以對Offer的使用主要由兩個API來處理:ResourceOffers和LaunchTask。但是對Offer的處理可以主要分為三部分:獲取Offer,關聯Task和Offer,執行task。每一個Task對應一個Pod。
獲取Offer
Offer主要是通過ResourceOffer獲取的。這個API是Mesos Framework的API,所有的Frameworkd都需要實現這個API用來接收從Mesos發送來的Offer。前邊已經講了ResourceOffer會觸發添加新的Kuernetes worker節點,同時這個Offer會被緩存起來,緩存時間可以通過參數配置,默認是5s。
關聯Task和Offer
在k8sm scheduler啟動后,會有一個go routine周期性的檢查是不是有新的Pod創建請求。如果有新的Pod創建請求,將這個請求放入k8sm scheduler的任務隊列。k8sm scheduler會從這個任務隊列取出需要創建的Pod進行調度。
在對Pod進行調度的時候,k8sm scheduler回選擇將Task和Offer關聯。k8sm scheudler現在默認是FCFS算法調度。FCFS對Pod進行調度的時候,主要是為Task挑選合適的Offer,對當前緩存的Offer逐個進行校驗,直到為當前的Task選出合適Offer。對Offer的選擇主要通過四個方法來進行檢驗:
1) 第一個校驗是Node的校驗,主要是檢查當前Offer的host是不是可以被當前的Pod使用。因為Pod在創建的時候,可以直接在Pod的YAML文件中指定創建的host或者NodeSelector,Node的校驗主要是檢查當前Offer的host是不是可以為這個Pod所用。如果當前的Host可以為Pod所用,那么當前的Node校驗就會把Host作為隨后校驗的參數;反之則校驗下一個Offer。
2) 第二個校驗是Pod的資源校驗,主要是檢查當前的Host是不是有足夠的資源啟動Pod。現在檢查的主要是CPU和Memeory。如果資源足夠,進行下一個校驗。
3) 第三個校驗主要是端口的校驗,主要是檢查端口沖突。檢查當前Host上的端口是不是可以為Pod所用。
4) 第四個校驗,也就是最后一個校驗,主要是校驗Executor。K8sm scheduler主要是使用一個executor管理了所有的task,所以如果Executor校驗發現當前Offer中有兩個Exeuctor ID,會返回錯誤,校驗下一個Offer;如果發現當前Offer已經包含一個Executor ID了,這時候直接返回,當前Offer可用;如果發現當前Offer中不包含Executor ID,還需要查一下當前的Offer有沒有足夠的資源啟動Executor,如果有足夠的資源啟動Executor,當前Offer可用。
以上四個校驗主要是檢查一個Offer是否可用和一個Task綁定。如果檢驗完成后,Offer可用,k8sm scheduler就會把該Offer和當前Task關聯起來。
在Task Launch之前,還會檢查下當前的Task是不是關聯一個Offer,如果Task沒有關聯Offer,k8sm scheduler會返回錯誤,因為Task在運行的時候,必須從某個Offer獲取資源才可以運行。
LaunchTask
當Task和Offer關聯完成后,k8sm scheduler就開始執行Task了。在執行LaunchTasks之前,需要對Task信息按照Mesos需要的格式進行構建,例如設置Task名字,Task需要的SlaveId,Task需要的資源,Task ID,Task的Executor信息等等。接下來就調用Mesos Framework API LaunchTasks去創建Pod了,具體創建Pod的工作由k8sm的Executor執行。
在Worker節點,Mesos 的 Agent 會負責Executor管理。k8sm的Executor會先創建一個名為MinionServer的對象來負責proxy 和 executor 的管理:proxy通過nsenter, iptables等對網絡進行配置;而executor則實現了Mesos Executor接口,用于接收并執行作業,例如在Docker中啟動Pod。限于篇幅,網絡配置和Pods的執行細節會以后的文章會進行具體的描述。
非常好我支持^.^
(0) 0%
不好我反對
(0) 0%