首页 > 其他 > 详细

pod 的高级调度

时间:2020-02-04 16:30:48      阅读:73      评论:0      收藏:0      [点我收藏+]

简述

Kubernetes允许你去影响pod被调度到哪个节点。 起初, 只能通过在pod规范里指定节点选择器来实现,其实还有更高级的机制比如利用污点和亲缘性来实现pod 的调度。

污点和容忍度

首先要介绍的高级调度的两个特性是节点污点, 以及pod对于污点的容忍度,前者配置在节点上后者配置在Pod上。这些特性被用于限制哪些pod可以被调度到某一个节点。 只有当 一个pod 具有容忍某个节点的污点的容忍度, 这个pod才能被调度到该节点否则不能被调度到该节点。

区别

这与使用节点选择器和节点亲缘性有些许不同,污点是在不修改巳有pod信息的前提下,通过在节点上添加污点信息,来拒绝pod在某些节点上的部署。 

查看节点上的污点属性

 

技术分享图片
kubectl describe node master.k8s
 ...  ...
   Taints: node-role.kubernetes.io/master:NoSchedule 
View Code

 

信息显示格式

节点包含一个污点,污点包含了 一 个key、value, 以及一个effect, 表现为<key>=<value>:<effect>。上面显示的主节点的污点信息,包含一 个为node­-role.kubernetes.io/master的key, 一个空的value, 以及值为NoSchedule的effect。
这个污点将阻止pod调度到这个节点上面,除非有pod能容忍这个污点,而通常容忍这个污点的pod都是系统级别pod 。

查看pod 的污点容忍度

技术分享图片
kubectl describe po kube-proxy-80asd -n kube-system
   ...  ...
   Tolerations:  node-role.kubernetes.io/master=:NoSchedule
             node.alpha.kubernetes.io/notReady=:Exists:NoExecute
            node.alpha.kubernetes.io/unreachable=:Exists:NoExecute 
   ...  ...
   
  第一个污点容忍度匹配了某个节点的污点,表示允许这个 pod被调度到具有该污点的节点上。

 kubectl get po kube-proxy-80asd -o yaml -n kube-system
  ... ...
View Code

Tips:

注意尽管在pod的污点容忍度中显示了等号,但是在节点的污点信息中却没有。当污点或者污点容忍度中的value为null时,kubectl故意将污点和污点容忍度进行不同形式的显示。

污点的效果 

如上所示另外两个在kube-proxy pod 上的污点定义了当节点状态是没有ready 或者是 unreachable 时,该 pod 允许运行在该节点多长时间(时间用秒来表示,这里没有显示,
但是在podYAML 中可以看到)。 这两个污点容忍度使用的效果是 NoExecute 而不是 NoSchedule。
每一个污点都可以关联一个效果, 效果包含了以下三种:
技术分享图片
• NoSchedule 表示如果 pod 没有容忍这些污点, pod 则不能被调度到包含这些污点的节点上。

• PreferNoSchedule 是NoSchedule 的一个宽松的版本, 表示尽量阻止pod 被调度到这个节点上,但是如果没有其他节点可以调度,pod依然会被调度到这个节点上。

• NoExecute 不同于 NoSchedule 以及 PreferNoSchedule, 后两者只在调度期间起作用, 而 NoExecute 也会影响正在节点上运行着的 pod。 如果在一个节点上添加了 
  NoExecute 污点, 那些在该节点上运行着的 pod, 如果没有容忍这个 NoExecute 污点, 将会从这个节点去除。
View Code

在节点上添加自定义污点

假设你有一个单独的 Kubernetes 集群, 上面同时有生产环境和非生产环境的流量。 其中最重要的一点是, 非生产环境的 pod 不能运行在生产环境的节点上。 可以
通过在生产环境的节点上添加污点来满足这个要求
$ kubect1 taint node nodel.k8s node-type=production:NoSchedule
这个命令添加了一个 taint, 其中, key 为 node-type, value 为 production,效果为 NoSchedule。

在pod上添加污点容忍度

技术分享图片
apiVersion: extensions/vlbetal
kind: Deployment
metadata: 
  name: prod 
spec: 
  replicas: 5 
  template:
    spec: 
      ... ...
      tolerations: 
      - key: node-type
        operator: Equal 
        value: production 
        effect: NoSchedule
View Code

污点和污点容忍度的使用场景

节点可以拥有多个污点信息,而pod也可以有多个污点容忍度。正如你所见,污点可以只有一个key和 一 个效果,而不必设置value。污点容忍度可以通过设置Equal操作符来指定匹配的value (默认情况下的操作符),或者也可以通过设置Exists操作符来匹配污点的key。

1、默认情况下,一个集群中的主节点需要设置污点,这样才能保证只有控制面板pod才能部署在主节点上。 
2、假设你有一个单独的 Kubernetes 集群, 上面同时有生产环境和非生产环境的流量。 其中最重要的一点是, 非生产环境的 pod 不能运行在生产环境的节点上。 可以
通过在生产环境的节点上添加污点来满足这个要求。
3、可以将一个集群分成多个部分, 只允许开发团队将pod调度到他们特定的节点上。 当你的部分节点提供了某种特殊硬件, 并且只有部分pod需要使用到这些硬件的时候, 也可以通过设置污点和容忍度的方式来实现。
 
4、配置节点失效之后的 pod 重新调度最长等待时间
 
你也可以配置一个容忍度, 用于当某个pod运行所在的节点变成unready或者unreachable状态时,Kubemetes可以等待该pod被调度到其他节点的最长等待时间。
如果查看其中一个pod的容忍度信息, 你将看到两条容忍度信息,如下所示:
技术分享图片

 

这两个容忍度表示, 该pod将 容忍所 在节点处千notReady或 者后将把该pod重新调度到其他节点上。当没有定义这两个容忍度时, 他们会自动添加到pod上。 如果你觉得对于你的pod来说,5分钟太长的话,可以在pod描述中显式地将这两个容忍度设置得更短一些。
注意当前这是一个 alpha阶段的特性,在未来的Kubemetes版本中可能会有所改变。基于污点信息的pod剔除也不是默认启用的, 如果要启用这个特性, 需要在
unreachable状态维持300秒。 当Kubemetes控制器检测到有节 点处于notReady或者unreachable状态时, 将会等待300秒, 如果状态持续的话, 之后将把该pod重新调度到其他节点上。
当没有定义这两个容忍度时, 他们会自动添加到pod上。 如果你觉得对于你的pod来说,5分钟太长的话,可以在pod描述中显式地将这两个容忍度设置得更短一些

 notice: 当前这是一个 alpha阶段的特性,在未来的Kubemetes版本中可能会有所改变。基于污点信息的pod剔除也不是默认启用的, 如果要启用这个特性, 需要在

  运行控制器管理器时使用--feature-gates=TaintBasedEvictions=true 选项
 

pod 的高级调度

原文:https://www.cnblogs.com/fanggege/p/12259795.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!