nodeName:硬匹配,不走调度策略

nodeSelector:根据节点的标签选择,会走调度的算法

只要是走调度算法,在不满足预算策略的情况下,所有pod都是pending

node节点的亲和性:

硬策略:必须满足的条件。匹配原则也是根据节点的标签

软策略:尽量满足你的要求,而不是一定满足

拓扑域:k8s集群节点当中的一个组织结构,可以根据节点的物理关系或者逻辑关系进行

可以用来表示节点之间的空间关系,网络关系或者其他类型的关系

标签。主机标签

pod

node01 node02 node03

app1 app2 app3

pod的亲和性和反亲和性

调度策略

匹配标签

操作符

拓扑域

node的亲和性

主机标签

In Notin exists DoesNotExist Gt Lt

不支持

pod的亲和性

pod的标签

In Notin exists DoesNotExit

支持

pod的反亲和性

pod的标签

In Notin exists DoesNotExit

支持

注意点:

1、pod的亲和性策略,在配置时,必须要加上拓扑域的关键字topologykey,指向的是节点标签

2、pod亲和性的策略也分为硬策略和软策略。

3、pod亲和性的notIn可以替代反亲和性

4、pod亲和性只是为了把相关联的pod部署在同一节点。lnmp

污点和容忍可以配合node的亲和性一起使用

污点:是node的调度机制 。不是pod

被设为污点的节点,不会部署pod

污点和亲和性相反,亲和性是尽量或者一定选择,污点则是一定不被选择

污点的节点一定不被选择么?

taint三种:

1、Noschedule:K8S不会将pod调度到这个节点上

2、PreferNoschedule:如果污点类型是这个,那么只是尽量避免把pod布置在该节点上

3、NoExecute:如果污点类型是他,那么k8s将会把该节点上的pod全部驱逐出去,而且也不会调度

基于控制器创建的pod虽然被驱逐,但是会在其他节点重新部署

自主pod会被直接杀死

注意点:节点服务器需要维护的,服务器关机,节点上的pod将会失效。在工作中我们主要部署Pod的方式控制器部署,deployment最多的,一旦节点设置为驱逐,控制器创建的pod会在其他节点重新部署

所有的pod都会驱逐,跟命名空间无关,所有的一切都会被驱逐

不论你的创建方式是什么,都会被驱逐

系统集群组件不会被驱逐

容忍:

即使节点上设置了污点,有了容忍机制,依然可以在设置为污点的节点上部署pod

特殊情况: NoExecute依然可以部署pod,但是有生命周期,时间一到,pod会被销毁,重新拉起

生命周期结束之后会驱逐一部分pod到其他节点,有的节点还是会保留在这个污点节点上

      tolerations:
      - key: key
       operator: Exists 
指定key的值,指标节点的标签值,但是不指定污点的类型
那么所有节点上只要包含了这个指定的标签名,可以容忍所有的污点

      tolerations:
      - operator: Exists 
      - effect: NoSchedule
没有key,不匹配节点标签,他会容忍所有污点,但是类型是所指定的类型    

node的亲和性

pod的亲和性和反亲和性

污点和容忍

如何选择node节点来部署pod

选择一个我期望的节点来部署pod

多个master节点:

kubectl taint node master节点名称 node-role.kubernetes.io/master=PreferNoSchedule

尽量不往master节点上部署pod,但是不是一定的,防止资源浪费。自定义一个标签。

业务维护:

node02需要维护两个小时

但是这个节点还有业务pod在运行

就需要把这个节点的污点设置为:NoExwcute

部署pod一般都是使用deployment部署的Pod,会在其他节点重新生成,重新部署

自主式的Pod,会被删除,杀死

一旦节点恢复,一定要把污点去除

cordon和drain

cordon:可以直接把节点标记为不可用状态

drain:排水,把该节点下的pod全部转移到node节点上运行。

1、一旦执行了drain,node被执行的节点,会变成不可调度状态

2、会驱逐该节点上的所有pod

kubectl drain node02 --ignore-daemonsets --delete-local-data --force 
drain:标记node节点为不可调度。开始驱逐pod
--ignore-daemonsets:忽视daemonsets部署的pod,daemonsets部署的pod还在节点不做处理
--delete-local-data:有本地挂载卷的pod会被强制杀死 
--force:强制释放不是控制器管理的pod

node亲和性

pod的亲和性,反亲和性

污点:

NoExecute

cordon 可以直接用命令行来设置

drain

--ignore-daemonsets:daemonsets部署的一般都是重要的后台运行的系统pod,所以不动

重要的就是node亲和性,pod亲和性,反亲和性,污点:NoExcute

都有软策略和硬策略,针对亲和和反亲和性来的

如何部署pod是比较重要的集群资源的调度机制,合理的配置pod的调度机制可以使资源最大化利用

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