集群的调度和策略

news2024/9/23 15:29:49

集群的调度:

怎么把pod部署到节点的方法。

调度的过程:

scheduler是集群的调度器,主要任务就是把pod部署到节点上。

自动调度:

1、公平,保证每个可用的节点都可以部署pod

2、资源的高效利用,集群当中的资源可以被最大化的使用

3、效率,调度的性能要好,能够对大批量的pod完成调度的工作。

4、灵活(自定义),用户需要根据自己的需求进行控制,可以满足。

调度约束机制:

list-watch机制进行每个组件的协作,保持数据同步,组件之间的解耦。

list-watch

watch----k8s当中的监听

get-------获取资源

apiserver和组件之间的watch机制

调度过程:

1、预算策略 先对节点的条件进行过滤

pod的资源适应性:节点上是否有资源能够满足pod请求的资源

pod的主机适应性:如果指定了节点,检查集群当中是否有满足要求的节点可供部署

pod的主机端口适应性:检查节点上使用的端口是否与pod请求的端口冲突

pod与主机磁盘的适应性:每个pod之间的挂载卷不能冲突

如果预算条件不满足,pod会进入pending状态

2、优先策略 根据过滤出来的节点选择和最优的节点

最低请求优先级:通过计算节点上cpu和内存的使用率,确定节点的权重。使用率越低权重越大,越会被选中作为部署节点

倾向于选择资源利用率占用较少的节点

平衡资源分配:cpu和内存的使用率,确定节点权重。cpu和内存之间的比率,使用率的比率。

A 50% 50% 1:1

B 10% 20% 1:2

这两个节点会选择A节点

镜像本地性优先级:如果节点上在本地已经有了需要的镜像,分配的概率更大。

用户定制节点部署:

1、强制性节点调度:

nodeName强制性的选择一个节点,不再需要调度器和算法了。之间部署即可。

[root@master01 k8s-yaml]# vim test3.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      nodeName: node01
[root@master01 k8s-yaml]# kubectl apply -f test3.yaml 
deployment.apps/nginx1 configured
​
[root@master01 k8s-yaml]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx1-95bf57c7f-4j2zn   1/1     Running   0          70s   10.244.1.12   node01   <none>           <none>
nginx1-95bf57c7f-m5r5q   1/1     Running   0          69s   10.244.1.13   node01   <none>           <none>
nginx1-95bf57c7f-rqjkt   1/1     Running   0          71s   10.244.1.11   node01   <none>           <none>

2、根据节点的标签来进行部署,匹配机制,只要标签匹配都可以部署。

问题:标签选择节点是否需要调度器和算法?

标签选择器是需要调度器和算法来进行分配的。

查看节点的标签:

kubectl get node --show-labels

标签的格式是键值对

一个节点可以有多个标签,每个以逗号隔开。

增加标签:
[root@master01 k8s-yaml]# kubectl label nodes node01 test1=a
修改标签:
[root@master01 k8s-yaml]# kubectl label nodes node01 test1=b --overwrite 
删除标签:
[root@master01 k8s-yaml]# kubectl label nodes node01 test2-

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      nodeSelector:
        test2: b

3、亲和性:

节点亲和性 node Affinity

pod亲和性 pod Affinity

软策略和硬策略:
#软策略
preferredDuringSchedulingIgnoredDuringExecution 

软策略:在选择节点的时候,尽量的满足部署的条件,非条件也可以部署。

#硬策略
requiredDuringSchedulingIgnoredDuringExecution

硬策略:必须满足指定节点的条件,否则pending

根据节点标签和pod的标签来进行选择:

键值的运算关系:

1、In 在 匹配 =

2、NotIn 不在 不等于,逻辑非

3、Gt 大于

4、Lt 小于

5、Exists 存在

6、DoesNotExist 不存在

节点标签的情况:
[root@master01 k8s-yaml]# kubectl get nodes --show-labels 
NAME       STATUS   ROLES                  AGE   VERSION    LABELS
master01   Ready    control-plane,master   21h   v1.20.15   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master01,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=
node01     Ready    <none>                 21h   v1.20.15   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux,test1=a,test2=b,test3=a
node02     Ready    <none>                 21h   v1.20.15   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux,test2=b

硬策略
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      affinity:
#选择亲和性的字段
        nodeAffinity:
#节点亲和性
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: test3
                operator: In
                values:
                - a
#节点亲和性的硬策略,表示必须选择带有标签的值是test3=a
​
[root@master01 k8s-yaml]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx1-5ccd456747-6zm5p   1/1     Running   0          98s   10.244.1.16   node01   <none>           <none>
nginx1-5ccd456747-mtvkn   1/1     Running   0          18s   10.244.1.18   node01   <none>           <none>
nginx1-5ccd456747-vnvl7   1/1     Running   0          19s   10.244.1.17   node01   <none>           <none>

