k8s亲和性和反亲和性

news2024/11/26 10:30:33

1.前言

k8s的亲和性和反亲和性都是通过标签来影响pod的调度,在此基础上亲和性又分为硬亲和性和软亲和性,required为硬亲和性即标签内容必须要符合才能调度,preferred为软亲和性即标签内容不一定要符合也能调度,除此之外还有node亲和性和pod亲和性,接下来都使用一下这些亲和性的功能

2.node亲和性

2.1node软亲和性

先编辑一个yaml文件

vi deployment-nginx.yaml 

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.21
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
      affinity:       #亲和性配置项
        nodeAffinity:       #node亲和性配置项
          preferredDuringSchedulingIgnoredDuringExecution:  #软亲和性配置项
            - weight: 70         #配置权重
              preference:
                matchExpressions:
                - key: key1      #配置标签key的值
                  operator: In    #配置操作符
                  values:        #配置标签values的值
                    - value1
            - weight: 30         #配置权重
              preference:
                matchExpressions:
                - key: key2
                  operator: In
                  values:
                    - value2

配置一下node节点的标签,给node01节点打上权重高的标签,node02节点打上权重低的标签

kubectl label node k8s-node01 key1=value1

kubectl label node k8s-node02 key2=value2

执行yaml文件

kubectl create -f deployment-nginx.yaml

查看一下pod再node上的分配情况

kubectl get pod -o wide -n default -l app=nginx

 可以看到node01上分配的pod比node02节点多,这就是权重导致的,软亲和性是不强制要求调度到特定节点的,可以把node节点的label标签删掉,再重新创建delpoyment,pod依然能正常调度,我这里只贴一下效果,就不展示过程了

2.2node硬亲和性

 编辑一下yaml文件

vi deployment-nginx.yaml 

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.21
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
      affinity:  
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:   #硬亲和性配置项
            nodeSelectorTerms:   #通过 nodeSelectorTerms,可以指定多个节点标签的匹配规则,从而更加灵活地控制 Pod 的调度,再有多个nodeSelectorTerms时,他们的关系为或,即node节点满足任意一个nodeSelectorTerms中的规则时,就可以把pod调度到该节点上
            - matchExpressions:    #通过 matchExpressions,可以精确地指定一个节点标签的匹配规则,从而更加精细地控制 Pod 的调度,在使用多个matchExpressions的情况下,他们的关系为且,即node节点需要满足所有matchExpressions项的规则才可以把pod调度到该节点上
              - key: key1
                operator: In
                values:   #这里配置了两个values值,因为控制项使用的是In,只要node满足其中一个即可调度
                - value1
                - value2

我现在的node节点上是没有标签的,先来测试一下pod的调度情况

可以看到因为设置了硬亲和性的原因pod调度不到任何一个node节点上,状态为pending,接下来我们给node01打上符合yaml文件硬亲和性的标签看看效果

kubectl label node k8s-node01 key1=value1 

 可以看到给node01节点打上标签后,所有pod都调度到了node01节点上了

3.pod亲和性和反亲和性

 3.1pod软亲和性

 编辑一下yaml文件

vi deployment-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.21
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
      affinity:
        podAffinity:   #pod亲和性配置项
          preferredDuringSchedulingIgnoredDuringExecution:  #软亲和性配置项
          - weight: 70    #配置权重
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: key1
                  operator: In
                  values:
                  - value1
              topologyKey: zone   #在 PodAffinity 中,topologyKey 配置项用于指定 Pod 应该调度到哪些节点上。例如,可以将 topologyKey 设置为 kubernetes.io/hostname,这样 Pod 将调度到与它在同一主机上的节点上
          - weight: 30
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: key2
                  operator: In
                  values:
                  - value2
              topologyKey: zone

执行以下yaml文件看一下效果

kubectl create -f  deployment-nginx.yaml

 pod软亲和性表示Pod将尽可能被调度到与它们亲和的pod所在的节点上,但如果没有符合条件的pod,Pod仍然可以被调度到其他节点上

 3.2pod硬亲和性

编辑一下yaml文件

vi deployment-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.21
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution: #硬亲和性配置项
          - labelSelector:
              matchExpressions:
              - key: key1
                operator: In
                values:
                - value1
            topologyKey: kubernetes.io/hostname

执行以下yaml文件看一下效果

kubectl create -f  deployment-nginx.yaml

现在集群中是没有pod的,没有可以满足pod硬性亲和条件的pod,所以pod无法调度,现在创建两个不符合以上条件标签的pod看看效果

vi web1.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web1
spec:
  replicas: 2
  selector:
    matchLabels:
      key3: value3
  template:
    metadata:
      labels:
        key3: value3  #这里pod使用的标签和上面亲和性的标签不一致
    spec:
      containers:
      - image: nginx:1.19
        name: nginx1

kubectl create -f web1.yaml

kubectl get pod -o wide

可以看到依旧没有满足硬亲和性调度的条件,pod还是pending状态,接下来创建一个符合以上条件标签的pod看看效果

