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://xiahunao.cn/news/2776172.html

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

相关文章

MySQL优化器

优化器 MySQL存储引擎中存在了一个可插拔的优化器OPTIMIZER_TRACE,可以看到内部查询计划的TRACE信息,从而可以知道MySQL内部执行过程 查询优化器状态 show variables like optimizer_trace;Variable_name Valueoptimizer_trace enabledoff,one_lineoff…

[C++] opencv + qt 创建带滚动条的图像显示窗口代替imshow

在OpenCV中,imshow函数默认情况下是不支持滚动条的。如果想要显示滚动条,可以考虑使用其他库或方法来进行实现。 一种方法是使用Qt库,使用该库可以创建一个带有滚动条的窗口,并在其中显示图像。具体步骤如下: 1&…

【翻译】Processing安卓模式的安装使用及打包发布(内含中文版截图)

原文链接在下面的每一章的最前面。 原文有三篇,译者不知道贴哪篇了,这篇干脆标了原创。。 译者声明:本文原文来自于GNU协议支持下的项目,具备开源二改授权,可翻译后公开。 文章目录 Install(安装&#xff0…

路由引入路由过滤排错

目录 排错网络拓扑图 排错需求 故障排错 故障一 故障二 故障三 排错网络拓扑图 排错需求 按照图示配置 IP 地址,总部和分支 A、分支 B 各自使用 loopback 口模拟业务网段公司业务流分为 A 流和 B 流,网段如图所示总部内部配置 OSPF 互通&#xff0…

Frostmourne (霜之哀伤)日志告警系统部署安装

简介 Frostmourne(霜之哀伤)是汽车之家经销商技术部监控系统的开源版本,用于帮助监控几乎所有数据库数据(包括Elasticsearch, Prometheus, SkyWalking, MySql 等等)。如果你已经建立起了日志系统, 指标体系,却苦恼于没有一个配套监控系统&am…

【芯片设计- RTL 数字逻辑设计入门 15 -- 函数实现数据大小端转换】

文章目录 函数实现数据大小端转换函数语法函数使用的规则Verilog and Testbench综合图VCS 仿真波形 函数实现数据大小端转换 在数字芯片设计中,经常把实现特定功能的模块编写成函数,在需要的时候再在主模块中调用,以提高代码的复用性和提高设…

「递归算法」:二叉树剪枝

一、题目 给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点 node 的子树为 node 本身加上所有 node 的后代。 示例 1: 输入:root [1,null,0,0,1] 输出&…

编曲学习:旋律创作基础概念 和弦进行作曲 和弦外音使用 作曲技巧

旋律创作基础概念 和弦进行作曲 和弦外音使用 作曲技巧https://app8epdhy0u9502.pc.xiaoe-tech.com/live_pc/l_65be1ba7e4b064a83b92a3d7?course_id=course_2XLKtQnQx9GrQHac7OPmHD9tqbv文档https://app8epdhy0u9502.pc.xiaoe-tech.com/p/t_pc/course_pc_detail/camp_pro/cour…

Java实现用户画像活动推荐系统 JAVA+Vue+SpringBoot+MySQL

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

算法练习-二叉搜索树中的搜索(思路+流程图+代码)

难度参考 难度:中等 分类:二叉树 难度与分类由我所参与的培训课程提供,但需要注意的是,难度与分类仅供参考。且所在课程未提供测试平台,故实现代码主要为自行测试的那种,以下内容均为个人笔记,旨…

活字格V9 嵌入的html与活字格页面数据交互

不想看分析请直接跳到解决方案 项目场景: 活字格V9 嵌入的html与活字格页面的数据交互(传值),嵌入的html用了WebSocket来控制硬件,获取的数据无法回传到活字格页面上,且嵌入的html无法使用活字格内置的js及…

第三百一十回

我们在上一章回中介绍了"再谈ListView中的分隔线",本章回中将介绍showMenu的用法.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在第一百六十三回中介绍了showMenu相关的内容,它主要用来显示移动PopupMenu在页面中的位置…

Git、github与gitee码云

1.git核心是两个仓库:本地仓库和远程仓库 主要用于团队合作和代码版本控制(个人现有版本代码出错可回溯上个提交版本的代码) 远程仓库国际主流githut,但外网速度问题,国内可使用码云gitee github:https:…

【开源】JAVA+Vue.js实现在线课程教学系统

目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2.3 课时管理模块2.4 课程交互模块2.5 系统基础模块 三、系统设计3.1 用例设计3.2 数据库设计 四、系统展示4.1 管理后台4.2 用户网页 五、样例代码5.1 新增课程类型5.2 网站登录5.3 课…

vue3+vite+ts 配置commit强制码提交规范配置 commitlint

配置 git 提交时的 commit 信息,统一提交 git 提交规范 安装命令: npm install -g commitizen npm i cz-customizable npm i commitlint/config-conventional commitlint/cli -D 文件配置 根路径创建文件 commitlint.config.js module.exports {// 继承的规…

Backtrader 文档学习- Plotting -Plotting on the same axis

Backtrader 文档学习- Plotting -Plotting on the same axis 1.概述 在同一轴上绘图,绘图是在同一空间上绘制原始数据和稍微(随机)修改的数据,但不是在同一轴上。 核心代码,data数据正负50点。 # The filter which changes the close pri…

java面试题:MySQL中的各种JOIN的区别

表关联是频率非常高的一种数据库操作,在MySQL中,这种JOIN操作有很多类型,包括内联接、左外连接、右外连接等等,而每种连接的含义都不一样,如果死记硬背,不仅很难记住,而且也容易搞混淆&#xff…

JAVA Web 学习(三)Web服务架构

五、软件架构模式——MVC MVC是一种 分层开发的模式 ,其中:M-Model,业务模型,处理业务;V:View,视图,界面展示;C:Controller,控制器,处…

基于华为云欧拉操作系统(HCE OS)容器化部署传统应用(Redis+Postgresql+Git+SpringBoot+Nginx)

写在前面 博文内容为 华为云欧拉操作系统入门级开发者认证(HCCDA – Huawei Cloud EulerOS)实验笔记整理认证地址:https://edu.huaweicloud.com/certificationindex/developer/9bf91efb086a448ab4331a2f53a4d3a1博文内容涉及一个传统 Springboot 应用HCE部署&#x…

JavaScript 入门 完整版

目录 第一个知识点:引入js文件 内部引用: 外部引用: 第二个知识点:javascript的基本语法 定义变量: 条件控制(if - else if - else) 第三个知识点:javascript里的数据类型、运算符: 数字类型 字符串类型 布尔…