问题:

1、条件不满足肯定pending

2、条件满足,调度器即刻生效

3、需要调度器分配,不同节点可以有相同的标签。需要调度器分配。

软策略
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      affinity:
​
        nodeAffinity:
​
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: test3
                operator: NotIn
                values:
                - a
#节点亲和性的软策略,希望部署到不包含test3=a的标签节点。
​
[root@master01 k8s-yaml]# kubectl get pod -o wide
NAME                     READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx1-77f4d4fb7-8f462   1/1     Running   0          7s    10.244.2.21   node02   <none>           <none>
nginx1-77f4d4fb7-dtc8h   1/1     Running   0          7s    10.244.1.19   node01   <none>           <none>
nginx1-77f4d4fb7-dw4gz   1/1     Running   0          7s    10.244.2.22   node02   <none>           <none>
​
多个软策略
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      affinity:
#选择亲和性的字段
        nodeAffinity:
#节点亲和性
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            preference:
              matchExpressions:
              - key: test3
                operator: NotIn
                values:
                - a
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 2
            preference:
              matchExpressions:
              - key: test3
                operator: In
                values:
                - a
#多个软策略已权重来进行分配,权重高的,优先级大。
#节点亲和性的软策略,希望部署到不包含test3=a的标签节点。

如果已经有了硬策略,一般不需要声明软策略。

pod亲和性:

topologkey 定义节点的拓扑域,用来反映pod和节点之间的关系。

硬连接:
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      affinity:
        podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
           #根据标签镜像选择
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx1
            topologyKey: test1
#匹配的pod的标签是app=nginx1,且节点上包含标签名是test1   
软连接:
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      affinity:
        podAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
           #根据标签镜像选择
                matchExpressions:
                - key: app
                  operator: In
                  values:                  - nginx1
              topologyKey: test1
​

4、反亲和性:

pod反亲和性 pod Anti-Affinity

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx2
  name: nginx2
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx2
  template:
    metadata:
      labels:
        app: nginx2
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
           #根据标签镜像选择
              matchExpressions:
              - key: app
                operator: In
                values:
                - nginx1
            topologyKey: test2
#只能部署在pod的标签不是app=nginx1且节点的标签名不能有test2
#其实在pod的亲和性当中,起决定作用的是拓扑域的标签。
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
      affinity:
        podAntiAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
           #根据标签镜像选择
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - nginx1
              topologyKey: test2

软策略:倾向性,尽可能的满足条件————更多的,尽量把资源调度到需要的节点

硬策略:必须要满足条件。————特殊情况,节点故障,但是有业务要更新,强制性的把资源调度到指定的节点。

作业:

1、实现pod的探针:

就绪探针

tcpScoket

2、挂载,容器/usr/share/nginx/html/

节点 /opt/html

3、node的亲和性 尽量部署在node01

4、pod的亲和性,尽量部署在包含有app=nginx的pod且标签名是xy102的节点

5、软策略选择标签名不包含xy102, 值小于100

[root@master01 k8s-yaml]# kubectl get nodes --show-labels 
NAME       STATUS   ROLES                  AGE   VERSION    LABELS
master01   Ready    control-plane,master   24h   v1.20.15   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=master01,kubernetes.io/os=linux,node-role.kubernetes.io/control-plane=,node-role.kubernetes.io/master=
node01     Ready    <none>                 24h   v1.20.15   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node01,kubernetes.io/os=linux,test1=a,xy102=500
node02     Ready    <none>                 24h   v1.20.15   beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/arch=amd64,kubernetes.io/hostname=node02,kubernetes.io/os=linux,xy102=50
apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx1
  name: nginx1
spec:
  replicas: 10
  selector:
    matchLabels:
      app: nginx1
  template:
    metadata:
      labels:
        app: nginx1
    spec:
      containers:
      - name: nginx
        image: nginx:1.22
        readinessProbe:
          tcpSocket:
            port: 80
        volumeMounts:
        - name: data-v
          mountPath: /usr/share/nginx/html/
      affinity:
        nodeAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 2
            preference:
              matchExpressions:
              - key: test1
                operator: In
                values:
                - a
          - weight: 3
            preference:
              matchExpressions:
              - key: xy102
                operator: Lt
                values:
                - "100"
        podAffinity:
          preferredDuringSchedulingIgnoredDuringExecution:
          - weight: 1
            podAffinityTerm:
              labelSelector:
                matchExpressions:
                - key: app
                  operator: In
                  values:
                  - nginx
              topologyKey: xy102
      volumes:
      - name: data-v
        hostPath:
          path: /opt/html
          type: DirectoryOrCreate
