k8s调度

  • nodeName
  • nodeSelector
  • 亲和与反亲和
    • 节点亲和
    • pod 亲和性和反亲和性
  • Taints(污点)

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

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

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

默认策略可以参考:https://kubernetes.io/docs/reference/scheduling/policies/

调度框架:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/scheduling-framework/

nodeName

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

使用 nodeName 来选择节点的一些限制:
如果指定的节点不存在。
如果指定的节点没有资源来容纳 pod,则pod 调度失败。
云环境中的节点名称并非总是可预测或稳定的。

[root@server2 调度]# cat nodeName.yml
apiVersion: v1
kind: Pod
metadata:name: nginx
spec:containers:- name: nginximage: nginxnodeName: server3

直接调度到server3上

[root@server2 调度]# kubectl  get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          28s
[root@server2 调度]# kubectl  get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          37s   10.244.1.3   server3   <none>           <none>

nodeSelector

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

给选择的节点添加标签:
kubectl label nodes server2 disktype=ssd


[root@server2 调度]# cat nodeSelector.yml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:env: test
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentnodeSelector:disktype: ssd

[root@server2 调度]# kubectl label node server4 disktype=ssd
node/server4 labeled

[root@server2 调度]# kubectl  get node -L disktype     ###-L 后加key值,可以列出相应标签的节点
NAME      STATUS   ROLES                  AGE    VERSION   DISKTYPE
server2   Ready    control-plane,master   3h1m   v1.20.2
server3   Ready    <none>                 157m   v1.20.2
server4   Ready    <none>                 157m   v1.20.2   ssd
[root@server2 调度]# kubectl  apply -f nodeSelector.yml
pod/nginx created
[root@server2 调度]# kubectl  get pod
NAME    READY   STATUS    RESTARTS   AGE
nginx   1/1     Running   0          24s
[root@server2 调度]# kubectl  get pod -o wide      #新建pod优先选择有文件标签的节点
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          27s   10.244.2.3   server4   <none>           <none>

亲和与反亲和

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

节点亲和

requiredDuringSchedulingIgnoredDuringExecution 必须满足(不满足则报错)
preferredDuringSchedulingIgnoredDuringExecution 倾向满足

IgnoreDuringExecution 表示如果在Pod运行期间Node的标签发生变化,导致亲和性策略不能满足,则继续运行当前的Pod。

参考:https://kubernetes.io/zh/docs/concepts/scheduling-eviction/assign-pod-node/

  • nodeaffinity还支持多种规则匹配条件的配置如
    In:label 的值在列表内
    NotIn:label 的值不在列表内
    Gt:label 的值大于设置的值,不支持Pod亲和性
    Lt:label 的值小于设置的值,不支持pod亲和性
    Exists:设置的label 存在
    DoesNotExist:设置的 label 不存在

  • 节点亲和性pod示例:

[root@server2 调度]# cat prefer.yml
apiVersion: v1
kind: Pod
metadata:name: node-affinity
spec:containers:- name: nginximage: nginxaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:   ##必须要满足的要求,没有则运行失败nodeSelectorTerms:- matchExpressions:- key: disktypeoperator: Invalues:- ssd- satapreferredDuringSchedulingIgnoredDuringExecution:   ##可以没有,但优先考虑- weight: 1preference:matchExpressions:- key: rolesoperator: Invalues:- nginx

kubectl label node server3 disktype=ssd
kubectl label node server4 disktype=ssd
[root@server2 调度]# kubectl label node server4 roles=nginx
node/server4 labeled

server4优先

[root@server2 调度]# kubectl apply  -f prefer.yml
pod/node-affinity created
[root@server2 调度]# kubectl  get pod -o wide
NAME            READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
node-affinity   1/1     Running   0          7s    10.244.2.4   server4   <none>           <none>

pod 亲和性和反亲和性

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

  • pod亲和性:有匹配标签的node上优先调度
[root@server2 调度]# cat podpre.yml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx
---
apiVersion: v1
kind: Pod
metadata:name: myapplabels:app: myapp
spec:containers:- name: myappimage: myapp:v1affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginxtopologyKey: kubernetes.io/hostname
[root@server2 调度]# kubectl  get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
myapp   1/1     Running   0          8s    10.244.1.6   server3   <none>           <none>
nginx   1/1     Running   0          9s    10.244.1.5   server3   <none>           <none>
  • pod 反亲和性
[root@server2 调度]# cat podpre.yml
apiVersion: v1
kind: Pod
metadata:name: nginxlabels:app: nginx
spec:containers:- name: nginximage: nginx
---
apiVersion: v1
kind: Pod
metadata:name: myapplabels:app: myapp
spec:containers:- name: myappimage: myapp:v1affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginxtopologyKey: kubernetes.io/hostname

