在物聯網應用下,不同邊緣節點之間是分散的。假設有特定應用要在A場域應用,但卻被佈署到B場域上就會影響服務效能,所以讓維運人員選擇服務佈署節點也是一個很重要的功能。
接下來要介紹幾種指定容器佈署節點的方式,首先是最簡單也是我們這幾天內容中一直使用的NodeSelector。NodeSelector機制會指定節點標籤,將應用部署到符合該標籤的節點上。因此我們會需要在節點上貼標籤,並在YAML上指定nodeSelector,也就是節點需要對應到的標籤內容。
首先我們需要先在節點上放上標籤:
# kubectl label node <標籤>=<標籤名>
kubectl label nodes k8s-node02 name=k8s-node02
kubectl label nodes edge name=edge
查看一下節點標籤:
kubectl get nodes --show-labels
接著我們佈署pod至節點上,可以看到在YAML檔裡面多了nodeSelector欄位
# k8s-nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: k8s-nginx-pod
namespace: default
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
nodeSelector:
name: k8s-node02
# edge-nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: edge-nginx-pod
namespace: default
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
nodeSelector:
name: edge
kubectl apply -f k8s-nginx-pod.yaml
kubectl apply -f edge-nginx-pod.yaml
可以看到他們被佈署到對應的節點上。
那如果節點中都沒有符合YAML中nodeSelector指定的標籤呢?這次我們將YAML稍微改一下:
# nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
namespace: default
labels:
app: nginx
spec:
containers:
- image: nginx:latest
name: nginx
nodeSelector:
name: test
kuebctl apply -f nginx-pod.yaml
接著觀察佈署狀態:
可以看到服務無法被佈署到節點上,因為沒有符合標籤的節點;描述一下pod也可以得到相同的訊息,
kubectl describe pods nginx-pod