【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   # 匹配的key
                operator: In      # 匹配的操作,In代表在
                values:
                - linux   # 匹配的值
          preferredDuringSchedulingIgnoredDuringExecution:  # 软匹配
          - weight: 1   # 匹配的权重,数值越大,权重越高
            preference:
              matchExpressions:
              - key: label-1   # 匹配的key
                operator: In
                values:
                - key-1   # 匹配的值
          - weight: 50
            preference:
              matchExpressions:
              - key: label-2
                operator: In
                values:
                - 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: # 选择器,用于找到匹配的 RS
    matchLabels: # 按照标签匹配
      app: nginx-deploy # 匹配的标签key/value
  strategy: # 更新策略
    rollingUpdate: # 滚动更新配置
      maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例
      maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功
    type: RollingUpdate # 更新类型,采用滚动更新
  template: # pod 模板
    metadata: # pod 的元信息
      labels: # pod 的标签
        app: nginx-deploy
      #   topology.kubernetes.io/zone: V
        security: S1
    spec: # pod 期望信息
      containers: # pod 的容器
      - image: nginx:1.20 # 镜像
        imagePullPolicy: IfNotPresent # 拉取策略
        name: nginx # 容器名称
        resources:
          limits:
            cpu: 200m
            memory: 128Mi
          requests:
            cpu: 100m
            memory: 128Mi
      restartPolicy: 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: # 选择器,用于找到匹配的 RS
    matchLabels: # 按照标签匹配
      app: nginx-deploy # 匹配的标签key/value
  strategy: # 更新策略
    rollingUpdate: # 滚动更新配置
      maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例
      maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功
    type: RollingUpdate # 更新类型,采用滚动更新
  template: # pod 模板
    metadata: # pod 的元信息
      labels: # pod 的标签
        app: nginx-deploy
    #     topology.kubernetes.io/zone: V
        security: S2
    spec: # pod 期望信息
      nodeSelector:
        kubernetes.io/hostname: k8s-master
      containers: # pod 的容器
      - image: nginx:1.20 # 镜像
        imagePullPolicy: IfNotPresent # 拉取策略
        name: nginx # 容器名称
        resources:
          limits:
            cpu: 200m
            memory: 128Mi
          requests:
            cpu: 100m
            memory: 128Mi
      restartPolicy: 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: # 选择器,用于找到匹配的 RS
    matchLabels: # 按照标签匹配
      app: nginx-deploy # 匹配的标签key/value
  strategy: # 更新策略
    rollingUpdate: # 滚动更新配置
      maxSurge: 25% # 进行滚动更新时,更新的个数最多可以超过期望副本数的个数/比例
      maxUnavailable: 25% # 进行滚动更新时,最大不可用比例更新比例,表示在所有副本数中,最多可以有多少个不更新成功
    type: RollingUpdate # 更新类型,采用滚动更新
  template: # pod 模板
    metadata: # pod 的元信息
      labels: # pod 的标签
        app: nginx-deploy
    spec: # pod 期望信息
      affinity:
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: security
                operator: In
                values:
                - S1
            topologyKey: topology.kubernetes.io/zone
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 100
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: security
                  operator: In
                  values:
                  - S2
              topologyKey: topology.kubernetes.io/zone
      containers: # pod 的容器
      - image: nginx:1.20 # 镜像
        imagePullPolicy: IfNotPresent # 拉取策略
        name: nginx # 容器名称
        resources:
          limits:
            cpu: 200m
            memory: 128Mi
          requests:
            cpu: 100m
            memory: 128Mi
      restartPolicy: 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,两个资源所在的节点都是同一个节点。
    在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数电票又增新票种 百望云率先推出机动车数电票解决方案

经过两年多的试点推广&#xff0c;数电票工程已经覆盖全国大部分省区市&#xff08;含计划单列市&#xff09;&#xff0c;随着系统建设的深入&#xff0c;不仅是应用功能逐渐完善&#xff0c;对票种的支持也走向全面。 2023年11月天津市正式开启机动车数电票的开具功能&#x…

2024高频前端面试题 Vue2 和 Vue3 篇

* Vue2 和 Vue3的区别&#xff1a; 1&#xff09;双向数据绑定原理的区别 2&#xff09;根节点的不同 Vue2只能一个根节点 Vue3在组件中可以放置多个根节点 3&#xff09;Vue3中采用composition API vue2:采用的选项型API(opsition API) vue3:采用的组合型API(composition A…

分享76个Html杂七杂八模板,总有一款适合您

分享76个Html杂七杂八模板&#xff0c;总有一款适合您 76个Html杂七杂八模板下载链接&#xff1a;https://pan.baidu.com/s/1ZQ16JmRiwgxlvDq9Vi41uA?pwd8888 提取码&#xff1a;8888 学习知识费力气&#xff0c;收集整理更不易。知识付费甚欢喜&#xff0c;为咱码农谋福…

网络进程:广播、组播、流式域、报式域(套接字)

1.广播 1.1广播发送端模型(类似UDP客户端) 程序代码&#xff1a; #include<myhead.h> int main(int argc, const char *argv[]) {//创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error");return -1;}//将套接字设置成允许广播i…

cmd模式下启动mysql

1.打开cmd输入services.msc&#xff0c;找到MYSQL&#xff0c;右击属性&#xff0c;找到可执行文件路径&#xff0c;加载到环境变量。 2.打开cmd&#xff0c;启动MYSQL&#xff1a;输入net start mysql; 3.登陆MYSQL&#xff0c;需要管理权限&#xff1b; 输入&#xff1a;my…

【OBS】stream-labs-desktop 编译运行采坑全攻略

