【k8s 高级调度--亲和力/反亲和力】

2024-03-01 06:12

本文主要是介绍【k8s 高级调度--亲和力/反亲和力】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、亲和性/反亲和性介绍

nodeSelector 提供了一种最简单的方法来将 Pod 约束到具有特定标签的节点上。 亲和性和反亲和性扩展了你可以定义的约束类型。使用亲和性与反亲和性的一些好处有:

  • 亲和性、反亲和性语言的表达能力更强。nodeSelector 只能选择拥有所有指定标签的节点。 亲和性、反亲和性为你提供对选择逻辑的更强控制能力。
  • 你可以标明某规则是“软需求”或者“偏好”,这样调度器在无法找到匹配节点时仍然调度该 Pod。
  • 你可以使用节点上(或其他拓扑域中)运行的其他 Pod 的标签来实施调度约束, 而不是只能使用节点本身的标签。这个能力让你能够定义规则允许哪些 Pod 可以被放置在一起。

亲和性功能由两种类型的亲和性组成:

  • 节点亲和性功能类似于 nodeSelector 字段,但它的表达能力更强,并且允许你指定软规则。
  • Pod 间亲和性/反亲和性允许你根据其他 Pod 的标签来约束 Pod。

2、Node节点亲和力/反亲和力

节点亲和性概念上类似于 nodeSelector, 它使你可以根据节点上的标签来约束 Pod 可以调度到哪些节点上。 节点亲和性有两种:

  • requiredDuringSchedulingIgnoredDuringExecution: 调度器只有在规则被满足的时候才能执行调度。此功能类似于 nodeSelector, 但其语法表达能力更强。
  • preferredDuringSchedulingIgnoredDuringExecution: 调度器会尝试寻找满足对应规则的节点。如果找不到匹配的节点,调度器仍然会调度该 Pod。

2.1 配置文件

spec:template:spec:affinity:nodeAffinity:  requiredDuringSchedulingIgnoredDuringExecution: # 硬匹配nodeSelectorTerms:- matchExpressions:- key: kubernetes.io/os   # 匹配的keyoperator: In      # 匹配的操作,In代表在values:- linux   # 匹配的值preferredDuringSchedulingIgnoredDuringExecution:  # 软匹配- weight: 1   # 匹配的权重,数值越大,权重越高preference:matchExpressions:- key: label-1   # 匹配的keyoperator: Invalues:- key-1   # 匹配的值- weight: 50preference:matchExpressions:- key: label-2operator: Invalues:- key-2

2.2 上文的软匹配中,给node1和node2分别添加一个标签

[root@k8s-master ~]# kubectl label   nodes  k8s-node-01  label-1=key-1
node/k8s-node-01 labeled
[root@k8s-master ~]# kubectl label   nodes  k8s-node-02  label-2=key-2
node/k8s-node-02 labeled

在这里插入图片描述

2.3 将上面节点亲和力的配置添加到deployment中

在这里插入图片描述

2.4 查看pod情况

由于requiredDuringSchedulingIgnoredDuringExecution 硬匹配都可以匹配到,但是 在 preferredDuringSchedulingIgnoredDuringExecution 软匹配的时候,node2的亲和力比node1的高,所以pod都跑到了node2上。

在这里插入图片描述

2.5 修改一个软亲和力的操作

在这里插入图片描述

2.6 查看pod情况

在这里插入图片描述

2.7 NodeAffinity 亲和力的匹配类型

  • In: 满足一个就满足,就把pod部署过去
  • NotIn: 一个都不能满足,就是你满足了这个条件,pod不可以部署过来,也就是反亲和力
  • Exist: 只要存在就满足
  • DoesNotExist: 只要不存在就满足
  • Gt: 必须要打大于节点上的数值
  • Lt: 必须要打小于节点上的数值

3、Pod资源亲和力/反亲和力