有特定标签的pod的节点不执行
[root@server2 调度]# kubectl apply -f podpre.yml
pod/nginx created
pod/myapp created

[root@server2 调度]# kubectl get pod -o wide
NAME    READY   STATUS    RESTARTS   AGE   IP           NODE      NOMINATED NODE   READINESS GATES
myapp   1/1     Running   0          11s   10.244.2.5   server4   <none>           <none>
nginx   1/1     Running   0          11s   10.244.1.4   server3   <none>           <none>

Taints(污点)

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 设置,会直接被逐出。

master端: server2上有污点,且没有容忍,所以默认是不能调度的

[root@server2 调度]# kubectl describe  nodes server2 | grep Tain
Taints:             node-role.kubernetes.io/master:NoSchedule

给server3上加此标签(污点),无法调用,直接驱离

apiVersion: apps/v1
kind: Deployment
metadata:name: web-server
spec:selector:matchLabels:app: nginxreplicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx

[root@server2 调度]# kubectl taint node server3 key1=v1:NoExecute
node/server3 tainted

  • 删除污点
    kubectl taint node server3 key1-

所有server3上的pod全部驱逐,再server4上调度pod

[root@server2 调度]# kubectl  get pod -o wide
NAME                          READY   STATUS              RESTARTS   AGE     IP           NODE      NOMINATED NODE   READINESS GATES
web-server-6799fc88d8-4mc9s   0/1     ContainerCreating   0          2s      <none>       server4   <none>           <none>
web-server-6799fc88d8-8b5sx   0/1     Terminating         0          3m55s   10.244.1.7   server3   <none>           <none>
web-server-6799fc88d8-cm5rn   0/1     Terminating         0          3m55s   10.244.1.8   server3   <none>           <none>
web-server-6799fc88d8-f2t7t   1/1     Running             0          3m55s   10.244.2.6   server4   <none>           <none>
web-server-6799fc88d8-z78wz   0/1     ContainerCreating   0          2s      <none>       server4   <none>           <none>
  • 容忍

容忍:所有

[root@server2 调度]# cat Tain.yml
apiVersion: apps/v1
kind: Deployment
metadata:name: web-server
spec:selector:matchLabels:app: nginxreplicas: 3template:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxtolerations:- operator: "Exists"   #容忍所有的污点

有污点的server2,server3均可参与调度


[root@server2 调度]# kubectl  get pod -o wide
NAME                          READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES
web-server-65797dc965-4qktn   1/1     Running   0          38s   10.244.1.9    server3   <none>           <none>
web-server-65797dc965-jc9gz   1/1     Running   0          34s   10.244.0.4    server2   <none>           <none>
web-server-65797dc965-vk89v   1/1     Running   0          36s   10.244.1.10   server3   <none>           <none>
  • tolerations示例:
tolerations:
- key: "key"operator: "Equal"value: "value"effect: "NoSchedule"
---
tolerations:
- key: "key"operator: "Exists"effect: "NoSchedule"
  • tolerations中定义的key、value、effect,要与node上设置的taint保持一直:
  • 如果 operator 是 Exists ,value可以省略。
  • 如果 operator 是 Equal ,则key与value之间的关系必须相等。
  • 如果不指定operator属性,则默认值为Equal。
  • 还有两个特殊值:
    当不指定key,再配合Exists 就能匹配所有的key与value ,可以容忍所有污点。
    当不指定effect ,则匹配所有的effect。

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

  • cordon 停止调度:
    影响最小,只会将node调为SchedulingDisabled,新创建pod,不会被调度到该节点,节点原有pod不受影响,仍正常对外提供服务。
    $ kubectl cordon server3
$ kubectl  get node
NAME      STATUS                     ROLES    AGE   VERSION
server1   Ready                      <none>   29m   v1.17.2
server2   Ready                      <none>   12d   v1.17.2
server3   Ready,SchedulingDisabled   <none>   9d    v1.17.2

$ kubectl uncordon server3 //恢复

  • drain 驱逐节点:
    首先驱逐node上的pod,在其他节点重新创建,然后将节点调为SchedulingDisabled。
    $ kubectl drain server3
    node/server3 cordoned
evicting pod "web-1"
evicting pod "coredns-9d85f5447-mgg2k"
pod/coredns-9d85f5447-mgg2k evicted
pod/web-1 evicted
node/server3 evicted

$ kubectl uncordon server3

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

