Pod的亲和性和反亲和性

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

调度策略匹配标签操作符拓扑域调度目标
node的亲和性主机标签In、NotIn、Exists、DoesNotExist、Gt、Lt不支持指定主机
pod的亲和性pod的标签In、NotIn、Exists、DoesNotExist支持pod和指定标签的pod部署在同一拓扑域中
pod的反亲和性pod的标签In、NotIn、Exists、DoesNotExist支持pod和指定标签的pod部署在不同的拓扑域中

 

拓扑域:k8s集群节点当中的一个组织结构,可以更具节点的物理关系或者逻辑关系进行划分。可以用来表示节点之间的空间关系。网络关系或者其他类型的关系。

这里的亲和性反亲和性都指的是标签。

node匹配的是主机的标签而pod匹配的是pod自己的标签

策略部署实验

 这里使用硬策略

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: nginx2name: nginx2
spec:replicas: 3selector:matchLabels:app: nginx2template:metadata:creationTimestamp: nulllabels:app: nginx2spec:containers:- image: nginx:1.22name: nginx2affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginxtopologyKey: test1
#topologyKey:指定拓扑域的关键字段
#表示我正在使用test1作为拓扑域的关键字
#这个test1一般是节点标签。
#表示希望把pod调度到包含有app标签的pod。他的值为nginx在test1的拓扑域上的节点

使用Exists包含类型:

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:app: nginx2name: nginx2
spec:replicas: 3selector:matchLabels:app: nginx2template:metadata:creationTimestamp: nulllabels:app: nginx2spec:containers:- image: nginx:1.22name: nginx2affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: ExiststopologyKey: test1
#topologyKey:指定拓扑域的关键字段
#表示我正在使用test1作为拓扑域的关键字
#这个test1一般是节点标签。
#表示希望把pod调度到包含有app标签的pod。他的值为nginx在test1的拓扑域上的节点

使用DoesNotExist不包含:

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:test: nginxname: nginx
spec:replicas: 3selector:matchLabels:test: nginxtemplate:metadata:creationTimestamp: nulllabels:test: nginxspec:containers:- image: nginx:1.22name: nginxaffinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: DoesNotExisttopologyKey: test3
#topologyKey:指定拓扑域的关键字段
#表示我正在使用test1作为拓扑域的关键字
#这个test1一般是节点标签。
#表示希望把pod调度到包含有app标签的pod。他的值为nginx在test1的拓扑域上的节点
#这里DoesNotExists表示不包含key值为app还必须满足在包含test1的拓扑域中

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:test: nginx2name: nginx2
spec:replicas: 3selector:matchLabels:test: nginx2template:metadata:creationTimestamp: nulllabels:test: nginx2spec:containers:- image: nginx:1.22name: nginx2affinity:podAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: DoesNotExisttopologyKey: test1

pod的反亲和性

这里使用软策略:

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:test: nginx2name: nginx2
spec:replicas: 3selector:matchLabels:test: nginx2template:metadata:creationTimestamp: nulllabels:test: nginx2spec:containers:- image: nginx:1.22name: nginx2affinity:podAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 1podAffinityTerm:labelSelector:matchExpressions:- key: appoperator: Invalues:- nginx1topologyKey: test1

这里使用硬策略:

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:test: nginx2name: nginx2
spec:replicas: 3selector:matchLabels:test: nginx2template:metadata:creationTimestamp: nulllabels:test: nginx2spec:containers:- image: nginx:1.22name: nginx2affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- nginx1topologyKey: test1

特点:

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

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

  3. pod亲和性的notin可以替代反亲和性

  4. pod亲和性主要是为了把相关联的pod组件部署在同一节点上。例如:LNMP

污点和容忍

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

污点是node的调用机制。不是pod的

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

污点和亲和性相反。亲和性是尽量选择和一定选择。

污点的节点一定不被选择。

taint(污点)有三种策略:

  1. NoSchedule:k8s不会把pod调度到这个节点上。

  2. PreferNoSchedule:这个污点类型表示尽量避免把pod部署在该节点上。不是一定(master节点的污点就是这个类型在一定程度上提高资源利用率)

  3. NoExecute:这个污点类型表示k8s将会把该节点上的pod驱逐出去。也不会调度到这个节点。

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

如果是自主pod将会被直接杀死

过滤污点

