• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
gys001
博客园    首页    新随笔    联系   管理    订阅  订阅

Pod详解之Pod调度(定向调度)

Pod调度

在默认情况下,一个Pod在哪个Node节点上运行,是由Scheduler组件采用相应的算法计算出来的,这个过程是不受人工控制的。

但是在实际使用中,这并不满足的需求,因为很多情况下,我们想控制某些Pod到达某些节点上,那么应该怎么做呢?

这就要求了解kubernetes对Pod的调度规则,kubernetes提供了四大类调度方式:

- 自动调度:运行在哪个节点上完全由Scheduler经过一系列的算法计算得出
- 定向调度:NodeName、NodeSelector
- 亲和性调度:NodeAffinity(pod与node之间)、PodAffinity(pod与pod之间)、PodAntiAffinity
- 污点(容忍)调度:Taints、Toleration
注:Node可设置污点,不让Pod过来;而Pod可设置容忍污点,强行到污点Node内

定向调度

定向调度,指的是利用在pod上声明nodeName或者nodeSelector,以此将Pod调度到期望的node节点上。注意,这里的调度是强制的,

这就意味着即使要调度的目标Node不存在,也会向上面进行调度,只不过pod会运行失败而已。

NodeName

NodeName用于强制约束将Pod调度到指定的Name的Node节点上。

这种方式,其实是直接跳过Scheduler的调度逻辑,直接将Pod调度到指定名称的节点。

案例

创建一个pod-nodename.yaml文件

 

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

 

 

创建Pod,观察效果
#创建Pod
[root@master ~]# kubectl create -f pod-nodename.yaml

#查看Pod调度到NODE属性,确实是调度到了node1节点上
[root@master ~]# kubectl get pods pod-nodename -n dev -o wide

# 接下来,删除pod,修改nodeName的值为node3(注:并没有node3节点)
[root@master ~]# kubectl delete -f pod-nodename.yaml
[root@master ~]# vim pod-nodename.yaml
[root@master ~]# kubectl create -f pod-nodename.yaml

#再次查看,发现已经向Node3节点调度,但是由于不存在node3节点,所以pod无法正常运行
[root@master ~]# kubectl get pods pod-nodename -n dev -o wide
NodeSelector

NodeSelector用于将pod调度到添加了指定标签的node节点上。它是通过kubernetes的label-selector机制实现的,

也就是说,在pod创建之前,会由scheduler使用MatchNodeSelector调度策略进行label匹配,找出目标node,然后将pod调度到目标节点,该匹配规则是强制约束。

案例
1 首先分别为node节点添加标签
[root@master ~]# kubectl label nodes node1 nodeenv=pro
[root@master ~]# kubectl label nodes node2 nodeenv=test

查看node上的标签
[root@master ~]# kubectl get nodes --show-labels

2 创建一个pod-nodeselector.yaml文件

apiVersion: v1
kind: Pod
metadata:
  name: pod-nodeselector
  namespace: dev
spec:
  containers:
  - name: nginx
    image: nginx:1.17.1
nodeSelector: nodeenv: pro # 指定调度到具有nodeenv=pro标签的节点上 #创建Pod [root@master ~]# kubectl create -f pod-nodeselector.yaml #查看Pod调度到NODE属性,确实是调度到了node1节点上 [root@master ~]# kubectl get pods pod-nodeselector -n dev -o wide

 


# 接下来,删除pod,修改nodeSelector的值为nodeenv: xxxx(不存在打有此标签的节点)
[root@master ~]# kubectl delete -f pod-nodeselector.yaml
[root@master ~]# vim pod-nodeselector.yaml
[root@master ~]# kubectl create -f pod-nodeselector.yaml

#再次查看,发现pod无法正常运行,Node的值为none(因为没有节点符合要求)
[root@master ~]# kubectl get pods -n dev -o wide

# 查看详情,发现node selector匹配失败的提示
[root@master ~]# kubectl describe pods pod-nodeselector -n dev


参考

黑马B站k8s课程https://www.bilibili.com/video/BV1Qv41167ck/
https://gitee.com/yooome/golang/blob/main/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B-%E8%B0%83%E6%95%B4%E7%89%88/k8s%E8%AF%A6%E7%BB%86%E6%95%99%E7%A8%8B.md
https://www.yuque.com/fairy-era/yg511q/xyqxge
posted @ 2022-11-15 21:32  gys001  阅读(136)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3