K8S之运用亲和性设置Pod的调度约束

news2024/11/13 23:32:20

亲和性

  • Node节点亲和性
    • 硬亲和实践
    • 软亲和性实践
  • Pod节点亲和性和反亲和性
    • pod亲和性
      • 硬亲和实践
    • pod反亲和性

Pod 的yaml文件里 spec 字段中包含一个 affinity 字段,使用一组亲和性调度规则,指定pod的调度约束。

kubectl explain pods.spec.affinity 

在这里插入图片描述

配置说明

  • nodeAffinity: node节点亲和性,pod倾向于哪个node
  • podAffinity: pod亲和性,pod倾向于哪个pod
  • podAntiAffinity: pod的反亲和性,pod排斥于哪个pod

Node节点亲和性

Node节点亲和性 是针对 pod和node 的关系,Pod调度到node节点的时候匹配的条件

node节点亲和性调度字段:nodeAffinity

看nodeAffinity下的配置字段

kubectl explain  pods.spec.affinity.nodeAffinity

在这里插入图片描述

  • preferredDuringSchedulingIgnoredDuringExecution 表示有节点尽量满足这个位置定义的亲和性,这不是一个必须的条件,软亲和性
  • requiredDuringSchedulingIgnoredDuringExecution 表示必须有节点满足这个位置定义的亲和性,这是个硬性条件,硬亲和性

硬亲和实践

使用requiredDuringSchedulingIgnoredDuringExecution硬亲和性

Node节点硬亲和性选择匹配方式有2种:

  • matchFields: 匹配字段的
  • matchExpressions:匹配表达式的 (用的多)

对matchExpressions做进一步解读

matchExpressions——匹配表达式的写法:

kubectl explain pods.spec.affinity.nodeAffinity.requiredDuringSchedulingIgnoredDuringExecution.nodeSelectorTerms.matchExpressions

在这里插入图片描述

字段配置:

  • key:匹配节点标签的KEY(必填)
  • operator:表示键与一组值的关系(必填),可选的枚举值如下:
    • In (包含)
    • NotIn(不包含)
    • Exists (存在)
    • DoesNotExist (不存在)
    • Gt (大于)
    • Lt (小于)
  • values:给定值

示例 :把pod调度到集群中 拥有zone标签 并且值是foo或者bar的node节点上

创建pod资源文件

vim pod-nodeaffinity-demo.yaml
apiVersion: v1
kind: Pod
metadata:
  name:  pod-node-affinity-demo
  namespace: default
spec:
  affinity:     # 设置亲和性调度规则
    nodeAffinity:  # 设置node亲和性
     requiredDuringSchedulingIgnoredDuringExecution: # 使用硬亲和性
       nodeSelectorTerms: # 配置节点选择器规则
       - matchExpressions: # 匹配表达式的
         - key: zone  # 节点标签的key
           operator: In # 使用表达式为包含
           values:  # 包含的值有(foo或者bar)
           - foo
           - bar
  containers:
  - name: myapp
    image: docker.io/ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent

创建资源

kubectl apply -f pod-nodeaffinity-demo.yaml

查看pod

kubectl get pods -o wide

在这里插入图片描述

status的状态是pending,上面说明没有完成调度,因为没有一个节点拥有zone的标签
值是foo或者bar,而且使用的是硬亲和性,必须满足条件才能完成调度

给k8s-node1节点打上标签zone=foo,再查看

kubectl label nodes k8s-node1 zone=foo
kubectl get pods -o wide

在这里插入图片描述

pod调度到了k8s-node1节点上

软亲和性实践

使用preferredDuringSchedulingIgnoredDuringExecution软亲和性

示例

创建pod资源文件

vim pod-nodeaffinity-demo-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-node-affinity-demo-2
  namespace: default