​
[root@master01 k8s-yaml]# kubectl get pod -o wide
NAME                      READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
nginx1-5d9d5b56db-8bkq4   1/1     Running   0          32s   10.244.2.80   node02   <none>           <none>
nginx1-5d9d5b56db-8jwcn   1/1     Running   0          32s   10.244.2.85   node02   <none>           <none>
nginx1-5d9d5b56db-g7flw   1/1     Running   0          32s   10.244.2.81   node02   <none>           <none>
nginx1-5d9d5b56db-jd8kk   1/1     Running   0          32s   10.244.2.82   node02   <none>           <none>
nginx1-5d9d5b56db-jwthk   1/1     Running   0          32s   10.244.1.64   node01   <none>           <none>
nginx1-5d9d5b56db-mh5w7   1/1     Running   0          32s   10.244.1.66   node01   <none>           <none>
nginx1-5d9d5b56db-p62sc   1/1     Running   0          32s   10.244.2.84   node02   <none>           <none>
nginx1-5d9d5b56db-pj6zz   1/1     Running   0          32s   10.244.1.67   node01   <none>           <none>
nginx1-5d9d5b56db-rlm86   1/1     Running   0          32s   10.244.1.65   node01   <none>           <none>
nginx1-5d9d5b56db-zk7bj   1/1     Running   0          32s   10.244.2.83   node02   <none>           <none>
​

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

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

相关文章

C/C++内存详解

欢迎来到 破晓的历程的 博客 ⛺️不负时光&#xff0c;不负己✈️ 文章目录 C/C内存模型C语言动态内存管理mallocrealloccallocfree C动态内存申请new 操作符delete 操作符注意事项用法示例 operator new和operator delete函数内存泄露 C/C内存模型 让我们先来看看这段代码&a…

四、SPI——2、NOR FLASH

一、NOR FLASH介绍 FLASH是常用的用于储存数据的半导体器件&#xff0c;它具有容量大&#xff0c;可重复擦写、按“扇区/块”擦除、掉电后数据可继续保存的特性。 FLASH是有一个物理特性&#xff1a;只能写0&#xff0c;不能写1&#xff0c;写1靠擦除。 FLASH主要有NOR Flash和…

【JavaEE初阶】JVM内存划分和类加载过程以及垃圾回收

目录 &#x1f332;内存划分 &#x1f6a9;堆&#xff08;线程共享&#xff09; &#x1f6a9;栈 &#x1f6a9;元数据区 &#x1f343;类加载过程 &#x1f6a9;双亲委派模型 &#x1f384;垃圾回收机制&#xff08;GC&#xff09; &#x1f6a9;找到谁是垃圾(不被继续…

纷享销客CRM渠道分销之多维度数据分析介绍

预设渠道报表驾驶舱 基于渠道分销场景&#xff0c;系统预设了一个全面的渠道订货数据驾驶舱&#xff0c;旨在通过直观的数据分析&#xff0c;为企业提供深度的市场洞察和业务决策支持。该驾驶舱提供渠道订货的概览&#xff0c;快速把握整体订货动态。 渠道订货波动分析&#…

Scratch 角色绘制

引言 在Scratch这款强大的可视化编程环境中&#xff0c;不仅可以通过编程来实现各种有趣的互动项目&#xff0c;还能利用内置的绘图编辑器来创造独一无二的角色。本文将引导你如何使用Scratch中的绘图编辑器&#xff0c;绘制出属于你自己的简单图形角色。 准备工作 首先&#…

【数据分享】2000—2023年我国250米分辨率逐月植被覆盖度(FVC)栅格数据

植被覆盖度&#xff08;Fractional Vegetation Cover&#xff0c;简称FVC&#xff09;是指植被&#xff08;包括叶、枝、茎&#xff09;在水平地面的垂直投影面积占研究区总面积的百分比。植被覆盖度是生态学、地理学、气候学等多个学科研究的基础数据&#xff0c;对于理解生态…

多线程——创建

线程的创建与启动 Java中&#xff0c;所有的线程对象都必须是Thread类或其子类的实例。 三种创建方式&#xff1a; 集成Thread类创建线程类 继承Thread类&#xff0c;重写run方法&#xff0c;run方法的方法体代表线程需要完成的任务&#xff0c;称为线程执行体。 创建子类的实…

鸿蒙开发5.0【Code Linter实现代码检查】

Code Linter针对ArkTS/TS代码进行最佳实践/编程规范方面的检查。 检查方法&#xff1a; 编辑器自带Code Linter。 在已打开的代码编辑器窗口单击右键点击Code Linter&#xff0c;或在工程管理窗口中鼠标选中单个或多个工程文件/目录&#xff0c;右键选择Code Linter执行代码检…

2024年医疗器械企业5款CRM系统对比评测

