11.1、定向调度(NodeName)
5.4.1 定向调度
定向调度,指的是利用在pod上声明nodeName或者nodeSelector,以此将Pod调度到期望的node节点上。注意,这里的调度是强制的,这就意味着即使要调度的目标Node不存在,也会向上面进行调度,只不过pod运行失败而已。
一、定向调度
1、NodeName
NodeName用于强制约束将Pod调度到指定的Name的Node节点上。这种方式,其实是直接跳过Scheduler的调度逻辑,直接将Pod调度到指定名称的节点。
接下来,实验一下:创建一个pod-nodename.yaml文件
1 2 3 4 5 6 7 8 9 10
   | apiVersion: v1 kind: Pod metadata:   name: pod-nodename   namespace: dev spec:   containers:   - name: nginx     image: registry.cn-hangzhou.aliyuncs.com/zznn/mycentos:nginx-latest     nodeName: node1       
   | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   |  kubectl create -f pod-nodename.yaml
 
  kubectl get pods pod-nodename -n dev -o wide
  NAME           READY   STATUS    RESTARTS   AGE   IP            NODE      ...... pod-nodename   1/1     Running   0          56s   10.244.1.87   node1     ......   
 
  kubectl delete -f pod-nodename.yaml vim pod-nodename.yaml  // nodeName: node3
  kubectl create -f pod-nodename.yaml
 
  kubectl get pods pod-nodename -n dev -o wide
  NAME           READY   STATUS    RESTARTS   AGE   IP       NODE    ...... pod-nodename   0/1     Pending   0          6s    <none>   node3   ......
 
  | 
2、NodeSelector
NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。
接下来,实验一下:
1 首先分别为node节点添加标签
1 2
   | kubectl label nodes node1 nodeenv=pro kubectl label nodes node2 nodeenv=test
   | 
2 创建一个pod-nodeselector.yaml文件,并使用它创建Pod
1 2 3 4 5 6 7 8 9 10 11
   | apiVersion: v1 kind: Pod metadata:   name: pod-nodeselector   namespace: dev spec:   containers:   - name: nginx     image: nginx:1.17.1   nodeSelector:      nodeenv: pro 
   | 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
   |  kubectl create -f pod-nodeselector.yaml
 
 
  kubectl get pods pod-nodeselector -n dev -o wide
  NAME               READY   STATUS    RESTARTS   AGE     IP          NODE    ...... pod-nodeselector   1/1     Running   0          47s   10.244.1.87   node1   ......
 
  kubectl delete -f pod-nodeselector.yaml
  vim pod-nodeselector.yaml kubectl create -f pod-nodeselector.yaml
 
  kubectl get pods -n dev -o wide
  NAME               READY   STATUS    RESTARTS   AGE     IP       NODE   pod-nodeselector   0/1     Pending   0          2m20s   <none>   <none>
 
  kubectl describe pods pod-nodeselector -n dev ....... Events:   Type     Reason            Age        From               Message   ----     ------            ----       ----               -------   Warning  FailedScheduling  <unknown>  default-scheduler  0/3 nodes are available: 3 node(s) didn't match node selector.
 
  | 
