k8s的亲和调度

news2024/11/25 16:23:53

k8s的亲和调度

出于高效通信等需求,偶尔需要把一些Pod对象组织在相近的位置(同一节点、机架、区域或地区等),例如应用程序的Pod及其后端提供数据服务的Pod等,我们可以认为这是一类具有亲和关系的Pod对象。

理想的实现方式是允许调度器把第一个Pod放置在任何位置,而后与其有着亲和或反亲和关系的其他Pod据此动态完成位置编排,这就是Pod亲和调度与反亲和调度的功用。Pod间的亲和关系也存在强制亲和及首选亲和的区别,它们表示的约束意义同节点亲和相似。

Pod 亲和性

Pod 亲和性(podAffinity)主要解决 Pod 可以和哪些 Pod 部署在同一个拓扑域中的问题(其中拓扑域用主机标签实现,可以是单个主机,也可以是多个主机组成的 cluster、zone 等等),而 Pod 反亲和性主要是解决 Pod 不能和哪些 Pod 部署在同一个拓扑域中的问题,它们都是处理的 Pod 与 Pod 之间的关。

[root@k8s-01 ~]# kubectl explain deploy.spec.template.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution
KIND:     Deployment
VERSION:  apps/v1

RESOURCE: requiredDuringSchedulingIgnoredDuringExecution <[]Object>

DESCRIPTION:
     If the affinity requirements specified by this field are not met at
     scheduling time, the pod will not be scheduled onto the node. If the
     affinity requirements specified by this field cease to be met at some point
     during pod execution (e.g. due to a pod label update), the system may or
     may not try to eventually evict the pod from its node. When there are
     multiple elements, the lists of nodes corresponding to each podAffinityTerm
     are intersected, i.e. all terms must be satisfied.

     Defines a set of pods (namely those matching the labelSelector relative to
     the given namespace(s)) that this pod should be co-located (affinity) or
     not co-located (anti-affinity) with, where co-located is defined as running
     on a node whose value of the label with key <topologyKey> matches that of
     any node on which a pod of the set of pods is running

FIELDS:
   labelSelector        <Object>
     A label query over a set of resources, in this case pods.

   namespaceSelector    <Object>
     A label query over the set of namespaces that the term applies to. The term
     is applied to the union of the namespaces selected by this field and the
     ones listed in the namespaces field. null selector and null or empty
     namespaces list means "this pod's namespace". An empty selector ({})
     matches all namespaces. This field is beta-level and is only honored when
     PodAffinityNamespaceSelector feature is enabled.

   namespaces   <[]string>
     namespaces specifies a static list of namespace names that the term applies
     to. The term is applied to the union of the namespaces listed in this field
     and the ones selected by namespaceSelector. null or empty namespaces list
     and null namespaceSelector means "this pod's namespace"

   topologyKey  <string> -required-
     This pod should be co-located (affinity) or not co-located (anti-affinity)
     with the pods matching the labelSelector in the specified namespaces, where
     co-located is defined as running on a node whose value of the label with
     key topologyKey matches that of any node on which any of the selected pods
     is running. Empty topologyKey is not allowed.

[root@k8s-01 ~]#

Pod间的亲和关系定义在spec.affinity.podAffinity字段中,而反亲和关系定义在spec.affinity.podAntiAffinity字段中,它们各自的约束特性也存在强制与首选两种,它们都支持使用如下关键字段。

  • topologyKey :拓扑键,用来划分拓扑结构的节点标签,在指定的键上具有相同值的节点归属为同一拓扑;必选字段。
  • labelSelector :Pod标签选择器,用于指定该Pod将针对哪类现有Pod的位置来确定可放置的位置。
  • namespaces <[]string>:用于指示labelSelector字段的生效目标名称空间,默认为当前Pod所属的同一名称空间。

下面是测试的yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-affinity
  labels:
    app: pod-affinity
spec:
  replicas: 3
  selector:
    matchLabels:
      app: pod-affinity
  template:
    metadata:
      labels:
        app: pod-affinity
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: nginxweb
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:  # 硬策略
          - labelSelector:
              matchExpressions:
              - key: logging
                operator: In
                values:
                - true
            topologyKey: kubernetes.io/hostname

