目录

什么是k8s调度

nodeName

nodeSelector

配置示例

节点亲和性

亲和性与反亲和性

Taints污点与容忍

cordon、drain、delete

cordon隔离

drain驱逐

delete删除


什么是k8s调度

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。

kube-scheduler 是 Kubernetes 集群的默认调度器,并且是集群控制面的一部分。如果你真的希望或者有这方面的需求,kube-scheduler 在设计上是允许你自己写一个调度组件并替换原有的 kube-scheduler。

在做调度决定时需要考虑的因素包括:单独和整体的资源请求、硬件/软件/策略限制、亲和以及反亲和要求、数据局域性、负载间的干扰等等。

nodeName

nodeName 是节点选择约束的最简单方法,但一般不推荐。如果 nodeName 在 PodSpec 中指定了,则它优先于其他的节点选择方法。

使用 nodeName 来选择节点的一些限制:

  • 如果指定的节点不存在。
  • 如果指定的节点没有资源来容纳 pod,则pod 调度失败。
  • 云环境中的节点名称并非总是可预测或稳定的

nodeSelector

nodeSelector 是节点选择约束的最简单推荐形式。

配置示例

cd
vim pod.yaml
kubectl apply -f pod.yaml
kubectl get pod
状态一直是pendingkubectl describe pod nginx
kubectl get nodes --show-labels
kubectl label nodes server4 disktype=ssd
kubectl get pod
状态已经就绪kubectl get pod -o wide
查看节点在4上

节点亲和性

亲和性调度可以分成软策略和硬策略两种方式:

  1. 软策略就是如果现在没有满足调度要求的节点的话,pod就会忽略这条规则,继续完成调度的过程。
  2. 硬策略比较强硬,如果没有满足条件的节点的话,就不断重试直到满足条件为止。

亲和与反亲和:
nodeSelector 提供了一种非常简单的方法来将 pod 约束到具有特定标签的节点上。亲和/反亲和功能极大地扩展了约束的类型。
可以发现规则是“软”/“偏好”,而不是硬性要求,因此,如果调度器无法满足该要求,仍然调度该 pod
我们可以使用节点上的 pod 的标签来约束,而不是使用节点本身的标签,来允许哪些 pod 可以或者不可以被放置在一起。

节点亲和参数:

  1. requiredDuringSchedulingIgnoredDuringExecution 必须满足
  2. preferredDuringSchedulingIgnoredDuringExecution 倾向满足
  3. IgnoreDuringExecution 表示如果在Pod运行期间Node的标签发生变化,导致亲和性策略不能满足,则继续运行当前的Pod。

nodeaffinity还支持多种规则匹配条件的配置如:

  • In:label 的值在列表内
  • NotIn:label 的值不在列表内
  • Gt:label 的值大于设置的值,不支持Pod亲和性
  • Lt:label 的值小于设置的值,不支持pod亲和性
  • Exists:设置的label 存在
  • DoesNotExist:设置的 label 不存在
kubectl label nodes server3 disktype=ssd
kubectl get node --show-labels
kubectl delete -f pod.yaml
vim pod.yaml
kubectl apply -f pod.yaml
kubectl get pod -o wide
查看节点在3上
kubectl label nodes server3 disktype=sata --overwrite
kubectl apply -f pod.yaml
kubectl get pod -o wide
kubectl label nodes server3 role=prod
kubectl delete -f pod.yaml
vim pod.yaml
kubectl apply -f pod.yaml
kubectl get pod -o wide
kubectl get pod --show-labels
kubectl label pod node-affinity app=nginx
kubectl get pod --show-labels

亲和性与反亲和性

pod 亲和性和反亲和性:

  • podAffinity主要解决POD可以和哪些POD部署在同一个拓扑域中的问题(拓扑域用主机标签实现,可以是单个主机,也可以是多个主机组成的cluster、zone等。)
  • podAntiAffinity主要解决POD不能和哪些POD部署在同一个拓扑域中的问题。它们处理的是Kubernetes集群内部POD和POD之间的关系。
  • Pod 间亲和与反亲和在与更高级别的集合(例如 ReplicaSets,StatefulSets,Deployments等)一起使用时,它们可能更加有用。可以轻松配置一组应位于相同定义拓扑(例如,节点)中的工作负载。
  • Pod 间亲和与反亲和需要大量的处理,这可能会显著减慢大规模集群中的调度。