spec:
  containers:
  - name: myapp
    image: docker.io/ikubernetes/myapp:v1
    imagePullPolicy: IfNotPresent
  affinity:         # 设置亲和性调度规则
    nodeAffinity:   # 设置node亲和性
      preferredDuringSchedulingIgnoredDuringExecution: # 使用软亲和性
      - preference:
          matchExpressions: # 匹配表达式的
          - key: zone1   # 节点标签的key
            operator: In # # 使用表达式为包含
            values: # 包含的值有(foo1或者bar1)
            - foo1
            - bar1
        weight: 10 # 匹配度权重
      - preference:
          matchExpressions:
          - key: zone2
            operator: In
            values:
            - foo2
            - bar2
        weight: 20  #  weight是相对权重,权重越高,pod调度的几率越大

创建资源

kubectl apply -f pod-nodeaffinity-demo-2.yaml

查看pod

kubectl get pods -o wide |grep pod-node-affinity-demo-2

在这里插入图片描述

上面说明软亲和性是可以运行这个pod的,尽管没有运行这个pod的节点定义的zone1标签

测试weight权重

先删除pod-node-affinity-demo-2
(ps. 执行强制删除的命令,加上“–force --grace-period=0”)

kubectl delete pod pod-node-affinity-demo-2 --force --grace-period=0

给k8s-node1和k8s-node2都打上标签

kubectl label nodes k8s-node1 zone1=foo1

kubectl label nodes k8s-node2 zone2=foo2

再创建资源

kubectl apply -f pod-nodeaffinity-demo-2.yaml

查看pod

kubectl get pods -o wide

在这里插入图片描述

pod在定义node节点亲和性的时候,k8s-node1和k8s-node2都满足调度条件,但是k8s-node2具有的标签是zone2=foo2,pod在匹配zone2=foo2的权重高,那么pod就会优先调度到k8s-node2上

Pod节点亲和性和反亲和性

Pod节点亲和性 是针对 pod和pod 的关系

在这里插入图片描述

有两种表示形式

  • podAffinity:pod和pod更倾向在一起,把相近的pod结合到相近的位置。
    这样的话pod和pod之间更好通信。比方希望把nginx和tomcat都部署同一个地方的node节点上,可以提高通信效率;

  • podAntiAffinity:pod和pod不倾向在一起。如果部署两套程序,那么这两套程序更倾向于反亲和性,这样相互之间不会有影响。

运行方式

第一个pod随机选则一个节点,例如:节点A。做为 评判后续的pod 能否到达节点A上。到达 就称为pod亲和性,反之是反亲和性。

以节点名称为标准,这个节点名称相同的表示是同一个位置,节点名称不相同的表示不是一个位置。

pod亲和性

pod亲和性调度字段:podAffinity

看podAffinity下的配置字段

kubectl explain pods.spec.affinity.podAffinity

在这里插入图片描述

  • requiredDuringSchedulingIgnoredDuringExecution 硬亲和性
  • preferredDuringSchedulingIgnoredDuringExecution 软亲和性

硬亲和实践

使用requiredDuringSchedulingIgnoredDuringExecution硬亲和性

kubectl explain pods.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution

在这里插入图片描述

解释说明

  • topologyKey:位置拓扑的键,节点的标签(必填)
    怎么判断是不是同一个位置,例如:
    rack=rack1 使用rack的键是同一个位置
    row=row1 使用row的键是同一个位置
  • labelSelector:判断pod跟别的pod亲和,通过labelSelector选则一组能作为亲和对象的pod资源
  • namespace:指定匹配资源的命名空间,如果不指定namespaces,那么就是当前创建pod的名称空间
  • namespaceSelector: :指定匹配资源的命名空间集合,空选择器({})匹配所有命名空间。

对labelSelector进一步解析:
labelSelector——对pod资源的标签查询

kubectl explain pods.spec.affinity.podAffinity.requiredDuringSchedulingIgnoredDuringExecution.labelSelector 

在这里插入图片描述

字段配置:

  • matchExpressions:匹配表达式
  • matchLabels:匹配标签

示例1: 定义两个pod,第一个pod做为基准,第二个pod跟着它走

创建第一个pod资源文件

vim pod-required-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  labels:
    app: myapp
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      imagePullPolicy: IfNotPresent