kubectl describe nodes master01 | grep -i taints
#查看污点kubectl taint nodes 主机名 node-role.kubernetes.io/master:NoSchedule-
#过滤并删除污点

设置污点

kubectl taint node node01 key=1:NoSchedule
#key=1设置标签的值
#:NoSchedule并将这个值与污点做映射kubectl taint node node01 key:NoSchedule-
#删除污点

PreferNoSchedule

kubectl taint node node02 key=1:PreferNoSchedule

NoExecute(驱逐):

kubectl taint node node02 key=1:NoExecute

所有的pod都会被驱逐和命名空间无关。所有的pod都会被驱逐。只有组件pod还在。

不论创建方式是什么都会被驱逐。系统集群组件不会被驱逐。

所有的pod都会被驱逐和命名空间无关。所有的pod都会被驱逐。基于控制器创建的pod会驱逐到其他节点上重新部署。自主创建的将直接被杀死。系统集群组件不会被驱逐。

容忍

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

配置容忍

容忍NoSchedule举例:

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:test: nginx2name: nginx2
spec:replicas: 6selector:matchLabels:test: nginx2template:metadata:creationTimestamp: nulllabels:test: nginx2spec:containers:- image: nginx:1.22name: nginx2tolerations:
#tolerations:表示容忍- key: key
#这里的key是节点的标签名operator: Equalvalue: "1"effect: NoSchedule
#effect:表示对应的污点类型。必须要和节点的污点保持一致
#表示容忍节点上的标签是key。对应的标签值是1

容忍NoExecute举例:

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:test: nginx2name: nginx2
spec:replicas: 6selector:matchLabels:test: nginx2template:metadata:creationTimestamp: nulllabels:test: nginx2spec:containers:- image: nginx:1.22name: nginx2tolerations:- key: key
#tolerations:表示容忍
#这里的key是节点的标签名operator: Equalvalue: "1"effect: NoExecutetolerationSeconds: 36
#effect:表示对应的污点类型。必须要和节点的污点保持一致
#表示容忍节点上的标签是key。对应的标签值是1
#tplerationSeconds:设置节点可以容忍多长时间。

设置容忍策略36秒后

时间到期后将会销毁并且拉起新的容器

特殊情况:NoExecute依然可以部署pod但是有生命周期。时间一到pod将会被销毁。生命周期结束之后,会驱逐一部分pod到其他节点。

用于该节点维护完毕,测试以下节点的工作是否正常

不指定key实验举例:

 

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:test: nginx2name: nginx2
spec:replicas: 3selector:matchLabels:test: nginx2template:metadata:creationTimestamp: nulllabels:test: nginx2spec:containers:- image: nginx:1.22name: nginx2tolerations:- operator: Existseffect: NoSchedule
#如果没有声明key和value。将会容忍所有污点的key。
#key对应节点的污点类型是NoSchedule

没有key。他不会匹配节点的标签。他会容忍所有污点。但是类型是指定的类型。

指定key不指定effect实验举例:

apiVersion: apps/v1
kind: Deployment
metadata:creationTimestamp: nulllabels:test: nginx2name: nginx2
spec:replicas: 3selector:matchLabels:test: nginx2template:metadata:creationTimestamp: nulllabels:test: nginx2spec:containers:- image: nginx:1.22name: nginx2tolerations:- key: keyoperator: Exists
#指定key没有设置effect:容忍污点的类型
#他将会容忍所有节点的所有污点类型

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

pod的亲和性和反亲和性以及污点和容忍的作用就是通过判断条件选择node节点来部署pod。选择一个期望的节点来部署pod

多个master节点的情况:

,node-role.kubernetes.io/master=:PreferNoSchedule
#尽量不往master节点上部署pod。但是不是一定。这样可以防止资源浪费。同样也可也自定义一个标签。

业务维护的情况:

当node02需要维护两个小时,但是节点上还有业务pod在运行。

这个时候就需要把这个节点的污点设置为:NoExecute(驱逐)污点类型。

我们部署pod一般都是使用deployment部署,会在其他的节点重启杀死,并不是被杀死

但是自主式的pod会被删除

一旦节点恢复就把污点去除

cordon和drain

cordon

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

kubectl cordon 节点名称
#直接把节点标记为不可用状态kubectl uncordon 节点名称
#取消标记为不可用状态

 

drain

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

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

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