Pod 间亲和性与反亲和性使你可以基于已经在节点上运行的 Pod 的标签来约束 Pod 可以调度到的节点,而不是基于节点上的标签。

  • Pod亲和力:将与指定pod亲和力相匹配的pod部在同一节点。
  • Pod反亲和力,将与指定的pod亲和力想匹配的pod部署在不同的同一节点

3.1 分别给node打标签

[root@k8s-master ~]# kubectl label nodes k8s-node-01 k8s-node-02  topology.kubernetes.io/zone=V
node/k8s-node-01 labeled
node/k8s-node-02 labeled[root@k8s-master ~]# kubectl label nodes k8s-master   topology.kubernetes.io/zone=R
node/k8s-master labeled[root@k8s-master ~]# kubectl get nodes  --show-labels
NAME          STATUS   ROLES           AGE    VERSION   LABELS
k8s-master    Ready    control-plane   9d     v1.25.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-master,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node.kubernetes.io/exclude-from-external-load-balancers=,topology.kubernetes.io/zone=R
k8s-node-01   Ready    <none>          9d     v1.25.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,ingress=true,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-01,kubernetes.io/os=linux,label-1=key-1,topology.kubernetes.io/zone=V,type=microsvc
k8s-node-02   Ready    <none>          7d1h   v1.25.0   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=k8s-node-02,kubernetes.io/os=linux,label-2=key-2,topology.kubernetes.io/zone=V,type=microsvc

3.2 创建第一个deploy资源,pod标签是 security: S1

3.2.1 配置文件

apiVersion: apps/v1 # deployment api 版本
kind: Deployment # 资源类型为 deployment
metadata: # 元信息labels: # 标签app: nginx-deploy # 具体的 key: value 配置形式name: nginx-deploy-s1 # deployment 的名字namespace: default # 所在的命名空间
spec:replicas: 2 # 期望副本数revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数selector: # 选择器,用于找到匹配的 RSmatchLabels: # 按照标签匹配app: nginx-deploy # 匹配的标签key/valuestrategy: # 更新策略rollingUpdate: # 滚动更新配置maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功type: RollingUpdate # 更新类型,采用滚动更新template: # pod 模板metadata: # pod 的元信息labels: # pod 的标签app: nginx-deploy#   topology.kubernetes.io/zone: Vsecurity: S1spec: # pod 期望信息containers: # pod 的容器- image: nginx:1.20 # 镜像imagePullPolicy: IfNotPresent # 拉取策略name: nginx # 容器名称resources:limits:cpu: 200mmemory: 128Mirequests:cpu: 100mmemory: 128MirestartPolicy: Always # 重启策略terminationGracePeriodSeconds: 30 # 删除操作最多宽限多长时间

3.2.2 创建这个deploy

[root@k8s-master affinity]# kubectl create -f s1-nginx-deploy-affinity.yaml
deployment.apps/nginx-deploy-s1 created

3.2.3 查看这个pod信息

  • 有一个pod运行在了master、有一个运行在了node-02
[root@k8s-master affinity]# kubectl get po   -owide    --show-labels
NAME                               READY   STATUS    RESTARTS        AGE     IP           NODE          NOMINATED NODE   READINESS GATES   LABELS
dns-test                           1/1     Running   2 (2d12h ago)   4d21h   10.2.1.58    k8s-node-02   <none>           <none>            run=dns-test
fluentd-59k8k                      1/1     Running   1 (2d12h ago)   4d3h    10.2.2.34    k8s-node-01   <none>           <none>            app=logging,controller-revision-hash=7555d95dc,id=fluentd,pod-template-generation=2
fluentd-hhtls                      1/1     Running   1 (2d12h ago)   4d3h    10.2.1.59    k8s-node-02   <none>           <none>            app=logging,controller-revision-hash=7555d95dc,id=fluentd,pod-template-generation=2
nginx-deploy-579987f57f-ccgd8      1/1     Running   0               51m     10.2.2.113   k8s-node-01   <none>           <none>            app=nginx-deploy,pod-template-hash=579987f57f
nginx-deploy-579987f57f-hwpjk      1/1     Running   0               51m     10.2.2.112   k8s-node-01   <none>           <none>            app=nginx-deploy,pod-template-hash=579987f57f
nginx-deploy-s1-5cc987b754-82xt5   1/1     Running   0               26s     10.2.1.92    k8s-node-02   <none>           <none>            app=nginx-deploy,pod-template-hash=5cc987b754,security=S1
nginx-deploy-s1-5cc987b754-kwsk5   1/1     Running   0               26s     10.2.0.7     k8s-master    <none>           <none>            app=nginx-deploy,pod-template-hash=5cc987b754,security=S1