vim pod.yaml
kubectl apply -f pod.yaml
kubectl get pod
kubectl get pod -o wide
节点全部在3上
kubectl describe pod node-affinity
kubectl describe pod test
kubectl get pod --show-labels
kubectl delete pod test
vim pod.yaml
kubectl apply -f pod.yaml
kubectl get pod -o wide
节点分别在3和4上

Taints污点与容忍

NodeAffinity节点亲和性,是Pod上定义的一种属性,使Pod能够按我们的要求调度到某个Node上,而Taints则恰恰相反,它可以让Node拒绝运行Pod,甚至驱逐Pod。

Taints(污点)是Node的一个属性,设置了Taints后,所以Kubernetes是不会将Pod调度到这个Node上的,于是Kubernetes就给Pod设置了个属性Tolerations(容忍),只要Pod能够容忍Node上的污点,那么Kubernetes就会忽略Node上的污点,就能够(不是必须)把Pod调度过去。

可以使用如下命令 kubectl taint 给节点增加或操作 taint:
kubectl taint nodes node1 key=value:NoSchedule 创建
kubectl describe nodes server1 |grep Taints 查询
kubectl taint nodes node1 key:NoSchedule- 删除

其中[effect] 可取值: [ NoSchedule | PreferNoSchedule | NoExecute ]

  • NoSchedule:POD 不会被调度到标记为 taints 节点。
  • PreferNoSchedule:NoSchedule 的软策略版本。
  • NoExecute:该选项意味着一旦 Taint 生效,如该节点内正在运行的 POD 没有对应 Tolerate 设置,会直接被逐出。

tolerations中定义的key、value、effect,要与node上设置的taint保持一致:

  • 如果 operator 是 Exists ,value可以省略。
  • 如果 operator 是 Equal ,则key与value之间的关系必须相等。
  • 如果不指定operator属性,则默认值为Equal。

还有两个特殊值:

  • 当不指定key,再配合Exists 就能匹配所有的key与value ,可以容忍所有污点。
  • 当不指定effect ,则匹配所有的effect。
kubectl describe nodes server2 | grep Tain
查看2上的污点
kubectl delete -f pod.yaml
cd pod/
ls
vim deploy.yml
kubectl apply -f deploy.yml
kubectl get pod
kubectl get pod -o wide
kubectl taint nodes server4 k1=v1:NoSchedule
kubectl get pod -o wide
vim deploy.yml
kubectl apply -f deploy.yml
kubectl get pod -o wide
kubectl taint nodes server3 k2=v2:NoExecute
kubectl get pod -o wide
vim deploy.yml
kubectl apply -f deploy.yml
kubectl get pod -o wide
vim deploy.yml
kubectl apply -f deploy.yml
kubectl get pod -o wide
kubectl describe nodes server3 | grep Tain
kubectl delete -f  deploy.yml
kubectl taint node server3 k2-
kubectl taint node server4 k1-
kubectl describe nodes server3 | grep Tain
kubectl describe nodes server4 | grep Tain

cordon、drain、delete

影响Pod调度的指令还有:cordon、drain、delete,后期创建的pod都不会被调度到该节点上,但操作的暴力程度不一样。

cordon隔离

cordon停止调度:
影响最小,只会将node调为SchedulingDisabled,新创建pod,不会被调度到该节点,节点原有pod不受影响,仍正常对外提供服务。

禁用server3
kubectl get node
vim deploy.yml 【注释掉容忍项】
kubectl apply -f deploy.yml
kubectl get pod -o wide
三个pod都在4上,3不参加调用了被禁掉了

drain驱逐

drain驱逐节点:
首先驱逐node上的pod,在其他节点重新创建,然后将节点调为SchedulingDisabled。

kubectl drain server4
kubectl drain server4 --ignore-daemonsets
kubectl get pod -o wide
可以看到pod是pending状态,因为3禁用了,4被驱离了
kubectl uncordon server3
取消3上的禁止
kubectl get pod -o wide
现在容器都在3上
kubectl get node
3是正常状态了

delete删除

delete删除节点:
最暴力的一个,首先驱逐node上的pod,在其他节点重新创建,然后,从master节点删除该node,master失去对其控制,如要恢复调度,需进入node节点,重启kubelet服务

kubectl delete nodes server4
kubectl get node
没有4了

 server4连接集群

systemctl restart kubelet

server2

kubectl get node
4又回来了
kubectl get pod -n kube-system
kubectl delete -f deploy.yml 