创建第一个pod资源

kubectl apply -f pod-required-affinity-demo-1.yaml

创建第二个pod资源文件,让第二个pod和第一个pod做亲和性

vim pod-required-affinity-demo-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  labels:
    app: backend
spec:
    containers:
    - name: busybox
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: ["sh","-c","sleep 3600"]
    affinity:
      podAffinity:  #使用pod亲和性
         requiredDuringSchedulingIgnoredDuringExecution:  #使用硬亲和性
         - topologyKey: kubernetes.io/hostname # 设置位置拓扑的键
           labelSelector:  # 设置对pod资源的标签查询
              matchExpressions: # 用匹配表达式:找pod标签中key是app 值包含myapp的
              - {key: app, operator: In, values: ["myapp"]}
           

上面表示新创建的pod必须与拥有 “app=myapp” 标签的pod在一个节点上

创建第二个pod资源

kubectl apply -f pod-required-affinity-demo-2.yaml

查看pod

kubectl get pods -o wide

在这里插入图片描述

上面说明第一个pod调度到哪,第二个pod也调度到哪,这就是pod节点亲和性

示例2 :接着上面的实验,调整一下pod2 ,让 labelSelector满足 pod1的标签,但是topologyKey不满足pod1所在的node的特点

调整第二个pod资源文件

vim pod-required-affinity-demo-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  labels:
    app: backend
spec:
    containers:
    - name: busybox
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: ["sh","-c","sleep 3600"]
    affinity:
      podAffinity:  #使用pod亲和性
         requiredDuringSchedulingIgnoredDuringExecution:  #使用硬亲和性
         - topologyKey: zone2 # 设置node1节点没有的标签key
           labelSelector:  
              matchExpressions: 
              - {key: app, operator: In, values: ["myapp"]}
           

重建第二个pod资源

kubectl delete -f pod-required-affinity-demo-2.yaml

kubectl apply -f pod-required-affinity-demo-2.yaml

查看pod

kubectl get pods -o wide

在这里插入图片描述

上面说明 labelSelector和topologyKey必须同时满足才能找到要调度的节点

pod反亲和性

一切配置都是反着来。

例如 硬亲和性

解释说明

  • topologyKey:不去有位置拓扑的键的节点上(必填)
  • labelSelector:判断pod跟别的pod反亲和

示例1: 定义两个pod,第一个pod做为基准,第二个pod跟它调度节点相反

创建第一个pod资源文件

vim pod-required-anti-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  labels:
    app1: myapp1
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      imagePullPolicy: IfNotPresent

创建第一个pod资源

kubectl apply -f  pod-required-anti-affinity-demo-1.yaml

创建第二个pod资源文件

vim pod-required-anti-affinity-demo-2.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  labels:
    app: backend
spec:
    containers:
    - name: busybox
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: ["sh","-c","sleep 3600"]
    affinity:
      podAntiAffinity:  #使用pod反亲和性
         requiredDuringSchedulingIgnoredDuringExecution:  #使用硬亲和性
         - topologyKey: kubernetes.io/hostname 
           labelSelector:   # 设置对pod资源的标签查询
              matchExpressions:  # 用匹配表达式:pod标签中key是app1 值包含myapp1的
              - {key: app1, operator: In, values: ["myapp1"]}         

创建第二个pod资源

kubectl apply -f pod-required-anti-affinity-demo-2.yaml

查看pod

kubectl get pods -o wide

在这里插入图片描述

显示两个pod不在一个node节点上,这就是pod节点反亲和性

示例2: 看 topologykey + labelSelector同时满足时,第二个pod的情况

给节点都打上“zone=foo” 标签

kubectl label nodes  k8s-node2  zone=foo

kubectl label nodes  k8s-node1  zone=foo

创建第一个pod资源文件

vim pod-first-required-anti-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-first
  labels:
    app3: myapp3
spec:
    containers:
    - name: myapp
      image: ikubernetes/myapp:v1
      imagePullPolicy: IfNotPresent

创建第一个pod资源

