k8s - pod调度(定向调度)

pod 调度

在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式:

  • 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
  • 定向调度:NodeName、NodeSelector
  • 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity
  • 污点(容忍)调度:Taints、Toleration

定向调度

定向调度,指的是利用在pod上声明nodeName或者nodeSelector,以此将Pod调度到期望的node节点上。注意,这里的调度是强制的,这就意味着即使要调度的目标Node不存在,也会向上面进行调度,只不过pod运行失败而已。

  1. NodeName
    NodeName用于强制约束将Pod调度到指定的Name的Node节点上。这种方式,其实是直接跳过Scheduler的调度逻辑,直接将Pod调度到指定名称的节点。
# vim pod-nodename.yaml
编辑一个 yaml 文件

apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: Always
  nodeName: k8s-node3
  restartPolicy: Always
# 使用 yaml 文件创建 pod
[root@k8s-master pod-files]# kubectl apply -f pod-nodename.yaml
pod/pod-nodename created

# 查看 pod 详情
[root@k8s-master pod-files]# kubectl get pods -n dev -o wide
NAME           READY   STATUS    RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
pod-nodename   0/1     Pending   0          3s    <none>   k8s-node3   <none>           <none>

# 上面 yaml 文件中,NodeName 指定的是 k8s-node3 节点,查看详情确实也是调度到了 k8s-nodes3 上,但是状态却一直是 pending;
# 这是因为集群中没有 node3 这个节点,而 nodename 相当于强制调度,因此就算集群中没有 node3 也会强行调度的,所以是 pending;

[root@k8s-master pod-files]# kubectl get nodes
NAME        STATUS   ROLES    AGE    VERSION
k8s-node1   Ready    <none>   150d   v1.16.0
k8s-node2   Ready    <none>   150d   v1.16.0
  1. NodeSelector
    NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。
# 先给两个节点分别打上标签

[root@k8s-master ~]# kubectl label nodes k8s-node1 nodeenv=pro
node/k8s-node1 labeled
[root@k8s-master ~]# kubectl label nodes k8s-node2 nodeenv=test
node/k8s-node2 labeled
# 创建一个pod-nodeselector.yaml文件

[root@k8s-master ~]# cat yaml-files/pod-files/pod-nodeselector.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeselector
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:latest
    imagePullPolicy: IfNotPresent
  nodeSelector:
    nodeenv: pro # 指定调度到具有nodeenv=pro标签的节点上

[root@k8s-master ~]# kubectl get nodes --show-labels
NAME        STATUS   ROLES    AGE    VERSION   LABELS
k8s-node1   Ready    >   150d   v1.16.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node1,kubernetes.io/os=linux,nodeenv=pro
k8s-node2   Ready    >   150d   v1.16.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node2,kubernetes.io/os=linux,nodeenv=test

# 创建 pod
[root@k8s-master ~]# kubectl apply -f yaml-files/pod-files/pod-nodeselector.yaml
pod/pod-nodeselector created

# 查看 pod,是被调度到了 k8s-node1,符合预期
[root@k8s-master ~]# kubectl get pod -n dev -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
pod-nodeselector   1/1     Running   0          7s    10.244.0.113   k8s-node1   >           >

# 接下来,删除pod,修改nodeSelector的值为nodeenv: propro(不存在打有此标签的节点)
[root@k8s-master ~]# kubectl delete -f yaml-files/pod-files/pod-nodeselector.yaml
pod "pod-nodeselector" deleted
[root@k8s-master ~]# kubectl apply -f yaml-files/pod-files/pod-nodeselector.yaml
pod/pod-nodeselector created

# 再次查看,发现 pod 无法正常运行,Node 的值为 none
[root@k8s-master ~]# kubectl get pods -n dev -o wide
NAME               READY   STATUS    RESTARTS   AGE   IP       NODE     NOMINATED NODE   READINESS GATES
pod-nodeselector   0/1     Pending   0          18s   >   >   >           >


# 查看详情,发现 node selector 匹配失败的提示:没有可以匹配到的节点,所以是 pending 状态
[root@k8s-master ~]# kubectl describe pods/pod-nodeselector -n dev
Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling    default-scheduler  0/2 nodes are available: 2 node(s) didn't match node selector.

你可能感兴趣的:(kuberbetes,Docker,Linux运维,k8s,docker,kubernetes)