【赵渝强老师】Kubernetes中Pod的调度策略

1

Pod的调度是指Kubernetes在创建Pod时,将其创建到最合适的Node节点上,然后由Node节点上kubelet来运行。在在默认情况下,调度器scheduler会根据特定的算法和策略将Pod调度到Node节点上,这可以满足绝大多数的需求。例如,调度Pod到资源满足要求的Node节点上运行;或者分散到不同Node节点以达到资源的均衡使用。

但在一些特殊的场景下,scheduler的默认调度算法策略并不能满足实际的需求。Kubernetes也运行用户根据调度约束的字段来指定将Pod调度到哪些Node节点上。

一、 Pod的创建过程

要理解Kubernetes是如何调度Pod的,首先就需要掌握Pod是如何被创建出来的。下图说明了Pod的创建过程。

2

scheduler在对Pod进行调度时,会根据Pod和Pod中每个容器对资源都的不同需求,选择一个最优的Node节点去运行这个Pod。满足Pod资源调度请求的Node节点称为可调度节点。如果集群中不存在可调度节点,Pod将被设置为未调度状态,直到集群中出现可调度节点。

image.png
点击这里查看视频讲解:【赵渝强老师】K8s 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

3

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

4

posted @ 2025-12-19 15:54  赵渝强老师  阅读(0)  评论(0)    收藏  举报