▒ 目录 ▒ &#x1f6eb; 导读需求开发环境 1️⃣ 安装yarn安装 2️⃣ 安装依赖库&#xff1a;yarn installcertificate has expiredelectronnpm:25.9.3 couldnt be built successfully 3️⃣ 启动desktop项目编译调试模式启动启动缓慢问题 4️⃣ 打包&#x1f6ec; 文章小结…

sentinel docker 基础配置学习

1&#xff1a;去官网下载 Releases alibaba/Sentinel GitHub 2&#xff1a;保存到linux 3&#xff1a;编写dockerfile FROM openjdk:8-jreLABEL authors"xxx" #第二步创建一个文件夹Z RUN mkdir /app #第三步复制jar 到app 下 COPY xxxxxx-1.8.7.jar /app/#第四…

动态规划(算法竞赛、蓝桥杯)--背包DP求具体方案

1、B站视频链接&#xff1a;E20 背包DP 求具体方案_哔哩哔哩_bilibili #include <bits/stdc.h> using namespace std; const int N1010; int v[N],w[N]; int f[N][N],p[N][N];int main(){int n,m;cin>>n>>m;for(int i1;i<n;i)cin>>v[i]>>w[i…

云计算 3月5号 (DNS域名解析及部署)

DNS域名解析服务 1.DNS介绍 DNS 是域名系统 (Domain Name System) 的缩写&#xff0c;是因特网的一项核心服务&#xff0c;它作为可以将域名和IP地址相互映射的一个分布式数据库&#xff0c;能够使人更方便的访问互联网&#xff0c;而不用去记住能够被机器直接读取的IP数串。…

UD效果广告

1.定义 全称Unidesk&#xff0c;是由阿里旗下大数据运营平台“阿里妈妈”推出的数字营销引流平台。UD投放将其他媒体的流量通过相关的广告创意导入到天猫店铺。 2.UD投放优化技巧 &#xff08;1&#xff09;不起量排查&#xff1a; 可以从账户问题、计划数量不足、计划设置…

c语言经典测试题11

1.题1 #include <stdio.h> int main() { int a[] {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}, *p a 5, *q NULL; *q *(p5); printf("%d %d\n", *p, *q); return 0; }上述代码的运行结果是什么呢&#xff1f; 我们来分析一下&#xff1a;我们创建了一个数…

美易官方《盘前:美国股指期货温和走低》

美国股指期货在盘前交易中温和走低&#xff0c;市场情绪在美联储主席鲍威尔即将作证前显得谨慎。投资者对即将公布的证词内容充满期待&#xff0c;以寻求对美联储未来货币政策的更多线索。 鲍威尔即将在国会作证&#xff0c;这是市场关注的焦点事件之一。他的证词可能会对美元汇…

删除有序链表中重复的数字Ⅱ

题目 题目链接 删除有序链表中重复的元素-II_牛客题霸_牛客网 题目描述 代码实现 class Solution { public:/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可** * param head ListNode类 * return ListNode类*/ListNod…

redis缓存与集群

备份 rdb数据快照&#xff0c;内存数据记录到磁盘&#xff0c;故障重启磁盘读取文件 恢复数据 save主进程进行save阻塞其他命令 bgsave fork子进程rdb不影响其他的 fork主进程得到子进程 共享主进程内存数据 fork读取内存数据写入rdb文件 当主进程执行写操作时 拷贝一份数…

vs2022 qt 关于lnk2001和2019同时报错的问题

需要像qt中添加模块&#xff0c;这里&#xff0c;缺少qtopenglwidgets模块

MATLAB的基础二维绘图

1.plot函数 &#xff08;1&#xff09;plot函数的基本用法 plot(x,y)其中&#xff0c;x和y分别用于存储x坐标和y坐标数据&#xff0c;通常x和y为长度相同的向量。 例如&#xff1a; x[2.3,3.3,4.3,1];y[1.3,2,1.8,3]plot(x,y) (2)plot(x,y,选项&#xff09;其中选项包括颜色…

超详细的Scrapy框架的基本使用教程

Scrapy的介绍 scrapy的工作流程&#xff08;重点&#xff01;&#xff01;&#xff01;&#xff09; 如下图所示&#xff1a; 爬虫&#xff1a; 负责向引擎提供要爬取网页的URL&#xff0c;引擎会把这个URL封装成request对象并传递给调度器&#xff0c;把引擎传递过来的resp…

【送书活动1】基于React低代码平台开发:构建高效、灵活的应用新范式

【送书活动1】基于React低代码平台开发&#xff1a;构建高效、灵活的应用新范式 写在最前面一、React与低代码平台的结合优势二、基于React的低代码平台开发挑战三、基于React的低代码平台开发实践四、未来展望《低代码平台开发实践&#xff1a;基于React》编辑推荐内容简介作者…

逻辑代数基础(一)(逻辑符号)

目录 三种基本运算 与运算 或运算 非运算 复合运算 与非运算 或非运算 与或非运算 异或运算 同或运算 逻辑代数的基本定律和常用公式 逻辑代数的基本定律 常量-常量的运算 常量-变量的运算 特殊定律 逻辑代数的常用公式 逻辑函数 逻辑函数的定义 逻辑函数的约束条件 逻…

140.乐理基础-音程的转位

上一个内容&#xff1a;139.乐理基础-一四五八度为何用纯?-CSDN博客 上一个内容里练习的答案&#xff1a; 本次内容并不会感觉到有多大用处&#xff0c;但要牢牢掌握。 音程的转位&#xff1a; 改变音的高低顺序 比如c-e&#xff0c;c低、e高 音程转位&#xff1a;也就是变成…