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: null
  labels:
    app: nginx2
  name: nginx2
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx2
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: nginx2
    spec:
      containers:
      - image: nginx:1.22
        name: nginx2
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx
            topologyKey: test1
#topologyKey:指定拓扑域的关键字段
#表示我正在使用test1作为拓扑域的关键字
#这个test1一般是节点标签。
#表示希望把pod调度到包含有app标签的pod。他的值为nginx在test1的拓扑域上的节点

使用Exists包含类型:

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

使用DoesNotExist不包含:

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

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    test: nginx2
  name: nginx2
spec:
  replicas: 3
  selector:
    matchLabels:
      test: nginx2
  template:
    metadata:
      creationTimestamp: null
      labels:
        test: nginx2
    spec:
      containers:
      - image: nginx:1.22
        name: nginx2
      affinity:
        podAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                 - key: app
                   operator: DoesNotExist
              topologyKey: test1

pod的反亲和性

这里使用软策略:

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    test: nginx2
  name: nginx2
spec:
  replicas: 3
  selector:
    matchLabels:
      test: nginx2
  template:
    metadata:
      creationTimestamp: null
      labels:
        test: nginx2
    spec:
      containers:
      - image: nginx:1.22
        name: nginx2
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                 - key: app
                   operator: In
                   values:
                   - nginx1
              topologyKey: test1

这里使用硬策略:

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    test: nginx2
  name: nginx2
spec:
  replicas: 3
  selector:
    matchLabels:
      test: nginx2
  template:
    metadata:
      creationTimestamp: null
      labels:
        test: nginx2
    spec:
      containers:
      - image: nginx:1.22
        name: nginx2
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx1
            topologyKey: 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: null
  labels:
    test: nginx2
  name: nginx2
spec:
  replicas: 6
  selector:
    matchLabels:
      test: nginx2
  template:
    metadata:
      creationTimestamp: null
      labels:
        test: nginx2
    spec:
      containers:
      - image: nginx:1.22
        name: nginx2
      tolerations:
#tolerations:表示容忍
      - key: key
#这里的key是节点的标签名
        operator: Equal
        value: "1"
        effect: NoSchedule
#effect:表示对应的污点类型。必须要和节点的污点保持一致
#表示容忍节点上的标签是key。对应的标签值是1

容忍NoExecute举例:

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

设置容忍策略36秒后

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

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

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

不指定key实验举例:

 

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

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

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

apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    test: nginx2
  name: nginx2
spec:
  replicas: 3
  selector:
    matchLabels:
      test: nginx2
  template:
    metadata:
      creationTimestamp: null
      labels:
        test: nginx2
    spec:
      containers:
      - image: nginx:1.22
        name: nginx2
      tolerations:
      - key: key
        operator: 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 节点名称
#取消标记驱逐节点

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【DNS Server Spoofed Request Amplification DDoS漏洞修复】

文章目录 前言 之前对公司服务器做漏洞扫描,发现扫描工具提示存在这样一个漏洞,本来觉得漏洞利用率低,而且扫描百度,QQ等网站也会有此漏洞,主要是找了很久资料也不知道如何修复,所以暂未处理。但是近期由于…

基于ODBC的数据库应用(MFC)

文章目录 1.预备知识1.数据库概述1.数据库和DBMS2.结构化查询语言SQL(Structured Query Language)3.数据库方式种类1.ODBC(Open DataBase Connectivity)开放数据库连接2.DAO(Data Access Objects)数据访问对象3.OLE DB(OLE数据库) 2.MFC ODBC1.CRecordset类构造记录集属性记录集…

制作更好的待办事项清单的方法有哪些?

在忙碌的工作、学习或生活中,我们都渴望变得更加自律,希望每件事都能有目标、有计划地高效完成。而要实现这一愿望,一个精心制作的待办事项清单无疑是不可或缺的。那么,制作更好的待办事项清单的方法有哪些?高效的待办…

C++深入学习之模板

为什么需要模板 先来看下面一段程序: int add(int x, int y) {return x y; }double add(double x, double y) {return x y; }long add(long x, long y) {return x y; }string add(string x, string y) {return x y; }//T1 T2 T3 T3 add(T1 x, T2 y) {return…

Apache ActiveMQ 远程代码执行漏洞分析

漏洞简介 Apache ActiveMQ官方发布新版本,修复了一个远程代码执行漏洞,攻击者可构造恶意请求通过Apache ActiveMQ的61616端口发送恶意数据导致远程代码执行,从而完全控制Apache ActiveMQ服务器。 影响版本 Apache ActiveMQ 5.18.0 before …

docker部署firefox浏览器,实现远程访问

拉取firefox镜像,部署代码 docker run -d --name firefox -e TZAsia/Hong_Kong -e DISPLAY_WIDTH1920 -e DISPLAY_HEIGHT1080 -e KEEP_APP_RUNNING1 -e ENABLE_CJK_FONT1 -e VNC_PASSWORD12345678ABCabc -p 5800:5800 -p 5900:5900 -v /docker/firefox/config:/…

阿里云计算平台大数据基础工程技术团队直聘!!!