这里的 topologyKey为 kubernetes.io/hostname,即以每个node节点名为一个区域,然后在选择有pod为logging=true的pod所在的节点

image-20220627183733233

查看pods,发现所有的pods都在node3节点

[root@k8s-01 ~]# kubectl get pods -o wide |grep pod-affinity
pod-affinity-64bc56d789-2bczb             1/1     Running   0               5m25s   10.244.165.213   k8s-03   <none>           <none>
pod-affinity-64bc56d789-qgtkd             1/1     Running   0               5m25s   10.244.165.211   k8s-03   <none>           <none>
pod-affinity-64bc56d789-w95dv             1/1     Running   0               5m25s   10.244.165.208   k8s-03   <none>           <none>
[root@k8s-01 ~]#

如果此时,我们修改部分的yaml,并将副本改成10

- labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values: ["nginx-readiness","nginx-test"]
            topologyKey: disk

运行yaml,可以看见pod分散在node2和node4 2个节点上。

[root@k8s-01 ~]# kubectl get pods -o wide |grep pod-affinity
pod-affinity-94b66f75b-2cxns              1/1     Running   0               107s    10.244.7.86      k8s-04   <none>           <none>
pod-affinity-94b66f75b-6jfrv              1/1     Running   0               107s    10.244.7.87      k8s-04   <none>           <none>
pod-affinity-94b66f75b-7bftn              1/1     Running   0               107s    10.244.179.15    k8s-02   <none>           <none>
pod-affinity-94b66f75b-9tqgm              1/1     Running   0               107s    10.244.7.85      k8s-04   <none>           <none>
pod-affinity-94b66f75b-dnph9              1/1     Running   0               107s    10.244.7.88      k8s-04   <none>           <none>
pod-affinity-94b66f75b-fznzb              1/1     Running   0               107s    10.244.179.11    k8s-02   <none>           <none>
pod-affinity-94b66f75b-q6lv2              1/1     Running   0               107s    10.244.179.13    k8s-02   <none>           <none>
pod-affinity-94b66f75b-s7jj5              1/1     Running   0               107s    10.244.179.16    k8s-02   <none>           <none>
pod-affinity-94b66f75b-tn4s4              1/1     Running   0               107s    10.244.179.10    k8s-02   <none>           <none>
pod-affinity-94b66f75b-xpbnq              1/1     Running   0               107s    10.244.7.89      k8s-04   <none>           <none>
[root@k8s-01 ~]#

由此可见,Pod间的亲和调度能够将有密切关系或密集通信的应用约束在同一位置,通过降低通信延迟来降低性能损耗。需要注意的是,若节点上的标签在运行时发生更改导致不能再满足Pod上的亲和关系定义时,该Pod将继续在该节点上运行而不会被重新调度。另外,labelSelector属性仅匹配与被调度的Pod在同一名称空间中的Pod资源,不过也可以通过为其添加namespace字段以指定其他名称空间。

pod的亲和也支持柔性亲和,和节点亲和一致,这里不再给出具体的测试过程。

Pod 反亲和性

Pod 反亲和性(podAntiAffinity)则是反着来的,比如一个节点上运行了某个 Pod,那么我们的模板 Pod 则不希望被调度到这个节点上面去了。我们把上面的 podAffinity 直接改成podAntiAffinity。

反亲和可以实现DaemonSe+nodeSelector的效果,但是比它更加的灵活,前者如果node节点挂了,则pod就少一份,必须要等这个node起来,才会拉起pod,而反亲和的话,则可以在满足的topologyKey中,选择任意一节点,在起一个pod。因此,反亲和性调度一般用于分散同一类应用的Pod对象等,也包括把不同安全级别的Pod对象调度至不同的区域、机架或节点等。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-antiaffinity
  labels:
    app: pod-antiaffinity
spec:
  replicas: 3
  selector:
    matchLabels:
      app: pod-antiaffinity
  template:
    metadata:
      labels:
        app: pod-antiaffinity
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80
          name: nginxweb
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:  # 硬策略
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - pod-antiaffinity
            topologyKey: kubernetes.io/hostname

发现每一个pod都运行在不同的节点上

