所謂Scheduling就是決定Pod在建立時,會被安排到哪個Node上,而在Day 03:Kubernetes的架構中有提到,集群預設是存在Scheduler來負責這件事。
會需要手動做Scheduling的情況為集群中沒有Scheduler時。
如果沒有Sheduler,準備建立的Pod之狀態會停留在Pending,等待系統將其綁定到某個節點上運行,而現在我們可以怎麼做的呢?就是使用Binding來幫它綁定到某個Node上。
apiVersion: v1
kind: Binding
metadata:
name: nginx # 會自動找這個名字的物件
target:
apiVersion: v1
kind: Node
name: node01
在這邊metadata.name所設定的物件名稱,系統會自動根據這個名稱去尋找,找到這個名稱的物件並綁定到target所指定的Node。
我們也可以在原本的YAML中,使用nodeName來指定Pod到某個Node,要注意的是,Pod其實是無法直接更新的,一定要透過刪除再重建來更新。。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 8080
nodeName: node02
除了使用nodeName以外,我們還可以使用nodeSelector來提供更多元的選擇。
那麼我們首先要來看看怎麼幫Node貼上Label,以及怎麼看Node有哪些Label。
# 看看節點上有哪些Labels
kubectl get nodes --show-labels
# 幫節點貼上Label, size=Large是key=value形式的Label
kubectl label nodes mode-1 size=Large
# 刪除Label,只需要在後面加上減號
kubectl label nodes mode-1 size=Large-
確認Node上面有哪些Label後,我們就可以利用這些Label來將Pod安排到擁有這些Label的節點上運行。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
name: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 8080
nodeSelector:
size: Large
這邊的作法很類似Service,但是目前主流的作法是使用Affinity,其提供更優秀的Scheduling靈活性。
明天我們再來討論,Taints與Tolerations,還有Affinity~
Certified Kubernetes Administrator (CKA) with Practice Tests