K8s---k8调度相关推荐

  1. K8s scheduler 调度:NodeName、NodeSelector与Taint

    1 前言 上篇介绍了k8s调度的预选和优选策略,K8s scheduler 调度:预选和优选策略. 本篇介绍三个影响pod调度的配置:NodeName.NodeSelector与Taint. 2 No ...

  2. 从零开始入门 K8s | Kubernetes 调度和资源管理

    作者 | 子誉  蚂蚁金服高级技术专家 关注"阿里巴巴云原生"公众号,回复关键词**"入门"**,即可下载从零入门 K8s 系列文章 PPT. Kubernet ...

  3. 【K8s】调度神器 descheduler

    从 kube-scheduler 的角度来看,它是通过一系列算法计算出最佳节点运行 Pod,当出现新的 Pod 进行调度时,调度程序会根据其当时对 Kubernetes 集群的资源描述做出最佳调度决定 ...

  4. k8s 高级调度 亲和力和反亲和力、绑定标签、污点容忍污点

    文章目录 1. 通过标签绑定 2. 通过node name绑定 3. node的亲和力 4. pod间亲和性和反亲和性 5. node的污点 6. 综合 – 1. 通过标签绑定 spec:nodeSe ...

  5. k8s selector_kubernetes调度之NodeSelector及NodeName

    本文主要介绍kubernetes调度框架中的NodeName和NodeSelector. 1.spec.nodeName用于强制约束将Pod调度到指定的Node节点上,这里说是"调度&quo ...

  6. K8S指定调度节点:spec.nodeName的使用示例

    参考链接:http://docs.kubernetes.org.cn/

  7. k8s tfjob批调度-volcano调研

    背景 最近工作聚焦在机器学习这块,公司采用的kubeflow框架中的tfjob,利用tersorflow进行分布式训练. 在训练过程中,发现在整体资源不足的情况下,由于k8s默认调度器调度的粒度是po ...

  8. 图解 K8S(06):调度利器之污点与容忍度(压力驱逐)

    本系列教程目录(已发布): 图解 K8S(01):基于ubuntu 部署最新版 k8s 集群 图解 K8S(02):认识 K8S 中的资源对象 图解 K8S(03):从 Pause 容器理解 Pod ...

  9. 干货 | 10W+ K8s容器数量下,携程如何打造统一弹性调度体系

    作者简介 本文作者为携程Cloud Container团队的鸿飞,静雪,诗燕.该团队负责K8s容器平台的研发和优化工作,专注于推动基础设施云原生架构升级,以及创新产品的研发和落地,持续提升资源利用率. ...

  10. Kubernetes K8S之固定节点nodeName和nodeSelector调度详解

    Kubernetes K8S之固定节点nodeName和nodeSelector调度详解与示例 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-mas ...

最新文章

  1. 《数据结构》第01章在线测试
  2. hdu5437(2015长春网络赛A题)
  3. 【机器学习】那些决定模型上限的操作
  4. Docker 解决容器时间与主机时间不一致的问题三种解决方案
  5. linux 开机自动启动服务
  6. C# 窗口最大化但不占用任务栏位置
  7. jQuery对象与dom对象的转换
  8. Qt多线程-QThread
  9. Bailian3256 矩阵的乘法【数学计算】
  10. php5.2 json,php5.2 对json格式的支持
  11. docker下配置linux7.2
  12. C++中打印可变参数函数输出到控制台
  13. aria2c 官方手册中文翻译版
  14. 邻接表与邻接矩阵的相互转换
  15. 电商十二、pinyougou02.sql的内容③
  16. 牛客网——Java刷题篇
  17. VMware中性能分配的问题
  18. 计算机绘图中级,《计算机绘图中级教程》1.doc
  19. 前后端分别部署教程 ---- 第三部分项目部署和挂载到微信公众号
  20. 大数据的关键技术与综述

热门文章

  1. [附源码]JSP+ssm计算机毕业设计网上鞋店管理系统t5bj3【源码、数据库、LW、部署】
  2. 虚拟主机网站服务器失去响应怎么办,网站打不开的6种现象及解决方法
  3. 最好的MATLAB入门教程(没有之一!)
  4. 已知两圆圆心坐标及半径求两圆交点 (C语言|参数方程求解)
  5. ACM算法笔记(五)贪心算法
  6. 关联规则FpGrowth算法
  7. awg线径与电流_28AWG号线电流多大
  8. 简单的红绿灯c语言程序,基于Protues仿真的简单交通信号灯附C语言程序
  9. FindElement和FindElements命令
  10. CSS(二):选择器