[root@k8s-01 ~]# kubectl get pods -o wide |grep pod-antiaffinity
pod-antiaffinity-86566d4dd5-bpspt         1/1     Running   0               23s     10.244.61.220    k8s-01   <none>           <none>
pod-antiaffinity-86566d4dd5-ggbgc         1/1     Running   0               23s     10.244.179.2     k8s-02   <none>           <none>
pod-antiaffinity-86566d4dd5-q5jl4         1/1     Running   0               23s     10.244.7.83      k8s-04   <none>           <none>
[root@k8s-01 ~]#

如果此时将副本改成5个,则有一个pod处于pending状态

[root@k8s-01 ~]# kubectl get pods -o wide |grep pod-antiaffinity
pod-antiaffinity-86566d4dd5-5h9h7         1/1     Running   0               59s     10.244.61.224    k8s-01   <none>           <none>
pod-antiaffinity-86566d4dd5-fslqk         1/1     Running   0               59s     10.244.179.14    k8s-02   <none>           <none>
pod-antiaffinity-86566d4dd5-n474x         1/1     Running   0               59s     10.244.165.222   k8s-03   <none>           <none>
pod-antiaffinity-86566d4dd5-pcbhs         1/1     Running   0               59s     10.244.7.91      k8s-04   <none>           <none>
pod-antiaffinity-86566d4dd5-vqvhv         0/1     Pending   0               59s     <none>           <none>   <none>           <none>
[root@k8s-01 ~]#

类似地,Pod反亲和调度也支持使用柔性约束机制,调度器会尽量不把位置相斥的Pod对象调度到同一位置,但约束关系无法得到满足时,也可以违反约束规则进行调度,而非把Pod置于Pending状态。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计springboot高校流浪动物领养网站

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

2022.11.28总结

今天写了条件查询 虽然思路上还说是比较顺&#xff0c;但是还是写了一晚上&#xff0c;因为老是在细节上出现bug&#xff0c;改了好久&#xff0c;踩了好几个坑。 首先大概是因为组件不是确定的&#xff0c;我把ref属性绑定在router-view上&#xff0c;导致我获取不到条件选择…

c++类型转换

目录 1.隐式类型转换和强制类型转换 2.隐式类型转换带来的危险 3.c提供的标准类型转换关键字 4.总结 1.隐式类型转换和强制类型转换 c语言的类型转换可以分为隐式类型转换和强制类型转换。 #include<iostream>using namespace std;int main() {double a 3.14;int …

医疗保健行业的福音是对话式AI吗?

导读对话式AI可以对医疗保健行业产生重大影响&#xff0c;且在许多领域已经产生了影响。如果使用得当&#xff0c;对话式AI可以提高操作效率和临床结果&#xff0c;并减轻医护人员的工作量。 对话式AI技术开启了数字患者护理的新时代。 患者可以随时访问其需要的数据&#xff…

Ubuntu 18.04 + CUDA 11.3.0 + CUDNN 8.2.1 + Anaconda + Pytorch 1.10

Xshell远程连接进行Ubuntu的Pytorch配置写在最前面参考Xshell常用命令Ubantu检查系统的各项配置查看ubuntu系统的版本信息和gcc版本查看Linux的内核版本和系统是多少位的验证机器是否具有n卡各种配置&#xff08;建议不要省略&#xff09;安装vim增加pip镜像源禁用nouveau开启S…

[附源码]计算机毕业设计springboot高校学生摄影作品展示平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

app与小程序的区别【开发小程序】

app与小程序&#xff0c;两者有什么区别呢&#xff1f;很多公司在开发app或是开发小程序上比较纠结&#xff0c;二选一不止究竟选哪个好&#xff0c;当然有财力的公司可能会两者都开发。那么下面说说app与小程序的区别是什么&#xff0c;好让大家更好地二选一。 app与小程序的…

单商户商城系统功能拆解39—分销应用—分销等级

单商户商城系统&#xff0c;也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法&#xff0c;例如拼团&#xff0c;秒杀&#xff0c;砍价&#xff0c;包邮…

2022小美赛数学建模ABCD赛题思路分析 - 认证杯