vi web.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      key1: value1
  template:
    metadata:
      labels:
        key1: value1   #此处使用与硬亲和性条件一样的label
    spec:
      containers:
      - image: nginx:1.19
        name: nginx

kubectl create -f web.yaml

kubectl get pod -o wide

可以看到有满足硬亲和性条件标签的pod后,所有pod都调度到了与该pod相同的节点上

pod硬亲和性表示Pod必须被调度到与它们亲和的pod的节点上,否则它们将无法被调度

3.3pod硬反亲和性

编辑一下yaml文件

vi deployment-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.21
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
      affinity:
        podAntiAffinity:  #反亲和性配置项
          requiredDuringSchedulingIgnoredDuringExecution:   #硬反亲和性配置项
          - labelSelector:
              matchExpressions:
              - key: key1
                operator: In
                values:
                - value1
            topologyKey: zone   #避免pod调度到故障节点上

上一个试验创建的web和web1的pod还没删除,使用他们来验证一下硬反亲和性,web使用的标签是符合硬反亲和性的条件,执行一下这个yaml看看效果

kubectl create -f deployment-nginx.yaml

kubectl get pod -o wide

可以看到因为硬反亲和性的原因,所有创建的nginx pod都和web pod不在同一个节点上

3.4pod软反亲和性

编辑一下yaml文件

vi deployment-nginx.yaml

apiVersion: apps/v1
kind: Deployment
metadata: 
  labels:
    app: nginx
  name: nginx
  namespace: default
spec:
  replicas: 5
  progressDeadlineSeconds: 600
  minReadySeconds: 10
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 0
    type: RollingUpdate
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec: 
      containers:
      - name: nginx
        image: nginx:1.21
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
      affinity:
        podAntiAffinity:  #反亲和性配置项
          preferredDuringSchedulingIgnoredDuringExecution:   #软反亲和性配置项
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: key1
                  operator: In
                  values:
                  - value1
              topologyKey: zone

 依然使用带有符合反亲和性条件的web pod,执行一下yaml看看效果

kubectl create -f deployment-nginx.yaml

kubectl get pod -o wide

 可以看到因为软反亲和性的原因,有一些nginx pod调度到了和web pod相同的节点上

亲和性和反亲和性的使用展示就这么多,接来下所以下上面使用到的配置项的补充

operator:用于指定匹配规则的操作符,operator参数可以设置为In、NotIn、Exists、DoesNotExist、Gt、Lt、Gte、Lte、DoubleEqual、NotEqual等值中的一种

In:表示标签的值必须包含在给定的值列表中

NotIn:表示标签的值不能包含在给定的值列表中

Exists:表示标签必须存在

DoesNotExist:表示标签必须不存在

Gt:表示标签的值必须大于给定的值

Lt:表示标签的值必须小于给定的值

Gte:表示标签的值必须大于或等于给定的值

Lte:表示标签的值必须小于或等于给定的值

DoubleEqual:表示标签的值必须等于给定的值

NotEqual:表示标签的值不能等于给定的值

在软亲和性和软反亲和性的配置中,topologyKey项是必须要配置的,不配置的话执行yaml文件会报错 

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

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

相关文章

Unsupported major.minor version 51.0解决办法