kubectl apply -f  pod-first-required-anti-affinity-demo-1.yaml

创建第二个pod资源文件

vim pod-second-required-anti-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:
  name: pod-second
  labels:
    app: backend
    tier: db
spec:
    containers:
    - name: busybox
      image: busybox:latest
      imagePullPolicy: IfNotPresent
      command: ["sh","-c","sleep 3600"]
    affinity:
      podAntiAffinity:
         requiredDuringSchedulingIgnoredDuringExecution:
         - labelSelector:
              matchExpressions:
              - {key: app3 ,operator: In, values: ["myapp3"]}
           topologyKey:  zone

创建第二个pod资源

kubectl apply -f pod-second-required-anti-affinity-demo-1.yaml

查看pod

kubectl get pods -o wide

在这里插入图片描述

第二个pod是pending,因为两个节点是同一个位置,现在没有不是同一个位置的了,而且要求反亲和性,所以就会处于pending状态,如果在反亲和性这个位置把硬反亲和改成软反亲和,那么也会运行。

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

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

相关文章

对称二叉树

给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:false思路:1.确定递归函数的参数…

Token、Tokenization 和张量之间的关系

输入经过Tokenization、Embedding和Positional Encoding后,最终构建为张量,给后续的计算和处理带来很多优势。 1. tokenization和张量 在自然语言处理(NLP)领域中,tokenization 是文本预处理的重要步骤之一&#xff0…

91.网游逆向分析与插件开发-游戏窗口化助手-游戏窗口化助手的UI设计

内容参考于:易道云信息技术研究院VIP课 上一个内容:项目需求与需求拆解-CSDN博客 码云地址(游戏窗口化助手 分支):https://gitee.com/dye_your_fingers/sro_-ex.git 码云版本号:e512d44da1b7e6a8726b1be0…

Rust 格式化输出

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、format! 宏二、fmt::Debug三、fmt::Display四、? 操作符 循环打印 前言 Rust学习系列-本文根据教程学习Rust的格式化输出,包括fmt::Debug&…

【C++】结构体变量的赋值细节

C中 结构体变量的赋值与数组在定义时的初始化(赋值)十分相似: ①它们定义在全局区时都会自动初始化为0 ②都是使用大括号的方式赋值 ③大括号中的值都是从前往后一一对应的进行赋值,如果大括号中的值的数量不够的话,后面那些没有被手动赋值的…

ubuntu20.04安装最新版nginx

前言 记录下ubuntu服务器安装nginx 步骤 安装最新版本的 Nginx 可以通过添加 Nginx 官方的软件仓库并更新软件包信息。以下是在 Ubuntu 20.04 上安装最新版本 Nginx 的步骤: 添加 Nginx 软件仓库: 打开终端并执行以下命令: sudo sh -c echo…

无人机动力系统高倍率锂聚合物电池介绍,无人机锂电池使用与保养,无人机飞行控制动力源详解

无人机电池使用及保养 电池是无人机飞行的动力来源,也是一个消耗品,对电池充分了解,采取正确的使用方法,妥善进行维护保养将有助于提高飞行的安全性、延长电池的使用寿命。以下将详细对电池的使用和管理进行讲解。 高倍率锂聚合物电池的含义…

HiveSQL——条件判断语句嵌套windows子句的应用

注:参考文章: SQL条件判断语句嵌套window子句的应用【易错点】--HiveSql面试题25_sql剁成嵌套判断-CSDN博客文章浏览阅读920次,点赞4次,收藏4次。0 需求分析需求:表如下user_idgood_namegoods_typerk1hadoop1011hive1…

Rebuild企业管理系统 SSRF漏洞复现(CVE-2024-1021)

0x01 产品简介 Rebuild是高度可配置化的企业管理系统!企业内部可免费使用!低代码/零代码快速搭建企业中台、CRM客户关系管理、WMS库存管理、TMS运输管理、SCM供应链管理,外贸管理,甚至是 ERP 企业资源计划! 0x02 漏洞概述 Rebuild 3.5.5 版本存在安全漏洞,该漏洞源于组…