3.3 创建第二个deploy资源,pod标签是 security: S2

3.3.1 配置文件

apiVersion: apps/v1 # deployment api 版本
kind: Deployment # 资源类型为 deployment
metadata: # 元信息labels: # 标签app: nginx-deploy # 具体的 key: value 配置形式name: nginx-deploy-s2 # deployment 的名字namespace: default # 所在的命名空间
spec:replicas: 1 # 期望副本数revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数selector: # 选择器,用于找到匹配的 RSmatchLabels: # 按照标签匹配app: nginx-deploy # 匹配的标签key/valuestrategy: # 更新策略rollingUpdate: # 滚动更新配置maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功type: RollingUpdate # 更新类型,采用滚动更新template: # pod 模板metadata: # pod 的元信息labels: # pod 的标签app: nginx-deploy#     topology.kubernetes.io/zone: Vsecurity: S2spec: # pod 期望信息nodeSelector:kubernetes.io/hostname: k8s-mastercontainers: # pod 的容器- image: nginx:1.20 # 镜像imagePullPolicy: IfNotPresent # 拉取策略name: nginx # 容器名称resources:limits:cpu: 200mmemory: 128Mirequests:cpu: 100mmemory: 128MirestartPolicy: Always # 重启策略terminationGracePeriodSeconds: 30 # 删除操作最多宽限多长时间

3.3.2 创建这个deploy

[root@k8s-master affinity]# kubectl create  -f s2-nginx-deploy-affinity.yaml
deployment.apps/nginx-deploy-s2 created

3.3.3 查看这个pod信息

  • 这个pod运行在了master上
[root@k8s-master affinity]# kubectl get po   -owide    --show-labels
NAME                               READY   STATUS    RESTARTS        AGE     IP           NODE          NOMINATED NODE   READINESS GATES   LABELS
dns-test                           1/1     Running   2 (2d12h ago)   4d21h   10.2.1.58    k8s-node-02   <none>           <none>            run=dns-test
fluentd-59k8k                      1/1     Running   1 (2d12h ago)   4d3h    10.2.2.34    k8s-node-01   <none>           <none>            app=logging,controller-revision-hash=7555d95dc,id=fluentd,pod-template-generation=2
fluentd-hhtls                      1/1     Running   1 (2d12h ago)   4d3h    10.2.1.59    k8s-node-02   <none>           <none>            app=logging,controller-revision-hash=7555d95dc,id=fluentd,pod-template-generation=2
nginx-deploy-579987f57f-ccgd8      1/1     Running   0               55m     10.2.2.113   k8s-node-01   <none>           <none>            app=nginx-deploy,pod-template-hash=579987f57f
nginx-deploy-579987f57f-hwpjk      1/1     Running   0               56m     10.2.2.112   k8s-node-01   <none>           <none>            app=nginx-deploy,pod-template-hash=579987f57f
nginx-deploy-s1-5cc987b754-82xt5   1/1     Running   0               5m19s   10.2.1.92    k8s-node-02   <none>           <none>            app=nginx-deploy,pod-template-hash=5cc987b754,security=S1
nginx-deploy-s1-5cc987b754-kwsk5   1/1     Running   0               5m19s   10.2.0.7     k8s-master    <none>           <none>            app=nginx-deploy,pod-template-hash=5cc987b754,security=S1
nginx-deploy-s2-656bfc8d9c-qpzl4   1/1     Running   0               3s      10.2.0.8     k8s-master    <none>           <none>            app=nginx-deploy,pod-template-hash=656bfc8d9c,security=S2

