【K8S系列】深入解析K8S调度

序言

做一件事并不难,难的是在于坚持。坚持一下也不难,难的是坚持到底。

文章标记颜色说明:

  • 黄色:重要标题
  • 红色:用来标记结论
  • 绿色:用来标记论点
  • 蓝色:用来标记论点

Kubernetes (k8s) 是一个容器编排平台,允许在容器中运行应用程序和服务。今天学习一下k8s调度相关知识

希望这篇文章能让你不仅有一定的收获,而且可以愉快的学习,如果有什么建议,都可以留言和我交流

 专栏介绍

这是这篇文章所在的专栏,欢迎订阅:【深入解析k8s】专栏

简单介绍一下这个专栏要做的事:

  • 主要是深入解析每个知识点,帮助大家完全掌握k8s,以下是已更新的章节
  • 这是专栏介绍文章地址:【深入解析K8S专栏介绍】

Kubernetes是一个分布式系统,能够管理和编排容器化应用程序。其中,调度(Scheduling)是Kubernetes最重要的功能之一,它能够将容器化的应用程序(即Pod)自动分配到集群中的适当节点上。

在本文中,将详细介绍Kubernetes调度的

  • 工作原理
  • 调度算法
  • 调度器组件
  • 调度示例

1 基础介绍

1.1 什么是k8s调度

Kubernetes调度(Scheduling):是指将未调度的Pod自动分配到集群中的节点的过程

Pod是Kubernetes中最小的可部署单元,它通常包括一个或多个容器。

在Kubernetes中,容器可以在集群中的任何节点上运行,调度器可以根据节点的资源使用情况、Pod的资源需求、亲和性和反亲和性等因素,将Pod分配到最合适的节点上运行。

每个Pod都有一个调度器(Scheduler)负责将其分配到一个可用的节点上。

调度器是Kubernetes集群中的一个核心组件,它监视未调度的Pod对象,并为其选择最佳的节点。

2 Kubernetes调度的工作原理

2.1 原理详解

Kubernetes调度的工作原理可以概括为以下几个步骤:

  1. 创建Pod:用户通过Kubernetes API创建Pod对象,并在其中指定Pod的资源需求、容器镜像等信息。

  2. 调度器监视Pod:Kubernetes调度器监视集群中的未调度Pod对象,并为其选择最佳的节点。

  3. 选择节点:调度器通过算法选择最佳的节点,并将Pod绑定到该节点上。调度器选择节点的依据包括节点的资源使用情况、Pod的资源需求、亲和性和反亲和性等。

  4. 绑定Pod到节点:调度器将Pod和节点之间的绑定信息保存在etcd数据库中,以便节点可以获取Pod的调度信息。

  5. 节点启动Pod节点定期检查etcd数据库中的Pod调度信息,并启动相应的Pod。如果节点故障或资源不足,调度器会重新调度Pod,并将其绑定到其他节点上运行。

 2.2 其他因素

