一、前言
在上一篇文章中我們學習了Pod的一些基本的知識,今天我們將繼續學習Pod。
二、K8S如何選擇節點來運行Pod
我們知道在一個K8S集群中,會有多個工作節點(Worker Node),那么k8s會選擇那個node呢?接下來我們將學習一下k8s是如何選擇適合的node來運行我們所需要的Pod。
1、NodeName
首先我們可以通過指定Node名稱來讓k8s將pod調度到指定的Node,目前筆者的環境里有1個Master和2個Worker節點,如下圖。
1、不指定NodeName
首先我們先什么都不指定,讓k8s自動為我們調度,看看會將Pod分配到那個Node上。我們編寫一個yaml
apiVersion: v2
kind: Pod
metadata:name: my-nginxlabels:run: my-nginx
spec:containers:- name: my-nginximage: nginxports:- containerPort: 80
執行命令
kubectl apply -f nginx.yaml
(這里先不用考慮STATUS 為 ImagePullBackOff 這個是因為筆者的網絡出了點小問題,導致拉取鏡像失敗),可以看到我們的Nginx被k8s調度到了node3 節點,那如果我們想指定pod調度到node2節點呢,接下來我們繼續實驗。
2、指定NodeName
1、我們先刪除之前創建的pod,使用命令
kubectl delete pod my-nginx
2、修改之前的yaml資源清單
apiVersion: v1
kind: Pod
metadata:name: my-nginxlabels:run: my-nginx
spec:containers:- name: my-nginximage: nginxports:- containerPort: 80nodeName: node2
3、執行命令
kubectl apply -f nginx.yaml
4、創建完成后我們查看Pod使用命令
kubectl get pods -o wide
可以看到nginx這個pod已經被調度到了node2節點。
3、小結
使用NodeName可以手動指定Pod調度到那個Node上,那么這種操作適用于什么場景呢?
- 部署基礎設施Pod,一些k8s的基礎設施需要在指定節點運行,例如監控代理或者日志收集器等,這些Pod的部署和調度必須穩定和可靠,不能被k8s自動調度,這種情況下我們可以指定Node
- 管理節點資源:例如我們要維護某個節點,此時我們可以將當前節點的pod部署到其他我們指定的節點上,從而避免k8s自動分配到當前Node
2、nodeSelector
除了使用NameNode我們還可以使用nodeSelector來指定調度的Node。我們下看下NodeSelector的介紹,使用命令
kubectl explain pod.spec.nodeSelector
可以看到nodeSelector是一個Map結構,官網文檔地址https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#nodeselector nodeSelector用于將Pod調度到包含指定label(標簽)的Node上
實驗步驟:
1、給兩個node添加上標簽,給node1打上標簽 cpu=high (CPU為高性能),給node2打上標簽cpu=low(CPU為低性能)
kubectl label nodes node2 cpu=hgihkubectl label nodes node3 cpu=low
2、查看一下這個標簽
kubectl get nodes -L cpu
3、刪除剛才的pod
kubectl delete pod my-nginx
4、編寫yaml
apiVersion: v1
kind: Pod
metadata:name: my-nginxlabels:run: my-nginx
spec:containers:- name: my-nginximage: nginxports:- containerPort: 80nodeSelector:cpu: high
5、執行創建命令
我們預期該pod會被創建在node1上,因為我們這里匹配的標簽的是cpu high,我們直接運行命令看一下結果。
kubectl apply -f nginx.yaml
但是預期的現象并沒有發生,pod一直處于pending狀態,仔細看一下yaml和標簽,結果發現是單詞拼錯了。node標簽是 cpu=high 而我們清單上寫的high導致匹配不到node,此時會一直pending住。直到有能匹配上的node。所以現在有兩種方案,改資源清單或者改node上的標簽,我們選擇后者。
kubectl label nodes node2 cpu=high --overwrite=true
再次查看node上的標簽
接著查看pod
至此Pod已經完成了調度
三、總結
今天我們學習了如何手動控制K8S調度Pod,分別可以通過NodeName和NodeSelector來指定,前者通過名稱來指定Node而后者是通過標簽來指定。接下來的文章我們會繼續學習Pod其他知識希望對你有所幫助。