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

亲和性

  • 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-demonamespace: default
spec:affinity:     # 设置亲和性调度规则nodeAffinity:  # 设置node亲和性requiredDuringSchedulingIgnoredDuringExecution: # 使用硬亲和性nodeSelectorTerms: # 配置节点选择器规则- matchExpressions: # 匹配表达式的- key: zone  # 节点标签的keyoperator: In # 使用表达式为包含values:  # 包含的值有(foo或者bar)- foo- barcontainers:- name: myappimage: docker.io/ikubernetes/myapp:v1imagePullPolicy: 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-2namespace: default
spec:containers:- name: myappimage: docker.io/ikubernetes/myapp:v1imagePullPolicy: IfNotPresentaffinity:         # 设置亲和性调度规则nodeAffinity:   # 设置node亲和性preferredDuringSchedulingIgnoredDuringExecution: # 使用软亲和性- preference:matchExpressions: # 匹配表达式的- key: zone1   # 节点标签的keyoperator: In # # 使用表达式为包含values: # 包含的值有(foo1或者bar1)- foo1- bar1weight: 10 # 匹配度权重- preference:matchExpressions:- key: zone2operator: Invalues:- foo2- bar2weight: 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=foo1kubectl 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-firstlabels:app: myapp
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: 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-secondlabels:app: backend
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand: ["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-secondlabels:app: backend
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand: ["sh","-c","sleep 3600"]affinity:podAffinity:  #使用pod亲和性requiredDuringSchedulingIgnoredDuringExecution:  #使用硬亲和性- topologyKey: zone2 # 设置node1节点没有的标签keylabelSelector:  matchExpressions: - {key: app, operator: In, values: ["myapp"]}

重建第二个pod资源

kubectl delete -f pod-required-affinity-demo-2.yamlkubectl 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-firstlabels:app1: myapp1
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: 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-secondlabels:app: backend
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand: ["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=fookubectl label nodes  k8s-node1  zone=foo

创建第一个pod资源文件

vim pod-first-required-anti-affinity-demo-1.yaml
apiVersion: v1
kind: Pod
metadata:name: pod-firstlabels:app3: myapp3
spec:containers:- name: myappimage: ikubernetes/myapp:v1imagePullPolicy: 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-secondlabels:app: backendtier: db
spec:containers:- name: busyboximage: busybox:latestimagePullPolicy: IfNotPresentcommand: ["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.mzph.cn/news/675295.shtml

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

相关文章

【代码】Processing笔触手写板笔刷代码合集

代码来源于openprocessing,考虑到国内不是很好访问,我把我找到的比较好的搬运过来! 合集 参考:https://openprocessing.org/sketch/793375 https://github.com/SourceOf0-HTML/processing-p5.js/tree/master 这个可以体验6种笔触…

ubuntu22.04安装部署03: 设置root密码

一、前言 ubuntu22.04 安装完成以后,默认root用户是没有设置密码的,需要手动设置。具体的设置过程如下文内容所示: 相关文件: 《ubuntu22.04装部署01:禁用内核更新》 《ubuntu22.04装部署02:禁用显卡更…

Unity类银河恶魔城学习记录4-4 4-5 P57-58 On Hit Impactp- Attack‘direction fix源代码

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释,可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili Entity.cs using System.Collections; using System.Collections.Generic;…

排序算法---快速排序

原创不易,转载请注明出处。欢迎点赞收藏~ 快速排序是一种常用的排序算法,采用分治的策略来进行排序。它的基本思想是选取一个元素作为基准(通常是数组中的第一个元素),然后将数组分割成两部分,其中一部分的…

苹果mac电脑如何优化系统?保持不卡顿呢

再强悍的性能和优秀的操作系统,但长时间使用后,有时也会出现卡顿的情况。为了让你的苹果电脑保持高效运行,我们将深入探讨导致电脑卡顿的原因,并提供苹果电脑如何优化系统的解决方案,帮助你优化系统。 过多的启动项 …

排序算法---归并排序

原创不易,转载请注明出处。欢迎点赞收藏~ 归并排序是一种常见的排序算法,它采用了分治的思想。它将一个待排序的数组递归地分成两个子数组,分别对两个子数组进行排序,然后将排好序的子数组合并成一个有序数组。 具体的归并排序过…

Spring第二天

一、第三方资源配置管理 说明:以管理DataSource连接池对象为例讲解第三方资源配置管理 1 管理DataSource连接池对象 问题导入 配置数据库连接参数时,注入驱动类名是用driverClassName还是driver? 1.1 管理Druid连接池【重点】 数据库准备…

【集合系列】TreeMap 集合

TreeMap 集合 1. 概述2. 方法3. 遍历方式4. 排序方式5. 代码示例16. 代码示例27. 代码示例38. 注意事项 其他集合类 父类 Map 集合类的遍历方式 TreeSet 集合 具体信息请查看 API 帮助文档 1. 概述 TreeMap 是 Java 中的一个集合类,它实现了 SortedMap 接口。它是…

深入理解Netty及核心组件使用—上

目录 Netty的优势 为什么Netty使用NIO而不是AIO? Netty基本组件 Bootstrap、EventLoop(Group) 、Channel 事件和 ChannelHandler、ChannelPipeline ChannelFuture Netty入门程序 服务端代码 客户端代码 运行结果 Netty的优势 1. API 使用简单&#xff0c…

docker部署showdoc

目录 安装 1.拉取镜像 2.创建容器 使用 1.选择语言 2.默认账户/密码:showdoc/123456​编辑 3.登陆 4.首页 安装 1.拉取镜像 docker pull star7th/showdoc 2.创建容器 mkdir -p /opt/showdoc/html docker run -d --name showdoc --userroot --privilegedtrue -p 1005…

RocketMQ事务消息

事务消息 应用场景: ​ 事务消息是RocketMQ非常有特色的一个高级功能。他的基础诉求是通过RocketMQ的事务机制,来保证上下游的数据一致性。 ​ 以电商为例,用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购…

黄金交易策略:手工同向单减保留仓

虽然保留仓的仓位不大,扛个一年半载不是问题,但闲着也可以手工处理掉(10000点以内的不要处理)。挑一个最大的单,同向相同的手数,并把两单的止盈设置中位数(也没有这么严格,差不多就好…

[嵌入式AI从0开始到入土]5_炼丹炉的搭建(基于wsl2_Ubuntu22.04)

[嵌入式AI从0开始到入土]嵌入式AI系列教程 注:等我摸完鱼再把链接补上 可以关注我的B站号工具人呵呵的个人空间,后期会考虑出视频教程,务必催更,以防我变身鸽王。 第一章 昇腾Altas 200 DK上手 第二章 下载昇腾案例并运行 第三章…

深度学习在知识图谱问答中的革新与挑战

目录 前言1 背景知识2 基于深度学习改进问句解析模型2.1 谓词匹配2.2 问句解析2.3 逐步生成查询图 3 基于深度学习的端到端模型3.1 端到端框架3.2 简单嵌入技术 4 优势4.1 深入的问题表示4.2 实体关系表示深挖4.3 候选答案排序效果好 5 挑战5.1 依赖大量训练语料5.2 推理类问句…

app逆向-android-studio安装使用教程

Android Studio 是谷歌推出的一个Android集成开发工具,基于IntelliJ IDEA. 类似 Eclipse ADT,Android Studio 提供了集成的 Android 开发工具用于开发和调试。 android-studio下载地址:https://developer.android.com/studio/archive androi…

Backtrader 文档学习- Plotting

Backtrader 文档学习- Plotting 虽然回测是一个基于数学计算的自动化过程,还是希望实际通过可视化验证。无论是使用现有算法回测,还是观察数据驱动的指标(内置或自定义)。 凡事都要有人完成,绘制数据加载、指标、操作…

图数据库 之 Neo4j - Browser 介绍(3)

Neo4j Browser 介绍 Neo4j Browser 中有 3 个模块,侧边栏,Cypher 编辑器与结果栏,在进入 Neo4j Browser 时结果栏会展示欢迎界面。 Cypher 编辑器 Cypher 是一种图形查询语言,用于查询和操作图形数据库。它是 Neo4j 图形数据库的…

C# OpenVINO 图片旋转角度检测

目录 效果 项目 代码 下载 效果 项目 代码 using OpenCvSharp; using Sdcb.OpenVINO; using System; using System.Diagnostics; using System.Drawing; using System.Linq; using System.Runtime.InteropServices; using System.Security.Cryptography; using System.Te…

Avalonia学习(二十三)-大屏

弄一个大屏显示的界面例子&#xff0c;但是代码有点多&#xff0c;还有用户控件。 目前还有一点问题在解决&#xff0c;先看一下界面效果。 圆形控件 前端代码 <UserControl xmlns"https://github.com/avaloniaui"xmlns:x"http://schemas.microsoft.com/…

django admin 自定义界面时丢失左侧导航 nav_sidebar

只显示了自定义模板的内容&#xff0c;左侧导航没有显示出来。 原因&#xff1a;context 漏掉了&#xff0c;要补上。 # 错误写法&#xff08;左侧导航不显示&#xff09;def changelist_view(self, request, extra_contextNone):form CsvImportForm()payload {"form&qu…