一、竞赛信息 考虑到美国大学生数学建模竞赛即将举行&#xff0c;近几年国内院校参加美赛的热情一直比较高涨&#xff0c;去年参赛规模已经突破了30000支队&#xff0c;但是由于美赛需要用英文书写论文&#xff0c;中文和英文的语法和思维差异比较明显&#xff0c;另外美赛参赛…

解决 Android WebView 多进程导致App崩溃

应用场景 应用内有两个位置用到WebView加载页面&#xff0c;具体处理逻辑不能通用。分别扩展了WebView了。应用内独立页面使用Fragment来展示,(采用单Activity架构&#xff09;。应用提供切换语言功能。 问题猜想 一、WebView内核bug 具体路径&#xff1a; 进入app–>设…

[附源码]SSM计算机毕业设计校园征兵及退役复原管理系统JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

ABAQUS学习之路

ABAQUS入门 首先看模块 1、部件——类似建模 2、属性——给零件添加材料属性 3、装配 4、分析步—— 5、相互作用——创建接触&#xff08;摩擦力&#xff09; 6、载荷——预定义场&#xff08;温度场、力场&#xff09;、边界条件 7、网络——划分网格 8、优化&#…

Libvirt Java API操作QEMU虚拟机(重启,强制关机,挂起,恢复,详情,关机,注销,快照备份等 )(CentOS)

需求背景 有个产品需求&#xff0c;需要在一台linux上装多个虚拟机&#xff0c;然后每个虚拟机单独部署一个产品&#xff0c;然后需要虚拟机的一个产品去控制宿主机中安装虚拟机的状态 注意&#xff1a; 如果虚拟机中装的产品去连宿主机的Libvirt服务&#xff0c;那么虚拟机一…

LeetCode530.二叉搜索树的最小绝对差 501二叉搜索树中的众数 236二叉树的最近公共祖先

文章目录530二叉搜索树的最小绝对差c代码实现python 代码实现501二叉搜索树中的众数c 代码实现python 代码实现236二叉树的最近公共祖先c代码实现python代码实现530二叉搜索树的最小绝对差 给你一个二叉搜索树的根节点 root &#xff0c;返回 树中任意两不同节点值之间的最小差…

运维行业数字化维修数据屏来袭

说起维修数字化&#xff0c;售后维保管理&#xff0c;大家必然想到青鸟云报修&#xff0c;今天我给大家呈现一下青鸟云报修数据大屏是怎么一回事。 这是青鸟云报修第三代数据大屏&#xff0c;在2代基础上增加了更多板块&#xff0c;更加专业和智能化&#xff0c;他主要应用于单…

Unity ab包加载文本 puerts 自定义loader

输出ab包 他会把你创建的ab包都打包 也就是在这里的创建的 string assetBundleDirectory Path.Combine(Application.streamingAssetsPath, "OutAssetBundles"); if (!Directory.Exists(assetBundleDirectory)) {Directory.CreateDirectory(assetBundleDirectory);…

2022/11/28-29总结

刷题 统计2021年10月每个退货率不大于0.5的商品各项指标_牛客题霸_牛客网 思路 主要就是sum函数、round函数、date_format函数 代码实现 select product_id, round(sum(if_click)/count(*),3) ctr, round(sum(if_cart)/sum(if_click),3) cart_rate, round(sum(if_payment)…

大二学生JavaScript实训大作业——动漫秦时明月7页 期末网页制作 HTML+CSS+JavaScript 网页设计实例 企业网站制作

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 ⚽精彩专栏推荐&#x1…

【JavaScript预解析】

JavaScript预解析1 本节目标2 预解析3 变量预解析和函数预解析4 预解析案例1 本节目标 知道解析器运行JS分为哪两步说出变量提升的步骤和运行过程说出函数提升的步骤和运行过程 2 预解析 JavaScript代码是由浏览器中的JavaScript解析器来执行的。JavaScript解析器在运行Java…

技术解读倚天 ECS 实例 — Arm 芯片的 Python-AI 算力优化

深度学习技术在图像识别、搜索推荐等领域得到了广泛应用。近年来各大 CPU 厂商也逐渐把 AI 算力纳入了重点发展方向&#xff0c;通过《Arm 芯片 Python-AI 算力优化》我们将看到龙蜥社区 Arm 架构 SIG&#xff08;Special Interest Group&#xff09; 利用最新的 Arm 指令集优化…