【Linux】进程学习(一):基本认识

目录 1.基本概念2.初步理解3.描述进程-PCB3.1task_struct-PCB的一种3.2task_ struct内容分类 4.组织进程5.查看进程5.1通过ps指令查看5.2通过系统目录查看 6.通过系统调用获取进程的PID和PPID7.通过系统调用创建进程-fork初识 1.基本概念 课本概念:程序的一个执行实…

ONLYOFFICE文档8.0新功能浅探

ONLYOFFICE文档8.0新功能浅探 上个月末这个月初的几天,ONLYOFFICE版本更新了!更新到了一个比较整的大的版本号,8.0版本,看来这个生产力工具的升级速度基本上能保持每年两个版本号的速度,还是很快的,一般来…

微软.NET6开发的C#特性——委托和事件

我是荔园微风,作为一名在IT界整整25年的老兵,看到不少初学者在学习编程语言的过程中如此的痛苦,我决定做点什么,下面我就重点讲讲微软.NET6开发人员需要知道的C#特性,然后比较其他各种语言进行认识。 C#经历了多年发展…

Ajax+JSON学习一

AjaxJSON学习一 文章目录 前言一、Ajax简介1.1. Ajax基础1.2. 同源策略 二、Ajax的核心技术2.1. XMLHttpRequest 类2.2. open指定请求2.3. setRequestHeader 设置请求头2.4. send发送请求主体2.5. Ajax取得响应 总结 前言 一、Ajax简介 1.1. Ajax基础 Ajax 的全称是 Asynchron…

网络连接受限或无连接怎么办?这里提供几个修复办法

本文介绍了如何完成疑难解答步骤,以解决在Windows 10、Windows 8和Windows 7中尝试在Windows计算机上设置或建立网络连接时可能遇到的连接问题错误。 可能错误提示 连接受限或无连接:连接具有有限的连接或无连接。你可能无法访问Internet或某些网络资源。 连接受限。 排除和解…

神经网络基本原理

神经网络是一门重要的机器学习技术。它是目前最为火热的研究方向–深度学习的基础。 神经网络是一种模拟人脑的神经网络以期能够实现类人工智能的机器学习技术。人脑中的神经网络是一个非常复杂的组织。成人的大脑中估计有1000亿个神经元之多。 1 介绍 下面是一个包含三个层…

百度Apollo荣获量子位-智能车参考“2023智能车年度评选”两大奖项

2023,是谁在引领智能车浪潮? 量子位-智能车参考发布“2023智能车年度评选”结果。经过业内专业评审和垂直社群万人票选后,百度Apollo荣获「年度十大智能车技术产品/方案」「年度十大智能车领军人物」两项大奖。 年度十大智能车技术产品\方…

二叉树中的最大路径和

124. 二叉树中的最大路径和 - 力扣(LeetCode) 思路 路径每到一个节点,有 3 种选择:1. 停在当前节点。2. 走到左子节点。3. 走到右子节点。走到子节点,又面临这 3 种选择,递归适合处理这种规模不同的同一问…

Redis 单线程

文章目录 Redis单线程架构Redis 单线程访问速度IO多路复用原理 Redis单线程架构 Redis的单线程架构的效果为:Redis的单线程是对于服务端而言的,Redis允许多个Redis用户端同时在线操作,但同时只有一个用户端在和服务端交互。多个用户同时发送…

生成验证码-超简单

引言 在Web开发中,验证码是一种常见的防止恶意破解、自动化提交的有效手段。在Java项目中,我们可以使用Hutool工具库快速实现验证码功能。Hutool是一个Java工具包,它以简洁易用著称,其中包含了验证码模块,可以让我们轻…

158基于matlab的用于分析弧齿锥齿轮啮合轨迹的程序

基于matlab的用于分析弧齿锥齿轮啮合轨迹的程序,输出齿轮啮合轨迹及传递误差。程序已调通,可直接运行。 158 matlab 弧齿锥齿轮啮合轨迹 传递误差 (xiaohongshu.com)