您好,登錄后才能下訂單哦!
這篇文章給大家介紹Kubernetes中的kube-scheduler組件怎么用,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
Kubernetes作為一個容器編排調度引擎,資源調度是它的最基本也是最重要的功能。當開發者部署一個應用時它運行在哪個節點?這個節點滿不滿足開發的運行要求?Kubernetes又是如何進行資源調度的呢?
在Kubernetes中有一個kube-scheduler組件,該組件運行在master節點上,它主要負責pod的調度。Kube-scheduler監聽kube-apiserver中是否有還未調度到node上的pod(即Spec.NodeName為空的Pod),再通過特定的算法為pod指定分派node運行。如果分配失敗,則將該pod放置調度隊列尾部以重新調度。調度主要分為幾個部分:首先是預選過程,過濾不滿足Pod要求的節點。然后是優選過程,對通過要求的節點進行優先級排序,最后選擇優先級最高的節點分配,其中涉及到的兩個關鍵點是過濾和優先級評定的算法。調度器使用一組規則過濾不符合要求的節點,其中包括設置了資源的request和指定了Nodename或者其他親和性設置等等。優先級評定將過濾得到的節點列表進行打分,調度器考慮一些整體的優化策略,比如將Deployment控制的多個副本集分配到不同節點上等。
在部署應用時,開發者會考慮到使這個應用運行起來需要多少的內存和CPU資源的使用量,這樣才能判斷應將他運行在哪個節點上。在部署文件resource屬性中添加requests字段用于說明運行該容器所需的最少資源,當調度器開始調度該Pod時,調度程序確保對于每種資源類型,計劃容器的資源請求總和必須小于節點的容量才能分配該節點運行Pod,resource屬性中添加limits字段用于限制容器運行時所獲得的最大資源。如果該容器超出其內存限制,則可能被終止。 如果該容器可以重新啟動,kubelet會將它重新啟動。如果調度器找不到合適的節點運行Pod時,就會產生調度失敗事件,調度器會將Pod放置調度隊列以循環調度,直到調度完成。
在下面例子中,運行一個nginx Pod,資源請求了256Mi的內存和100m的CPU,調度器將判斷哪個節點還剩余這么多的資源,尋找到了之后就會將這個Pod調度上去。同時也設置了512Mi的內存和300m的CPU的使用限制,如果該Pod運行之后超出了這一限制就將被重啟甚至被驅逐。
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx resources: requests: memory: "256Mi" cpu: "100m" limits: memory: "512Mi" cpu: "300m"
在部署應用后,可以使用 kubectl describe 命令進行查看Pod的調度事件,下面是一個coredns被成功調度到node3運行的事件記錄。
$ kubectl describe po coredns-5679d9cd77-d6jp6 -n kube-system ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal Scheduled 29s default-scheduler Successfully assigned kube-system/coredns-5679d9cd77-d6jp6 to node3 Normal Pulled 28s kubelet, node3 Container image "grc.io/kubernetes/coredns:1.2.2" already present on machine Normal Created 28s kubelet, node3 Created container Normal Started 28s kubelet, node3 Started container
下面是一個coredns被調度失敗的事件記錄,根據記錄顯示不可調度的原因是沒有節點滿足該Pod的內存請求。
$ kubectl describe po coredns-8447874846-5hpmz -n kube-system ... Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedScheduling 22s (x3 over 24s) default-scheduler 0/3 nodes are available: 3 Insufficient memory.
例如開發者需要部署一個ES集群,由于ES對磁盤有較高的要求,而集群中只有一部分節點有SSD磁盤,那么就需要將標記一下帶有SSD磁盤的節點即給這些節點打上Lable,讓ES的pod只能運行在帶這些標記的節點上。
Lable是附著在K8S對象(如Pod、Service等)上的鍵值對。它可以在創建對象的時候指定,也可以在對象創建后隨時指定。Kubernetes最終將對labels最終索引和反向索引用來優化查詢和watch,在UI和命令行中會對它們排序。通俗的說,就是為K8S對象打上各種標簽,方便選擇和調度。
關于Kubernetes中的kube-scheduler組件怎么用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。