Pod的调度是指Kubernetes在创建Pod时,将其创建到最合适的Node节点上,然后由Node节点上kubelet来运行。在在默认情况下,调度器scheduler会根据特定的算法和策略将Pod调度到Node节点上,这可以满足绝大多数的需求。例如,调度Pod到资源满足要求的Node节点上运行;或者分散到不同Node节点以达到资源的均衡使用。
但在一些特殊的场景下,scheduler的默认调度算法策略并不能满足实际的需求。Kubernetes也运行用户根据调度约束的字段来指定将Pod调度到哪些Node节点上。
一、 Pod的创建过程
要理解Kubernetes是如何调度Pod的,首先就需要掌握Pod是如何被创建出来的。下图说明了Pod的创建过程。
scheduler在对Pod进行调度时,会根据Pod和Pod中每个容器对资源都的不同需求,选择一个最优的Node节点去运行这个Pod。满足Pod资源调度请求的Node节点称为可调度节点。如果集群中不存在可调度节点,Pod将被设置为未调度状态,直到集群中出现可调度节点。
视频讲解如下:
二、 Pod的调度约束
scheduler有默认支持的算法和策略对Pod进行调度,Kubernetes也允许定义自己的调度约束策略,将Pod运行在指定的Node节点上。调度约束可以通过两个字段来进行定义:nodeName和nodeSelector。
其中:
- nodeName: 用于将Pod调度到指定名称的Node节点上。
- nodeSelector: 用于将Pod调度到匹配Label标签的Node节点上。
下面通过具体的示例来演示它们的用法。
2.1 指定nodeName的调度约束
(1)创建nodename-demo.yaml文件,并在文件中输入下面的内容:
apiVersion: v1 kind: Pod metadata: name: nodename-demo labels: app: nginx spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ##通过nodeName指定到node1节点上,这是节点名 nodeName: node1
(2)使用“kubectl apply”命令应用yaml文件。
kubectl apply -f nodename-demo.yaml
(3)查看Pod的详细信息,可以看出“nodename-demo”被调度器调度到了node1的节点上,如下图所示。
kubectl get pod -o wide
2.2 指定nodeSelector的调度约束
(1)给node2添加一个标签。
kubectl label node node2 nodeselector-key=nodeselector-value
(2)创建nodeselector-demo.yaml文件,并在文件中输入下面的内容:
apiVersion: v1 kind: Pod metadata: name: nodeselector-demo labels: app: nginx spec: containers: - name: nginx image: nginx imagePullPolicy: IfNotPresent ##根据nodeSelector指定的标签将Pod调度到对应的节点上 nodeSelector: nodeselector-key: nodeselector-value
(3)使用“kubectl apply”命令应用yaml文件。
kubectl apply -f nodeselector-demo.yaml
(4)查看Pod的详细信息,可以看出“nodeselector-demo”被调度器调度到了node2的节点上,如下图所示。
kubectl get pod -o wide