当前位置:   article > 正文

k8s pod 在节点间调度控制

k8s pod 在节点间调度控制

博客作为学习笔记记录,若有理解,表述错误,欢迎指出。

k8s起pod时,会通过调度器scheduler选择某个节点完成调度,选择在某个节点上完成pod创建。

当需要在指定pod运行在某个节点上时,可以通过以下几种方式:

1. 在部署pod的yaml中,指定nodeName

 指定了nodeName的Pod会直接跳过Scheduler的调度逻辑,直接写入PodList列表,该匹配规则是强制匹配。

eg:

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4.   name: tomcat-deploy
  5. spec:
  6.   replicas: 1
  7.   template:
  8.     metadata:
  9.       labels:
  10.         app: tomcat-app
  11.     spec:
  12.       nodeName: k8s.node1 #指定调度节点为k8s.node1
  13.       containers:
  14.       - name: tomcat
  15.         image: tomcat:8.0
  16.         ports:
  17.         - containerPort: 8080

2. 在部署pod的yaml中,指定NodeSelector

  通过kubernetes的label-selector机制进行节点选择,由scheduler调度策略MatchNodeSelector进行label匹配,调度pod到目标节点,该匹配规则是强制约束。启用节点选择器的步骤为:

  起pod步骤:

  i. 先给node打上对应的label

  1. #标记规则:kubectl label nodes <node-name> <label-key>=<label-value>
  2. kubectl label nodes k8s.node1 cloudnil.com/role=dev
  3. #确认标记
  4. root@k8s.master1:~# kubectl get nodes k8s.node1 --show-labels
  5. NAME        STATUS    AGE       LABELS
  6. k8s.node1   Ready     29d       beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,cloudnil.com/role=dev,kubernetes.io/hostname=k8s.node1

 ii. 起pod的时候,在yaml中指定nodeSelector

  1. apiVersion: extensions/v1beta1
  2. kind: Deployment
  3. metadata:
  4.   name: tomcat-deploy
  5. spec:
  6.   replicas: 1
  7.   template:
  8.     metadata:
  9.       labels:
  10.         app: tomcat-app
  11.     spec:
  12.       nodeSelector:
  13.         cloudnil.com/role: dev #指定调度节点为带有label标记为:cloudnil.com/role=dev的node节点
  14.       containers:
  15.       - name: tomcat
  16.         image: tomcat:8.0
  17.         ports:
  18.         - containerPort: 8080

3.  使用污点(Taint)

    taint是k8s 1.6版本开始提供的功能,在k8s同样用于节点调度的,还有一个容忍(Tolerations)功能

    污点的组成为

key=value:effect

   effect支持的类型包括一下三类:

  1. NoSchedule:表示k8s将不会将Pod调度到具有该污点的Node上
  2. PreferNoSchedule:表示k8s将尽量避免将Pod调度到具有该污点的Node上
  3. NoExecute:表示k8s将不会将Pod调度到具有该污点的Node上,同时会将Node上已经存在的Pod驱逐出去

    当希望起pod的时候,某个node不参与调度,可以给这个node加上一个NoSchedule的污点,eg:

  1. # 设置污点
  2. kubectl taint nodes kube-node1 key1=value1:NoSchedule
  3. # 去除污点
  4. kubectl taint nodes kube-node1 key1:NoSchedule-

   此污点可以通过kubectl describe node <xxx-node> 查看

4. 容忍(tolerance)

     当参与taint给node打算NoSchedule的污点之后,pod无法调度到该节点上运行,但有时我们希望某些pod仍然能运行到该node上时,可以通过在部署pod的yaml中添加tolerance,使pod能跳过污点,调度到对应节点上:

eg:

  1. tolerations:
  2. - key: "key1"
  3.   operator: "Equal"
  4.   value: "value1"
  5.   effect: "NoSchedule"
  6.   tolerationSeconds: 3600
  7. - key: "key1"
  8.   operator: "Equal"
  9.   value: "value1"
  10.   effect: "NoExecute"
  11. - key: "key2"
  12.   operator: "Exists"
  13.   effect: "NoSchedule"

其中:

operator为Equal时,key, vaule, effect要与Node上设置的taint保持一致

operator为Exist时,将会忽略value的值

tolerationSeconds指当pod需要被驱逐时,仍能在node上保留运行的时间

当tolerance不指定effect时,将容忍污点的所有作用

  1. tolerations:
  2. - key: "key"
  3.   operator: "Exists"

5. cordon/uncordon/drain

   这几个命令用于k8s节点维护,用法:

kubectl cordon <xxx-node>

 此时通过

kubectl get node -o wide

可以看到node的状态为scheduleDisable,即该节点为不可调度状态。

可以通过uncordon来恢复node状态:

kubectl uncordon <xxx-node>

当cordon node之后,原来运行在node上的pod,当超过保活周期之后,将会重新调度在其他node上运行。如果想让pod马上实现迁移,可以使用drain完成。

drain:标记节点为不可调度,并驱逐节点上的pod,用法:

kubectl drain <xxx-node>

注意:drain不只是当node被cordon时才适用,其实当node正常运行时,也可以用drain将运行在该node的pod驱赶出去

 

REF:

https://blog.csdn.net/tiger435/article/details/73650147

https://blog.frognew.com/2018/05/taint-and-toleration.html#%E5%AE%B9%E5%BF%8Dtolerations

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/629203
推荐阅读
相关标签
  

闽ICP备14008679号