3.4 创建这个Pod亲和力的deploy资源

3.4.1 配置文件

apiVersion: apps/v1 # deployment api 版本
kind: Deployment # 资源类型为 deployment
metadata: # 元信息labels: # 标签app: nginx-deploy # 具体的 key: value 配置形式name: nginx-deploy-test # deployment 的名字namespace: default # 所在的命名空间
spec:replicas: 2 # 期望副本数revisionHistoryLimit: 10 # 进行滚动更新后,保留的历史版本数selector: # 选择器,用于找到匹配的 RSmatchLabels: # 按照标签匹配app: nginx-deploy # 匹配的标签key/valuestrategy: # 更新策略rollingUpdate: # 滚动更新配置maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功type: RollingUpdate # 更新类型,采用滚动更新template: # pod 模板metadata: # pod 的元信息labels: # pod 的标签app: nginx-deployspec: # pod 期望信息affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: securityoperator: Invalues:- S1topologyKey: topology.kubernetes.io/zonepodAntiAffinity:preferredDuringSchedulingIgnoredDuringExecution:- weight: 100podAffinityTerm:labelSelector:matchExpressions:- key: securityoperator: Invalues:- S2topologyKey: topology.kubernetes.io/zonecontainers: # pod 的容器- image: nginx:1.20 # 镜像imagePullPolicy: IfNotPresent # 拉取策略name: nginx # 容器名称resources:limits:cpu: 200mmemory: 128Mirequests:cpu: 100mmemory: 128MirestartPolicy: Always # 重启策略terminationGracePeriodSeconds: 30 # 删除操作最多宽限多长时间

3.4.2 创建这个deploy

[root@k8s-master affinity]# kubectl create -f nginx-affinity-deploy.yaml
deployment.apps/nginx-deploy-test created

3.4.3 查看这个pod信息

在这里插入图片描述

  • 正常按照调度规则是s1所在的node上,新的这个亲和力的pod应该被创建到和s1相同的节点上,但是目前这个创建是不一样的。
  • 可能原因:

在这里插入图片描述

3.5 删除目前不使用的资源后重复以上3.2-3.4的操作过程后

  • 复现了我们设置的亲和力规则,新创建的资源匹配到 security=S1,两个资源所在的节点都是同一个节点。
    在这里插入图片描述

这篇关于【k8s 高级调度--亲和力/反亲和力】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/761447

相关文章

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.

Java Stream 的 Collectors.toMap高级应用与最佳实践

《JavaStream的Collectors.toMap高级应用与最佳实践》文章讲解JavaStreamAPI中Collectors.toMap的使用,涵盖基础语法、键冲突处理、自定义Map... 目录一、基础用法回顾二、处理键冲突三、自定义 Map 实现类型四、处理 null 值五、复杂值类型转换六、处理

python panda库从基础到高级操作分析

《pythonpanda库从基础到高级操作分析》本文介绍了Pandas库的核心功能,包括处理结构化数据的Series和DataFrame数据结构,数据读取、清洗、分组聚合、合并、时间序列分析及大数据... 目录1. Pandas 概述2. 基本操作:数据读取与查看3. 索引操作:精准定位数据4. Group

Java中的xxl-job调度器线程池工作机制

《Java中的xxl-job调度器线程池工作机制》xxl-job通过快慢线程池分离短时与长时任务,动态降级超时任务至慢池,结合异步触发和资源隔离机制,提升高频调度的性能与稳定性,支撑高并发场景下的可靠... 目录⚙️ 一、调度器线程池的核心设计 二、线程池的工作流程 三、线程池配置参数与优化 四、总结:线程

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文