先看看我的报错截图 [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------ [INFO] Total time: 08:51 min [INFO] Finished at: 2023-0…

[2.0快速体验]Apache Doris 2.0 日志分析快速体验

1. 概述 应用程序、服务器、云基础设施、IoT 和移动设备、DevOps、微服务架构—最重要的业务和 IT 发展趋势帮助我们以前所未有的方式优化运维和客户体验。但这些趋势也导致由机器生成的数据出现爆炸式成长,其中包括日志和指标等,例如,用户交…

Qcon 广州主题演讲:融云实时社区的海量消息分发实践

移步公众号文章 预约纸质版《作战地图》 5 月 26 日-27 日,QCon 全球软件开发大会落地广州。关注【融云全球互联网通信云】了解更多 融云 IM 服务架构师罗伟受邀分享“实时社区的海量消息分发实践”,从实践中来的前沿技术分享,收获现场开发者…

Nautilus Chain上首个DEX PoseiSwap即将开启IDO,潜力几何?

据悉,Nautilus Chain 上的首个 DEX PoseiSwap 即将开启 IDO ,根据官方的最新公告显示,PoseiSwap 即将于 6 月 13 日至 6 月 14 日期间,在 Bounce 平台开启其治理通证 $POSE 的 IDO(Initial DEX Offering)&a…

openEuler Linux 部署 FineReport

openEuler Linux 部署 FineReport 部署环境 环境版本openEuler Linux22.03MySQL8.0.33FineReport11.0 环境准备 升级系统内核和软件 yum -y updatereboot安装常用工具软件 yum -y install vim tar net-tools 安装MySQL8 将 MySQL Yum 存储库添加到系统的存储库列表中 s…

【JavaEE】表白墙再升级(MySQL实现持久化)

表白墙再升级(MySQL实现持久化) 文章目录 【JavaEE】表白墙再升级(MySQL实现持久化)1. 后端引入JDBC的依赖2. 建库建表3. 编写数据库代码(JDBC)3.1 doGet方法改写3.1.1 构建本地数据源3.1.2 用本地数据源构…

移动端的轮播图

效果 技术选取 前端框架用的是vue3,使用的组件库为element-plus以及vant4 引入element-plus和vant4 安装element-plus cnpm install element-plus --save 安装按需导入 cnpm install -D unplugin-vue-components unplugin-auto-import 安装Vant cnpm i vant 按…

Fiddler抓包工具之fiddler的composer可以简单发送http协议的请求

一,composer的详解 右侧Composer区域,是测试接口的界面: 相关说明: 1.请求方式:点开可以勾选请求协议是get、post等 2.url地址栏:输入请求的url地址 3.请求头:第三块区域可以输入请求头信息…

图的简单理解

文章目录 1、图的基本概念2、图的存储结构2.1 邻接矩阵2.2 邻接表 3、图的遍历3.1 广度优先遍历3.2 深度优先遍历 4、最小生成树4.1 Kruskal算法4.2 Prim算法 5、最短路径5.1 单源最短路径–Dijkstra算法5.2 单源最短路径–Bellman-Ford算法5.3 多源最短路径 1、图的基本概念 …

路径规划算法:基于差分进化优化的路径规划算法- 附代码

路径规划算法:基于差分进化优化的路径规划算法- 附代码 文章目录 路径规划算法:基于差分进化优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

nginx的rewrite功能

常用的Nginx 正则表达式 ^匹配输入字符串的起始位置$匹配输入字符串的结束位置*匹配前面的字符零次或多次。如“ol*”能匹配“o”及“ol”、“oll”匹配前面的字符一次或多次。如“ol”能匹配“ol”及“oll”、“olll”,但不能匹配“o”?匹配前面的字符零次或一次…

【动态规划专栏】--简单-- 动态规划经典题型

目录 动态规划 动态规划思维(基础) 状态表示(最重要) 状态转移方程(最难) 初始化(细节) 填表顺序(细节) 返回值(结果) 解码方…

【Python FTP/SFTP】零基础也能轻松掌握的学习路线与参考资料

一、Python FTP/SFTP的学习路线 Python FTP/SFTP是Python语言的两种常用的文件传输协议。在学习Python网络编程过程中,学习FTP/SFTP是非常重要的一步。下面给出Python FTP/SFTP的学习路线: 了解FTP/SFTP协议 在开始学习Python FTP/SFTP之前&#xff0…

LSB信息隐藏——Python实现(完整解析版)

系列文章目录 仿射密码实验-Python实现 仿射密码实验——Python实现(完整解析版) DES密码实验-C语言实现 MD5密码实验——Python实现(完整解析版) 文章目录 系列文章目录前言实验方法实验环境实验内容实验步骤1.LSB原理2.确定设计模块Lsb——embdedLsb——extract 实验结果实验…

performance_schema 初相识 配置详解 应用

千金良方:MySQL性能优化金字塔法则 第4章 performance_schema初相识 第5章 performance_schema配置详解 第6章 performance_schema应用示例荟萃 简介 1、实时监控Server性能监控和诊断的工具 2、它提供了丰富的性能指标和事件,可以帮助你深入了解 MyS…

2023年6月PMP®项目管理认证招生简章

PMP认证是Project Management Institute在全球范围内推出的针对评价个人项目管理知识能力的资格认证体系。国内众多企业已把PMP认证定为项目经理人必须取得的重要资质。 【PMP认证收益】 1、能力的提升(领导力,执行力,创新能力&#xff0c…

python 编译安装指定版本 for linux

python环境是linux中必备的,部分发行版会自带python,有时候需要安装手动安装 注意:如果需要多个版本并存,建议使用conda环境,如果自己配置多版本,需要用多个软链接 conda环境,可以参考&#x…

【CSS Zoro 01】说在前面 CSS概念 CSS语法 CSS选择器 元素 id 类 组合 通用 分组 属性 后代 子元素 相邻兄弟

CSS 说在前面概念语法 syntaxCSS选择器 说在前面 最近挺喜欢看One Piece的,并且发现前端三剑客如果对应上Sanji,Zoro和Luffy的话会很有趣,所以说非常想在博客里面对应上小彩蛋,即使会损失一些SEO,但是这样做对我来说很…

算法修炼之筑基篇——筑基一层(解决01背包问题)

✨博主:命运之光 ✨专栏:算法修炼之练气篇​​​​​ ✨博主的其他文章:点击进入博主的主页 前言:学习了算法修炼之练气篇想必各位蒟蒻们的基础已经非常的扎实了,下来我们进阶到算法修炼之筑基篇的学习。筑基期和练气期…

raise AssertionError(“Torch not compiled with CUDA enabled“)

1、运行代码可知,当前cuda不可用。 import torch print(torch.cuda.is_available()) # False 2、打开power shell or cmd,输入nvidia-smi命令,检查当前英伟达显卡信息。 可知当前驱动版本512.78,支持的cuda最高版本为11.6&…