大数据基础工程技术团队,隶属于阿里云智能集团计算平台事业部,是一支负责阿里集团、公共云和混合云场景计算平台大数据&AI产品的稳定性建设、架构&成本优化、运维产品ABM(Apsara Big data Manager)研发和售后技术专家支持…

05、Kafka ------ 各个功能的作用解释(主题和分区 详解,用命令行和图形界面创建主题和查看主题)

目录 CMAK 各个功能的作用解释(主题)★ 主题★ 分区★ 创建主题:★ 列出和查看主题 CMAK 各个功能的作用解释(主题) ★ 主题 Kafka 主题虽然也叫 topic,但它和 Pub-Sub 消息模型中 topic 主题及 AMQP 的 t…

好用的AI写作软件,这6款助你轻松写作

这几年,AI在线写作平台在国内市场上呈现出蓬勃发展的态势,这些写作软件能够帮助用户快速生成高质量的文章。下面我将介绍国内的6款AI在线写作平台,一起来看看吧! 第一个爱制作AI 爱制作AI是拥有智能创作的AI在线写作平台之一&…

深兰科技AI医疗健康产品获3000台采购订单

12月6日,武汉某企业与深兰科技签署协议,一次性采购3000台深兰科技AI生理健康检测仪——扁鹊。 深兰科技AI生理健康检测仪——扁鹊是深兰科技推出的人体生理指标检测产品。基于AI生物技术、融合互联网医疗及AIoT技术,深兰科技AI生理健康检测仪…

限制选中指定个数CheckBox控件(2/2)

实例需求:工作表中有8个CheckBox控件(下文中简称为控件),现在需要实现限制用户最多只能勾选4个控件。 在上一篇博客中已经实现了这个需求,其基本思路是用户选中第5个控件时,事件代码将取消勾选最后一个选中…

弱光图像增强算法(6大算法附程序),一站式解决论文实验比较部分

过往几年大量从事弱光图像增强的炒菜工作。 为了方便科研比较,也就是主观视觉比较和定量比较,提供一个集成程序给各位参考 非常简单,只需要点击Main.PY和修改输出的路径即可 本次收集的6类算法(EnlightenGAN, RUAS, SCI, ZeroDCE, ZeroDCE…

python封装接口自动化测试套件 !

在Python中,我们可以使用requests库来实现接口自动化测试,并使用unittest或pytest等测试框架来组织和运行测试套件。以下是一个基本的接口自动化测试套件封装示例: 首先,我们需要安装所需的库: pip install requests …

运动耳机怎么选?2024年运动耳机推荐,运动蓝牙耳机排行榜10强

​在现代生活中,音乐和运动已经成为很多人生活不可分割的一部分。运动耳机在这样的背景下变得越来越受欢迎,它们不仅可以在运动时提供音乐的陪伴,还能增加运动时的乐趣和动力。但是,面对市面上众多不同类型的运动耳机,…

Linux进程通信之管道

目录 1、无名管道 1.无名管道的特点 2.pipe函数创建管道 3.图例 2、命名管道(FIFO) 1.命名管道的特点 2.mkfifo 函数-创建命名管道 3.示例 1.循环读取数据 2.循环写入数据 1、无名管道 管道通常指的就是无名管道, 1.无名管道的特点…

校招行测,认知能力测验,④破解数量关系测试题

数量关系,值得是数量计算、对比和分析,每种题型都有一定的规律性,如果善于终结也是容易掌握的,当然,只有见多,才能识广,最好的方式就是,锻炼,刷题,就算是临时…

3D Web可视化开发工具包HOOPS Communicator:提供Web端浏览大型模型新方案!

前言:HOOPS Communicator是Tech Soft 3D旗下的主流产品之一,具有强大的、专用的高性能图形内核,专注于基于Web的高级3D工程应用程序。其由HOOPS Server和HOOPS Web Viewer两大部分组成,提供了HOOPS Convertrer、Data Authoring的模…

类和对象的定义以及使用

文章目录 1. 类和对象的基本概念1.1 JAVA是面向对象语言1.2 类和对象的描述 2. 类与对象的定义与使用2.1 类的定义格式2.2 类的实例化(对象的创建)2.3 举个例子 3. 对象的构造及初始化3.1构造方法3.1.1构造方法的定义3.1.2 构造方法的特性 4.2 默认初始化5.4 就地初始化 4.this…

九州金榜如何让孩子在家庭教育中更优秀

​ 每个人在出生时就有上天恩赐的两份礼物,一份是血脉相连的亲情,一份是家庭的关爱与教育。 最早接触的人就是父母,最早接触的教育就是家庭教育,这对孩子的影响极为深远。 这种家庭教育相比较学校教育,不仅有言传教…

认知能力测验,⑤破解图形推理测试题,校招社招网申在线测评必用

认知能力测试,如今是每个求职者必须要面对的,有的人可以顺顺利利通过,而有的人只能够遗憾止步。想要通过认知能力测验,并不是一件易事,而今天要说的图形推理,仅仅是其中的一个部分,抛砖引玉&…