【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

相关文章

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

Java时间轮调度算法的代码实现

《Java时间轮调度算法的代码实现》时间轮是一种高效的定时调度算法,主要用于管理延时任务或周期性任务,它通过一个环形数组(时间轮)和指针来实现,将大量定时任务分摊到固定的时间槽中,极大地降低了时间复杂... 目录1、简述2、时间轮的原理3. 时间轮的实现步骤3.1 定义时间槽3.2 定义时间轮3.3 使用时

kotlin中的行为组件及高级用法

《kotlin中的行为组件及高级用法》Jetpack中的四大行为组件:WorkManager、DataBinding、Coroutines和Lifecycle,分别解决了后台任务调度、数据驱动UI、异... 目录WorkManager工作原理最佳实践Data Binding工作原理进阶技巧Coroutine

springboot的调度服务与异步服务使用详解

《springboot的调度服务与异步服务使用详解》本文主要介绍了Java的ScheduledExecutorService接口和SpringBoot中如何使用调度线程池,包括核心参数、创建方式、自定... 目录1.调度服务1.1.JDK之ScheduledExecutorService1.2.spring

深入解析Spring TransactionTemplate 高级用法(示例代码)

《深入解析SpringTransactionTemplate高级用法(示例代码)》TransactionTemplate是Spring框架中一个强大的工具,它允许开发者以编程方式控制事务,通过... 目录1. TransactionTemplate 的核心概念2. 核心接口和类3. TransactionT

深入理解Apache Airflow 调度器(最新推荐)

《深入理解ApacheAirflow调度器(最新推荐)》ApacheAirflow调度器是数据管道管理系统的关键组件,负责编排dag中任务的执行,通过理解调度器的角色和工作方式,正确配置调度器,并... 目录什么是Airflow 调度器?Airflow 调度器工作机制配置Airflow调度器调优及优化建议最

k8s部署MongDB全过程

《k8s部署MongDB全过程》文章介绍了如何在Kubernetes集群中部署MongoDB,包括环境准备、创建Secret、创建服务和Deployment,并通过Robo3T工具测试连接... 目录一、环境准备1.1 环境说明1.2 创建 namespace1.3 创建mongdb账号/密码二、创建Sec

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

Python中列表的高级索引技巧分享

《Python中列表的高级索引技巧分享》列表是Python中最常用的数据结构之一,它允许你存储多个元素,并且可以通过索引来访问这些元素,本文将带你深入了解Python列表的高级索引技巧,希望对... 目录1.基本索引2.切片3.负数索引切片4.步长5.多维列表6.列表解析7.切片赋值8.删除元素9.反转列表