医疗器械行业是一个多学科交叉、知识密集型、资金密集型的高新技术产业&#xff0c;进入门槛较高&#xff0c;产品种类繁多&#xff0c;技术含量较高。 随着医改的深入推进&#xff0c;医疗器械集采常态化成为行业新常态&#xff0c;中国的医疗器械行业不仅面临着巨大的市场潜…

zabbix6.4配置监控k8s 1.28集群

zabbix6.4配置监控rke2 rancher k8s集群 1. 说明1.1 为什么要使用zabbix6.x监控k8s1.2 部署环境1.3 部署前的一些问题 2. 使用helm3部署zabbix proxy和zabbix agent2.1 添加仓库2.2 修改配置2.3 部署2.4 确认部署情况 3. 在zabbix web页面配置连接zabbix proxy3.1 添加Proxy代理…

kali (linux) 配置windows远程桌面(mstsc.exe)连接

Kali 安装 tightvncserver 一、软件说明 1) tightvncserver是一个轻量级&#xff0c;只能建立桌面&#xff0c;不能查看TTY7/TTY1正在显示的桌面,但x11vnc可以&#xff0c;相比x11vnc安全传输差一些。反之&#xff0c;x11 vnc:安全传输较好&#xff0c;但占用资源比 tightvncs…

PB级内存计算项目实战-富华保险

一、保险项目的基本介绍 项目名称:富华阳光人寿保险 1. 行业背景介绍 在保险行业中,最为核心技术就是精算,精算简单来说就是根据人的年龄来计算应交保费问题,通过精算,让整个保险行业更加专业化,精细化 从而取代之间依靠经验判断的方式 精算到目前为止,并不仅仅计算保费,主要包…

Leetcode 1143. 最长公共子序列 记忆化搜索 优化 C++实现

Leetcode 1143. 最长公共子序列 问题&#xff1a;给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长公共子序列的长度。如果不存在公共子序列&#xff0c;返回 0 。 一个字符串的 子序列 是指这样一个新的字符串&#xff1a;它是由原字符串在不改变字符的相对…

一体化智能电动窗帘:开启智能生活新时尚

史新华 在科技不断进步的今天&#xff0c;人们对生活品质的追求也越来越高。电动窗帘作为智能家居的重要组成部分&#xff0c;以其便捷、智能、时尚的特点&#xff0c;正逐渐走进千家万户。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 一、电动窗帘…

KEYSIGHT U2020 X系列 USB峰值和均值功率传感器

​ _是德(KEYSIGHT) _ U2020 X系列 USB峰值和均值功率传感器 苏州新利通仪器仪表 U2020 X 系列功率传感器得到 Keysight BenchVue 软件的支持。使用 BenchVue 软件&#xff0c;您无需编程便可轻松控制功率计记录数据&#xff0c;并以各种形式显示测量结果。 只需将传感器…

AI大模型与量子纠缠理论的结合,以及相关应用思考

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下AI大模型与量子纠缠理论的结合&#xff0c;以及相关应用思考。将大模型&#xff08;LLM&#xff09;的基本原理与量子纠缠理论相结合是一个高度抽象的概念。我们首先需要理解这两个领域的基本原理&#xff0c;然后探…

#ARM开发 笔记

课程介绍 ARM开发 --> Linux移植 --> 驱动开发 前后联系&#xff1a;ARM和系统移植为驱动开发学习做准备工作 所需知识&#xff1a;C语言基础及STM32需要的硬件知识 学习方法 学习流程、思想和解决问题的方法即可 知道驱动的基本框架以及基本开发要求 底层课程导学 接口技…

NTFS安全权限和文件共享

一.常见文件系统 NTFS 描述&#xff1a; Windows最常使用的文件系统&#xff08;New Technology File System&#xff09;微软公司开发的一种专用于 Windows 操作系统的文件系统。 特点&#xff1a; 效率性 可以提高磁盘的读写性能&#xff1b; 可靠性 加密文件系统访问控制列…

Vue组件:使用Prop实现父组件向子组件传递数据

1、Prop 基本用法 由于组件实例的作用域是孤立的&#xff0c;因此子组件的模板无法直接应用父组件的数据。如果想要通过父组件向子组件传递数据&#xff0c;就需要定义 Prop。Prop 是父组件用来传递数据的一个自定义属性&#xff0c;这样的属性需要定义在组件选项对象的 props…

并发集合(二):CopyOnWriteArrayList

1、CopyOnWriteArrayList介绍 CopyOnWriteArrayList 是一个线程安全的ArrayList。 CopyOnWriteArrayList 是基于Lock锁和线程副本的形式来保证线程安全的&#xff0c; 在写数据时&#xff0c;先获取Lock锁&#xff0c;然后复制一个副本&#xff0c;添加数据时&…