kubectl drain 节点名称 --ignore-daemonsets --delete-local-data --force
#drain:开始标记node节点为不可调度。然后驱逐pod
#--ignore-daemonsets:表示忽视。会无视daemonsets部署的pod。他还会在原节点上。
#--delete-local-data:如果有本地挂载卷的pod将会被强制杀死
#--force:强制释放不是控制器管理的pod
#是控制器创建的将会被驱逐。不是控制器创建的将会被杀死
#daemonsets一般部署的都是重要的后台系统pod。所以会忽略kubectl uncordon 节点名称
#取消标记驱逐节点

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/334114.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++的一些书籍整理(个人学习)

UNIX环境高级编程(第三版) UNXI网络编程卷1 网络编程的笔记 收藏 我会了 一堆书 这个仓 数据库连接池原理介绍常用连接池介绍

YOLOv8/v7/v5全网首发原创独家创新,内涵CBAM注意力改进、ECA改进,SPPF改进等

💡💡💡全网独家首发创新(原创),纯自研模块,适合paper !!! 💡💡💡内涵CBAM注意力改进、ECA改进,SPPF改进等&am…

Win10子系统Ubuntu实战(一)

在 Windows 10 中安装 Ubuntu 子系统(Windows Subsystem for Linux,简称 WSL)有几个主要的用途和好处:Linux 环境的支持、跨平台开发、命令行工具、测试和验证、教育用途。总体而言,WSL 提供了一种将 Windows 和 Linux…

基于 Validator 类实现 ParamValidator,用于校验函数参数

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器,从编码到发布全过程》 2、相关回顾 使用 TypeV…

龙蜥副理事长张东:潮蜥共引,繁荣系统软件生态 | 2023龙蜥操作系统大会

2023 年 12 月 17-18 日,由开放原子开源基金会指导,龙蜥社区主办,阿里云、中兴通讯、浪潮信息、Arm、Intel 等 24 家理事单位共同承办,主题为“云智融合共筑未来”的 2023 龙蜥操作系统大会在北京圆满结束。本次大会上&#xff0c…

2024第十六届数字图像处理国际会议(ICDIP 2024) 即将召开!

第十六届数字图像处理国际会议(ICDIP 2024)将于2024年5月24-26日在中国海口召开。本次会议由海南大学主办,海南大学计算机科学与技术学院承办。ICDIP自2009年开办以来,已先后在新加坡、日本、中国、马来西亚理科大学等国家成功举办…

记录汇川:ITP与Autoshop进行仿真连接

1、定义如下程序: 2、ITP新建工程: 3、依次选择,最后修改IP 4、定义两个变量 5、拖一个按钮和一个圈出来,地址绑定:M1 6、地址绑定:Y1 7、PLC启动仿真 8、ITP启动在线模拟器 9、即可实现模拟仿真

高效构建Java应用:Maven入门和进阶(三)

高效构建Java应用:Maven入门和进阶(三) 三. Maven的核心功能和构建管理3.1 依赖管理和配置3.2 依赖传递和冲突3.3 依赖导入失败场景和解决方案3.4 扩展构建管理和插件配置 三. Maven的核心功能和构建管理 3.1 依赖管理和配置 Maven 依赖管理…

奇偶链表00

题目链接 奇偶链表 题目描述 注意点 在 O(1) 的额外空间复杂度和 O(n) 的时间复杂度下解决这个问题偶数组和奇数组内部的相对顺序应该与输入时保持一致 解答思路 奇数组的头节点是head,偶数组的头节点是head.next,关键是要改变每个节点的next指针及…

Linux习题2

解析:虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续可用的内存,使得每个进程看到的内存空间一致。 解析:所谓系统调用,就是内核提供的、功能十分强大的一系列的函数。这些系统调用是在内核中实现的&…

工程项目管理系统源码与Spring Cloud:实现高效系统管理与二次开发

随着企业规模的不断扩大和业务的快速发展,传统的工程项目管理方式已经无法满足现代企业的需求。为了提高工程管理效率、减轻劳动强度、提高信息处理速度和准确性,企业需要借助先进的数字化技术进行转型。本文将介绍一款采用Spring CloudSpring BootMybat…

为什么企业上了ERP,效率反而更低?

“为什么上了ERP,效率反而更低?” 不知道这种疑惑是在什么情况下产生的? 毕竟一句“上了ERP,效率反而变低了”并不能概括所有可能的情况—— 是某个车间效率变低了,某条生产线效率变低了?还是企业整体效…