Kubernetes 調度簡介
除了讓 kubernetes 集群調度器自動為 pod 資源選擇某個節點(默認調度考慮的是資源足夠,並且 load 盡量平均),有些情況我們希望能更多地控制 pod 應該如何調度。比如,集群中有些機器的配置更好( SSD,更好的內存等),我們希望比較核心的服務(比如說數據庫)運行在上面;或者某兩個服務的網絡傳輸很頻繁,我們希望它們最好在同一台機器上,或者同一個機房。有一些特殊的應用,我們就希望它們能運行在我們指定的節點上,還有些情況下,我們希望某個應用在所有的節點上都能運行一份。
針對不同的應用場景,kubernetes內置了多種調度方式可供選擇。包括標簽選擇器,daemonsets,節點親和性,pod親和性,污點與容忍等。
本篇文檔,我們先從最簡單的標簽選擇器開始。
標簽選擇器
這種方式其實就是我們最常用的使用label的方式,給某一個node打上特定的標簽,然后在啟動pod的時候,通過nodeSelector指定要調度到的node節點的標簽。
給node打標簽:
kubectl label nodes <node-name> <label-key>=<label-value>
示例:
kubectl label nodes k8s-node1 envir=live
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
env: test
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
nodeSelector:
envir: live
需要說明的是,nodeSelector的方式比較簡單直觀,但是不夠靈活,后面,它會被Node Affinity替代。