调度器选择节点的过程中,有以下一些因素需要考虑:

  1. 节点资源:调度器需要考虑节点的资源使用情况,如CPU、内存、磁盘等。

  2. Pod资源需求:调度器需要考虑Pod的资源需求,如CPU、内存、磁盘等。

  3. 亲和性和反亲和性:调度器可以根据Pod指定的亲和性和反亲和性规则来选择节点。

  4. 节点污点(Taints)和容忍度(Tolerations:节点可以设置污点,表示节点上不允许运行特定类型的Pod。Pod可以设置容忍度,以容忍节点上的污点。

  5. 节点标签:调度器可以根据节点的标签来选择最佳的节点。

3 调度算法

调度算法是指决定Pod应该调度到哪个节点上的算法。Kubernetes提供了多种调度算法,可以根据实际情况选择合适的算法。以下是Kubernetes常用的调度算法:

  1.  随机算法
  2. 最小负载算法
  3. 贪心算法
  4. 最佳适应算法
  5. 加权最小平均负载算法 

3.1 随机算法 

随机算法是最简单的调度算法之一。

  • 规则:它会随机选择一个可用节点,并将Pod调度到该节点上。
  • 效率:这种算法简单、快速,适用于不需要考虑资源利用率和负载均衡的场景。
  • 缺点:随机算法可能会导致节点资源的不均衡分配和资源浪费。

3.2 最小负载算法 

最小负载算法会选择当前负载最低的节点,并将Pod调度到该节点上

这种算法可以避免节点资源的不均衡分配,但是可能会导致某些节点的资源利用率过高,从而影响其他Pod的运行。

3.2.1 优点 

优点在于可以避免节点资源的不均衡分配和负载过高的问题,从而提高Kubernetes集群的资源利用率和稳定性。同时,最小负载算法可以与其他调度算法结合使用,例如可以与负载均衡算法结合使用,以进一步优化节点的资源利用率和负载均衡。

3.2.2 缺点 

缺点在于可能会导致某些节点的资源利用率过低,从而浪费资源。此外,最小负载算法不能保证Pod被调度到最优的节点上,无法满足一些特殊的需求。

3.3 贪心算法 

贪心算法是一种基于启发式的算法,它尝试在当前状态下找到最优解。

在Pod调度中,贪心算法会尝试选择最优节点,并将Pod调度到该节点上。

贪心算法的核心思想是:在每一步选择中都采取在当前状态下最优的选择,从而希望最终能够得到全局最优解。

优点 

优点在于速度快,可以快速找到局部最优解,适用于大规模的Kubernetes集群。

同时,贪心算法可以与其他调度算法结合使用,例如可以与最小负载算法或最佳适应算法结合使用,以实现更好的负载均衡和资源利用率。

缺点

贪心算法的缺点在于不能保证找到全局最优解,有可能会陷入局部最优解而无法跳出。

此外,贪心算法也可能会导致某些节点的资源利用率过高,从而影响其他Pod的运行。

使用 

在实际使用中,贪心算法可以与其他调度算法结合使用,例如可以与最小负载算法或最佳适应算法结合使用,以实现更好的负载均衡和资源利用率。同时,调度器还可以使用亲和性/反亲和性规则来筛选节点,以进一步优化贪心算法的效果。

3.4 最佳适应算法 

最佳适应算法(Best Fit Algorithm),它会选择当前可用节点中最适合Pod的节点,并将Pod调度到该节点上。

最佳适应算法考虑节点的资源利用率情况,避免将Pod调度到资源利用率不高的节点上,从而实现负载均衡和资源利用率最大化的目的。

优点

最佳适应算法的优点在于可以避免节点资源的不均衡分配和资源浪费,从而提高Kubernetes集群的资源利用率和稳定性。同时,最佳适应算法可以与其他调度算法结合使用,例如可以与贪心算法或最小负载算法结合使用,以进一步优化节点的资源利用率和负载均衡。

缺点

最佳适应算法的缺点在于可能会导致节点资源利用率的不稳定性,从而影响Pod的运行。如果节点资源利用率变化较快,最佳适应算法可能会导致Pod频繁地迁移,从而影响Pod的稳定性和性能。

3.5 加权最小平均负载算法 

加权最小平均负载算法(Weighted Least-Connection Algorithm)是一种调度算法,它会选择当前负载最低且权重最高的节点,并将Pod调度到该节点上。加权最小平均负载算法考虑节点的负载情况和权重,避免将Pod调度到负载过高或权重过低的节点上,从而实现负载均衡和资源利用率最大化的目的。

优点

加权最小平均负载算法的优点在于可以避免节点资源的不均衡分配和负载过高的问题,从而提高Kubernetes集群的资源利用率和稳定性。同时,加权最小平均负载算法可以根据节点的权重分配资源,以满足不同节点的需求。

缺点

加权最小平均负载算法的缺点在于可能会陷入局部最优解而无法跳出。如果节点资源利用率变化较快,加权最小平均负载算法可能会导致Pod频繁地迁移,从而影响Pod的稳定性和性能。

4 调度组件

Kubernetes的调度组件是Kubernetes集群中的一个核心组件,它负责将Pod调度到Kubernetes集群中的节点上,以实现负载均衡和资源利用率最大化的目的。

调度组件通常由以下两个组件组成:

  1. 调度器(Scheduler):负责对新创建的Pod进行调度,选择合适的节点,并将Pod调度到该节点上。调度器会根据节点的资源利用率、亲和性/反亲和性规则、Pod的资源需求等因素来选择节点,并确保Pod能够被成功地调度和运行。

  2. 调度器扩展器(Scheduler Extender):负责对调度器进行扩展,并提供额外的调度策略和规则。调度器扩展器可以通过插件的形式进行扩展,例如可以添加自定义的亲和性/反亲和性规则、节点选择器、调度器过滤器等,以实现更灵活和多样化的调度策略。

调度器实现

Kubernetes还提供了多种调度器实现,包括:

  1. 默认调度器(Default Scheduler):是Kubernetes中的默认调度器,负责对新创建的Pod进行调度,并将Pod调度到合适的节点上。

  2. 自定义调度器(Custom Scheduler):是一种自定义的调度器实现,可以根据实际需求来定义调度策略和规则,以实现更灵活和多样化的调度功能。

  3. 扩展调度器(Extended Scheduler):是一种支持调度器扩展器的调度器实现,可以通过调度器扩展器来添加自定义的调度规则和策略,以实现更灵活和多样化的调度功能。

总之,Kubernetes的调度组件是Kubernetes集群中的一个核心组件,可以实现负载均衡和资源利用率最大化的目的。在实际使用中,需要根据实际情况和需求来选择合适的调度器实现和调度策略,以确保Kubernetes集群的资源利用率最大化。

5 调度示例

5.1 如何实现pod的调度

当我们创建一个Pod时,Pod会被加入到调度器的无调度队列中等待被调度。调度器会定期轮询无调度队列,检查每个Pod的调度需求,然后将它们调度到最适合的节点上。调度器的调度决策是基于节点的资源利用率、Pod的资源需求和亲和性/反亲和性规则等因素。

以下是Pod的调度流程的详细步骤:

  1. 获取Pod的 调度需求
  2. 选择适合的节点
  3. 分配Pod到节点
  4. 保存调度信息
  5. 启动Pod

1 获取Pod的 调度需求

调度器首先获取Pod的调度需求,包括Pod的容器镜像、资源需求和亲和性/反亲和性规则等。

2 选择适合的节点 

调度器会根据Pod的调度需求和集群的资源情况,在可用的节点中选择最适合的一个。调度器会根据节点的资源利用率、Pod的资源需求和亲和性/反亲和性规则等因素来进行选择。如果没有可用的节点满足Pod的需求,Pod就会一直处于等待调度的状态。

3 分配Pod到节点 

调度器会将Pod分配到选择的节点上,并将Pod对象的spec.nodeName字段设置为节点的名称。这样,kubelet就可以知道Pod被分配到了哪个节点上。

4 保存调度信息 

调度器会将Pod和节点之间的绑定信息保存在etcd数据库中。这些信息包括Pod的名称、命名空间、调度时间戳和节点名称等。kube-scheduler会周期性地检查这些绑定信息,以确保Pod已经被分配到了正确的节点上。

5 启动Pod 

当Pod被分配到节点上时,kubelet会从etcd数据库中获取Pod的配置信息,并根据这些信息启动Pod中的容器。容器启动后,Pod就可以开始运行了。

总之,Pod的调度流程是由调度器来完成的。调度器会根据节点的资源利用率、Pod的资源需求和亲和性/反亲和性规则等因素来选择最适合的节点,并将Pod分配到节点上运行。一旦Pod被分配到节点上,kubelet就会从etcd数据库中获取Pod的配置信息,并启动Pod中的容器。

5.2 调度器如何选择最适合的节点?

调度器在选择最适合的节点时,会根据一定的策略和算法进行选择。以下是调度器选择节点的一些主要考虑因素:

  •  资源利用率
  • Pod的资源需求
  • 亲和性和反亲和性规则
  • 节点的标签和注释
  • 节点的负载均衡 

资源利用率 

调度器会检查集群中各个节点的资源使用情况,包括CPU、内存、磁盘和网络等方面的使用情况。调度器会选择资源利用率最低的节点,以确保Pod能够得到足够的资源。

Pod的资源需求 

调度器会检查Pod的资源需求,包括CPU和内存等方面的需求。调度器会选择可以满足Pod资源需求的节点,以避免Pod因为资源不足而无法正常运行。

亲和性和反亲和性规则 

调度器会检查Pod的亲和性和反亲和性规则。亲和性规则指定了Pod应该调度到哪些节点上,而反亲和性规则指定了Pod不应该调度到哪些节点上。调度器会根据这些规则来选择节点,以确保Pod被调度到最合适的节点上。

节点的标签和注释 

调度器会检查节点的标签和注释。节点的标签可以用来标识节点的特性和属性,而注释可以提供节点的附加信息。调度器可以使用这些信息来选择最适合的节点。

节点的负载均衡 

调度器会尝试在集群中平衡负载,避免某个节点过度负载,而其他节点资源利用率太低。调度器会选择负载均衡最优的节点,以确保集群中的资源利用率最大化。

总之,调度器在选择最适合的节点时,会考虑多个因素,包括资源利用率、Pod的资源需求、亲和性和反亲和性规则、节点的标签和注释以及负载均衡等。调度器会使用这些信息来选择最优的节点,以确保Pod被调度到最合适的节点上。

5.3 调度器如何检查Pod的资源需求?

调度器在检查Pod的资源需求时,会查看Pod的定义中

spec.containers[*].resources.requests
spec.containers[*].resources.limits

字段中指定的资源需求和资源限制。

  • resources.requests字段指定了Pod启动时所需的最小资源量。例如,CPU和内存等资源的需求量。如果Pod的实际资源使用量超过了请求量,Kubernetes会杀死该Pod并重新启动。

  • resources.limits字段指定了Pod最大可以使用的资源量。例如,CPU和内存等资源的限制量。如果Pod的实际资源使用量超过了限制量,Kubernetes会限制该Pod的资源使用,并可能导致Pod无法正常运行。

调度器会根据这些资源需求和限制来选择最适合的节点来调度Pod。调度器在选择节点时会考虑节点的资源利用率和Pod的资源需求,以确保Pod可以得到足够的资源来正常运行。

5.2 如何设置Pod的亲和性和反亲和性规则

在Kubernetes中,亲和性(Affinity)和反亲和性(Anti-Affinity)是用来指定Pod和Node之间关系的规则。通过设置亲和性和反亲和性规则,可以让调度器将Pod分配到最合适的节点上。

亲和性规则用于指示Pod应该被调度到哪些节点上,而反亲和性规则用于指示Pod不应该被调度到哪些节点上。下面是如何设置Pod的亲和性和反亲和性规则:

通过标签(Labels)设置亲和性和反亲和性规则 

可以通过标签来设置Pod的亲和性和反亲和性规则。首先,需要在Pod中定义标签选择器(Label Selector),然后使用Node Affinity和Pod Affinity来指定亲和性规则,使用Node Anti-Affinity和Pod Anti-Affinity来指定反亲和性规则。例如,以下是一个使用标签选择器和亲和性规则的Pod定义:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: my-label
            operator: In
            values:
            - my-value

在上面的示例中,Pod选择器使用matchExpressions指定了一个标签选择器,该选择器选择my-label=my-value的节点。然后,使用nodeAffinity指定了一个亲和性规则,该规则要求Pod被调度到拥有该标签的节点上。

通过拓扑域(Topology)设置亲和性和 反亲和性规则

可以使用Topology来指定Pod的亲和性和反亲和性规则。Topology是指节点的拓扑结构,如拓扑域、区域、机架等。使用Topology可以确保Pod被调度到拓扑结构相似的节点上。例如,以下是一个使用Topology和亲和性规则的Pod定义:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchLabels:
            app: my-app
        topologyKey: rack

在上面的示例中,Pod选择器使用matchLabels指定了一个标签选择器,该选择器选择app=my-app的Pod。然后,使用topologyKey指定了一个亲和性规则,该规则要求Pod被调度到与已经调度了app=my-app的Pod在同一个rack中的节点上。

总之,通过设置亲和性和反亲和性规则,可以让调度器将Pod分配到最合适的节点上。可以使用标签或拓扑域来设置Pod的亲和性和反亲和性规则。注意,正确的设置亲和性和反亲和性规则需要了解集群的拓扑结构和资源使用情况,否则可能会导致Pod无法正确调度。

5.2 如何设置Pod的资源限制和请求

在Kubernetes中,可以通过设置Pod的资源限制和请求来控制Pod使用的资源量。资源限制(Resource Limits)指定了Pod最大可以使用的资源量,而资源请求(Resource Requests)则指定了Pod启动时所需的最小资源量。设置Pod的资源限制和请求可以确保Pod在运行时不会使用过多的资源,并且可以提高Pod在集群中的调度成功率。

以下是如何设置Pod的资源限制和请求的示例:

apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: my-container
    image: my-image
    resources:
      limits:
        cpu: "1"
        memory: "500Mi"
      requests:
        cpu: "0.5"
        memory: "250Mi"

在上面的示例中,Pod中的容器my-container设置了资源限制和请求。容器的资源限制是1个CPU核心和500MiB内存,而容器的资源请求是0.5个CPU核心和250MiB内存。

可以通过以下方式设置资源限制和请求:

CPU和内存 

可以使用CPU和内存来设置资源限制和请求。CPU的单位是CPU核心,内存的单位是字节。可以使用以下格式指定CPU和内存:

  • CPU:使用分数或整数表示CPU核心数量。例如,0.5表示一半核心,1表示一个核心,2表示两个核心。
  • 内存:使用字节、千字节、兆字节或吉字节表示内存大小。例如,1Gi表示1个吉字节,500Mi表示500兆字节。

其他资源 

除了CPU和内存之外,还可以使用其他资源来设置资源限制和请求,如GPU、存储等。不同的资源可以使用不同的单位,具体取决于资源类型。可以在Kubernetes文档中查看各种资源类型的详细信息。

总之,设置Pod的资源限制和请求可以控制Pod使用的资源量。可以使用CPU和内存来设置资源限制和请求,也可以使用其他资源类型。在设置资源限制和请求时,需要考虑Pod所需的资源量以及集群的资源使用情况,以避免Pod无法正常运行或影响其他Pod的运行。

6 总结

总之,Kubernetes调度是Kubernetes的核心功能之一,它能够自动将Pod分配到最合适的节点上,并确保Pod在所选节点上正常运行。调度器通过算法选择最佳的节点,并将Pod绑定到该节点上。调度器选择节点的依据包括节点的资源使用情况、Pod的资源需求、亲和性和反亲和性等。管理员可以根据自己的需求选择不同的调度算法,并监视调度器的日志以确保集群的正常运行。 

7 投票

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

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

相关文章

使用docker部署rancher并导入k8s集群

前言:鉴于我已经部署了k8s集群,那就在部署rancher一台用于管理k8s,这是一台单独的虚拟环境,之前在k8s的master节点上进行部署并未成功,有可能端口冲突了,这个问题我并没有深究,如果非要通过修改…

C#使用Chart进行统计,切换不同的图表类型

WindowsForm应用程序中Chart图表控件所属的命名空间: Chart 命名空间: System.Windows.Forms.DataVisualization.Charting 对应的dll路径: C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\Syst…

COT、COT-SC、TOT 大预言模型思考方式||底层逻辑:prompt设定

先讲一下具体缩写的意思 COT-chain of thoughts COT-SC (Self-consistency) Tree of thoughts:Deliberate problem solving with LLM 我理解其实不复杂 1. 最简单的是:直接大白话问一次 (IO) 2. 进阶一点是:思维链,…

PDF转CAD后尺寸如何保持一致?这几种方法可以尝试一下

CAD文件是可编辑的,可以进行修改、添加和删除,这使得在CAD软件中进行编辑更加容易和灵活。这意味着,如果需要对图纸进行修改或者添加新的元素,可以直接在CAD软件中进行操作,而不需要重新制作整个图纸。那么将PDF文件转…

Linux嵌入式项目-智能家居

一、资料下载 二、框架知识 三、MQTT通信协议 1、上位机APP主要工作 1.wait for msg / while(1)订阅等待消息 2.处理消息 客户端创建了两个线程,一个线程用于发布消息,一个线程用于监听订阅消息 (那我的仿真系统也可以啊,一个…

DVDNET A FAST NETWORK FOR DEEP VIDEO DENOISING

DVDNET: A FAST NETWORK FOR DEEP VIDEO DENOISING https://ieeexplore.ieee.org/document/8803136 摘要 现有的最先进视频去噪算法是基于补丁的方法,以往的基于NN的算在其性能上无法与其媲美。但是本文提出NN的视频去噪算法性能要好: 其相比于基于补丁…

Oracle通过函数调用dblink同步表数据方案(全量/增量)

创建对应的包,以方便触发调用 /*包声明*/ CREATE OR REPLACE PACKAGE yjb.pkg_scene_job AS /*创建同步任务*/FUNCTION F_SYNC_DRUG_STOCK RETURN NUMBER;/*同步*/PROCEDURE PRC_SYNC_DRUG_STOCK(RUNJOB VARCHAR2) ; END pkg_scene_job; /*包体*/ CREATE OR REPL…

深入理解netfilter和iptables

目录 Netfilter的设计与实现 内核数据包处理流 netfilter钩子 钩子触发点 NF_HOOK宏与Netfilter裁定 回调函数与优先级 iptables 内核空间模块 xt_table的初始化 ipt_do_table() 复杂度与更新延时 用户态的表,链与规则 conntrack Netfilter(结合iptable…

100种思维模型之安全边际思维模型-92

安全边际, 简而言之即距离某一件糟糕的事件发生,还有多大的空间,安全边际越高,我们就越安全! 安全边际思维模型一个 让生活变得更从容 的 思维模型。 01、何谓安全边际思维模型 一、安全边际思维 安全边际 源于…

ACL 2023 | 持续进化中的语言基础模型

尽管如今的 AI 模型已经具备了理解自然语言的能力,但科研人员并没有停止对模型的不断改善和理论探索。自然语言处理(NLP)领域的技术始终在快速变化和发展当中,酝酿着新的潮流和突破。 NLP 领域的顶级学术会议国际计算语言学年会 …

声网 Agora音视频uniapp插件跑通详解

一、前言 在使用声网SDK做音视频会议开发时, 通过声网官方论坛 了解到,声网是提供uniapp插件的,只是在官方文档中不是很容易找到。 插件地址如下: Agora音视频插件 Agora音视频插件(JS) 本文讲解如何跑通演示示例 二、跑通Demo 2.1 环境安装: 参考: 2. 通过vue-…

vue3+element+sortablejs实现table表格 行列动态拖拽

vue3elementsortablejs实现table动态拖拽 1.第一步我们要安装sortablejs依赖2.在我们需要的组件中引入3.完整代码4.效果 1.第一步我们要安装sortablejs依赖 去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片. npm install so…

巩固一下NodeJs

1、初始化(确保当前电脑有node环境) npm init 2、安装express npm i expressnpm i ws文件结构 3、编写相关代码启动node服务(server.js) //导入下列模块,express搭建服务器,fs用来操作文件、ws用来实现webscoket const express require("expr…

Android 使用webView打开网页可以实现自动播放音频

使用webview 自动播放音视频,场景如,流媒体自动部分,音视频通话等。会出现如下问题: 解决方案如下: 配置webview 如下,这样可以自动播放音频。 webView.getSettings().setMediaPlaybackRequiresUserGestur…

原生JS实现图片裁剪功能

功能介绍:图片通过原生input上传,使用canvas进行图片裁剪。 裁剪框限制不允许超出图片范围,图片限制了最大宽高(自行修改要的尺寸),点击确认获取新的base64图片数据 注:fixed布局不适用该方案&…

在vue中点击弹框给弹框中的表格绑值

场景描述&#xff1a;如下图所示&#xff0c;我们需要点击 ‘账单生成’ 按钮&#xff0c;然后里边要展示一个下图这样的表格。 最主要的是如何展示表格中的内容&#xff0c;一起看看吧&#xff01; <template><!-- 水费 欠费--><el-dialog title"水费欠费…

短视频seo矩阵源码开发与实践分享

在短视频矩阵系统源码开发中&#xff0c;需要注意以下几个细节&#xff1a; 1. 确定系统的功能需求&#xff1a;在开发短视频矩阵系统源码时&#xff0c;必须先明确系统的功能需求&#xff0c;包括用户的基本操作、系统数据的生成和处理等。 2. 定义数据库结构&#xff1a;短…

零售数字化转型如何破局?这篇文章全说清了!

“数字化转型”&#xff0c;一个老生常谈的话题。自19世纪互联网崭露头角&#xff0c;亚马逊和eBay等电商平台崛起&#xff0c;引领电子商务的发展。传统零售业开始意识到在线渠道的重要性&#xff0c;并纷纷推出自己的电子商务网站&#xff0c;从自此进入数字化转型的赛道当中…

利用电价运行策略研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

STM32单片机语音识别台灯控制系统人检测亮度调节

实践制作DIY- GC00156-语音识别台灯控制系统 一、功能说明&#xff1a; 基于STM32单片机设计-语音识别台灯控制系统 二、功能说明&#xff1a; 电路&#xff1a;STM32F103C系列最小系统串口语音识别模块LED灯板1个红外传感器 1.任何时候没有人则关闭灯。有人可以自动打开灯。…