$ kubectl delete node server3

$ systemctl restart kubelet (在节点端重启) //基于node的自注册功能,恢复使用

k8s调度(nodeName、nodeSelect、节点、pod的亲和和反亲和、Taints)相关推荐

  1. k8s(八)—调度因素(nodeName、nodeSelector、亲和与反亲和、Taints 污点)、影响pod调度的指令

    1 调度简介 [root@server2 ~]# kubectl get pod -n kube-system 2 影响kubernetes调度的因素 2.1 nodeName(针对节点) [root ...

  2. 图解 K8S(07):调度利器之亲和与反亲和(服务容灾)

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

  3. k8s 亲和、反亲和、污点、容忍

    目录 一.K8s调度 二.亲和与反亲和 2.1.Pod和Node 2.2.硬亲和和软亲和 三.污点与容忍 3.1  污点(Taint) 3.1.1  污点的组成 3.1.2  污点的设置和去除 3.2 ...

  4. K8S node亲和与反亲和:affinity应用

    简介: affinity是K8S 1.2版本后引入的新特性,类似于nodeSelector,允许使用者指定一些pod在Node间调度的约束,目前支持两种形式: 1. requireDuringSche ...

  5. kubernetes 亲和、反亲和、污点、容忍

    目录 一.K8s调度 二.亲和与反亲和 1.Pod和Node 2.硬亲和和软亲和 三.污点与容忍 3.1  污点(Taint) 3.1.1 污点的组成 3.1.2 污点的设置和去除 3.2  容忍(T ...

  6. 容器亲和、反亲和、污点、容忍以及驱逐的介绍

    nodeSelector简介: 官方文档: https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/ 可用于干预pod的调度结果,例 ...

  7. 【项目实战23】k8s(9)—k8s调度(节点亲和性,Taint污点,pod容忍性)

    k8s调度 一.k8s调度背景介绍 二.nodeName方式调度 三.nodeSelector方式调度 (1).使用方式 (2).节点亲和性 四.Taints污点 (1).介绍 (2).使用 五.to ...

  8. k8s调度之亲和/反亲和

    Pod的调度流程 在k8s集群中kube-scheduler组件负责为Pod选择运行节点,并由对应节点上的kubelet创建Pod.对于每个未绑定至任何节点的Pod对象,无论是新建.被驱逐等,kube ...

  9. Kubernetes-调度、节点亲和反亲和、pod亲和反亲和、Taints污点的处理

    目录: 一.kubernetes调度介绍 二.nodename节点选择约束 三.nodeSelector 亲和 1.节点亲和 2.节点反亲和 1. pod亲和 2.pod反亲和 四.Taints(污点 ...

最新文章

  1. 爱,催人泪下......
  2. PHP输入流php://input介绍
  3. MS CRM2011实体介绍(四)——目标管理方面的实体
  4. Android自定义View的实现方法,带你一步步深入了解View(四)
  5. 1000亿产值、2500万辆销售目标,范迪塞尔代言的雅迪将如何正确“出海”?
  6. JAVA中如何确保N个线程可以访问N个资源,但同时又不导致死锁?
  7. where is list binding done for Opportunity S2 view default 20 returns
  8. 通过Orchestra以微服务架构的方式生成guid
  9. 跨境电商全球趋势与独立站布局的关键点
  10. PSOLA基音同步叠加算法
  11. Android入门笔记09
  12. ubuntu 15.10 升级 到Ubuntu 16.04.3 LTS
  13. enq: HW - contention等待事件
  14. 使用sslsplit嗅探tls/ssl连接
  15. thinkphp mysql 原生_第七节:thinkphp6数据库设计和原生查询
  16. 3分钟看懂工业交换机EMS试验和高低温测试
  17. 总结了200道经典的机器学习面试题(附参考答案)
  18. 元转万元单位换算_度数单位换算(元换算成万元换算器)
  19. 从《致加西亚的信》看项目管理
  20. ANSYS Electromagnetics Suite 2022 R2 软件下载与安装教程

热门文章

  1. matlab函数定义格式
  2. 【unity基础_Day14】Unity2D、灯光粒子系统
  3. 代码首次提交到gitee上报错问题解决
  4. 威联通nas QNAP TS-453Bmini 升级内存并搭建虚拟机教程
  5. 企业微信和后台管理系统的结合管理(2)---创建企业微信应用并配置
  6. java I/O流详解
  7. DNSSEC简介(1)
  8. 视频平台完善“青少年模式”,应先“从无到有”再“从有到优”
  9. 快解析助力解决局域网打印难题
  10. 英文单词排序(c语言版)