十九、Kubernetes中Pod调度第一篇

1、概述

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

  • 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出

  • 定向调度:NodeName、NodeSelector

  • 亲和性调度:NodeAffinity、PodAffinity、PodAntiAffinity

  • 污点(容忍)调度:Taints、Toleration

2、定向调度

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

2.1、通过设置NodeName实现定向调度

NodeName用于强制约束将Pod调度到指定的Name的Node节点上。这种方式,其实是直接跳过Scheduler的调度逻辑,直接将Pod调度到指定名称的节点。

接下来,实验一下:创建一个pod-nodename.yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: pod-nodename
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: k8s-node2 # 指定调度到k8s-node2节点上

效果

#创建pod
[root@k8s-master ~]# kubectl apply -f pod-nodename.yaml
pod/pod-nodename created
[root@k8s-master ~]#
#查看pod,发现pod已被调度到k8s-node2上
[root@k8s-master ~]# kubectl get pod -n dev -owide
NAME           READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
pod-nodename   0/1     ContainerCreating   0          8s    <none>   k8s-node2   <none>           <none>
[root@k8s-master ~]#

2.2、通过设置NodeSelector实现定向调度

NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的,也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。

接下来,实验一下:

  • (1)首先分别为node节点添加标签
#获取所有节点
[root@k8s-master ~]# kubectl get nodes
NAME         STATUS   ROLES           AGE   VERSION
k8s-master   Ready    control-plane   8d    v1.25.0   #主节点默认不工作
k8s-node1    Ready    <none>          8d    v1.25.0   
k8s-node2    Ready    <none>          8d    v1.25.0
[root@k8s-master ~]#
#k8s-node1 添加 标签 env=dev
[root@k8s-master ~]# kubectl label nodes k8s-node1 env=dev
node/k8s-node1 labeled
[root@k8s-master ~]#
#k8s-node2 添加 标签 env=test
[root@k8s-master ~]# kubectl label nodes k8s-node2 env=test
node/k8s-node2 labeled
[root@k8s-master ~]#

  • (2)创建一个pod-nodeselector.yaml文件,并使用它创建Pod
apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeselector
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx
  nodeSelector: 
    env: test # 指定调度到具有env=test标签的节点上
  • (3)查看pod调度效果
#创建pod
[root@k8s-master ~]# kubectl apply -f pod-nodeselector.yaml
pod/pod-nodeselector created
[root@k8s-master ~]#
#查看pod 可以看出pod已被调度到k8s-node2 节点上
[root@k8s-master ~]# kubectl get pod -n dev -owide
NAME               READY   STATUS              RESTARTS   AGE   IP       NODE        NOMINATED NODE   READINESS GATES
pod-nodeselector   0/1     ContainerCreating   0          8s    <none>   k8s-node2   <none>           <none>

本章我们介绍了两种定向调度的方式,使用起来非常方便,但是也有一定的问题,那就是如果没有满足条件的Node,那么Pod将不会被运行,即使在集群中还有可用Node列表也不行,这就限制了它的使用场景。

基于上面的问题,kubernetes还提供了一种亲和性调度(Affinity)。它在NodeSelector的基础之上的进行了扩展,可以通过配置的形式,实现优先选择满足条件的Node进行调度,如果没有,也可以调度到不满足条件的节点上,使调度更加灵活。下一篇我们介绍

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

全栈行动派

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值