Scheduler是k8s集群的調度器,主要的任務是把定義好的pod分配到集群節點上
有以下特征:
1 公平 保證每一個節點都能被合理分配資源或者能被分配資源
2 資源高效利用 集群所有資源最大化被利用
3 效率 調度的性能好,能夠對大批量pod進行調度
4 靈活 允許用戶根據自己的需求控制調取的邏輯
工作原理:
Scheduler是單獨運行的程序,啟動之后會一直連接API Server,獲取值:PodSpec.NodeName為空的pod,也就是對沒有標記namespace的pod都會創建一個binding,表明該pod放到哪個節點上。
首先過濾掉不滿足條件的節點,這個過程稱為:predicate
再通過節點按照優先級排序,這個稱為:priority
最后選擇優先級最好的節點
若這個期間有一步出錯,直接返回錯誤。若在predicate過程中沒有合適的節點,pod會一直處於pending狀態,不斷重試調度,直到有節點滿足為止。如果有多個節點滿足條件,就繼續priority過程,選擇最優node節點
調度過程中,會有一些因素影響調度
1.資源限制
2.節點選擇器標簽
給node添加標簽
[root@k8s-master gisserver]# kubectl label node k8s-node1 node1=iserver node/k8s-node1 labeled [root@k8s-master gisserver]# kubectl get node --show-labels NAME STATUS ROLES AGE VERSION LABELS k8s-master Ready master 22d v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master= k8s-node1 Ready <none> 22d v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux,node1=iserver k8s-node2 Ready <none> 22d v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux,node2=gisserver
查看一個指定node標簽
[root@k8s-master gisserver]# kubectl get node -l "node1=iserver" NAME STATUS ROLES AGE VERSION k8s-node1 Ready <none> 22d v1.17.3
刪除一個node的標簽
[root@k8s-master gisserver]# kubectl label node k8s-node1 node1- node/k8s-node1 labeled [root@k8s-master gisserver]# kubectl get node --show-labels NAME STATUS ROLES AGE VERSION LABELS k8s-master Ready master 22d v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/master= k8s-node1 Ready <none> 22d v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux k8s-node2 Ready <none> 22d v1.17.3 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux,node2=gisserver
3. 節點的親和性
4.污點和污點容忍
查看污點
[root@k8s-master gisserver]# kubectl describe node k8s-node1 |grep Taints Taints: <none> [root@k8s-master gisserver]# kubectl describe node k8s-node2 |grep Taints Taints: <none> [root@k8s-master gisserver]# kubectl describe node k8s-master |grep Taints Taints: node-role.kubernetes.io/master:NoSchedule
添加節點污點:
[root@k8s-master gisserver]# kubectl taint node k8s-node1 node1=yes:NoSchedule node/k8s-node1 tainted [root@k8s-master gisserver]# kubectl describe node k8s-node1 |grep Taints Taints: node1=yes:NoSchedule
刪除污點:
[root@k8s-master gisserver]# kubectl taint node k8s-node1 node1=yes:NoSchedule- node/k8s-node1 untainted [root@k8s-master gisserver]# kubectl describe node k8s-node1 |grep Taints Taints: <none>
污點容忍與軟親和性類似