当前位置: 首页 > news >正文

k8s pod调度总结

Kubernetes平台上,我们很少会直接创建一个Pod,在大多数情况下会通过控制器完成对一组Pod副本的创建、调度 及全生命周期的自动控制任务,如:RC、Deployment、DaemonSet、Job 等。

本文主要举例常见的Pod调度。

1

全自动调度

功能:Deployment或RC的主要功能之一就是自动部署一个容器应用的多份副本,以及持续监控副本的数量,在集群内始终维持用户指定的副本数量。

举例:使用配置文件可以创建一个ReplicaSet,这个ReplicaSet会创建3个Nginx应用的Pod:

apiversion: apps/v1kind: Deploymentmetadata:  name: nginx-deploymentspec:  selector:    matchLabels:      app: nginx  replicas: 3  template:    metadata:      labels:        app: nginx      spec:      containers:      - name: nginx        image: nginx:1.7.9        ports:        - containerPort: 80

通过运行 kubectl get rs 和 kubectl get pods 可以查看已创建的ReplicaSet (RS)Pod的信息:

从调度策略上来说,这3个Nginx Pod由系统全自动完成调度。它们各自最终运行在哪个节点上,完全由Master的Scheduler经过一系列算法计算得出,用户无法干预调度过程和结果

2

定向调度

功能:将Pod调度到指定的一些Node上,通过Node的标签(Label)和Pod的nodeSelector属性相匹配。

举例

如果要实现定向调度,首先的第一步就是要为Node节点搭上标签(Label),可以使用kubectl label命令:

kubectl label nodes <node-name><label-key>=<label-value>

这里为k8s-node-1节点打上一个zone=north标签,表明它是“北方”的一个节点:

然后,在Pod的定义中加上nodeSelector的设置,以redis-master- controller.yaml为例:

apiVersion: v1kind: ReplicationControllermetadata:  name: redis-master  labels:    name: redis-masterspec:  replicas: 1  selector:    name: redis-master  template:    metadata:      labels:        name: redis-master    spec:      containers:      - name: master        image: kubeguide/redis-master         ports:        - containerPort: 6379      nodeSelector:        zone: north

运行kubectl create -f命令创建Pod,scheduler就会将该Pod调度到拥有 “zone=north” 标签的Node上。

使用kubectl get pods-o wide命令可以验证Pod所在的Node:

需要注意的是,如果我们指定了Pod的nodeSelector条件,且在集群中不存在包含相应标签的Node,则即使在集群中还有其他可供使用的Node,这个Pod也无法被成功调度。

3

Node亲和性调度

功能:目前有两种节点亲和性表达

表达式

含义

RequiredDuringSchedulingIgnoredDuringExecution

必须满足指定的规则才可以调度Pod到Node上(功能与nodeSelector很像,但是使用的是不同的语法),相当于限制

PreferredDuringSchedulingIgnoredDuringExecution

强调优先满足指定规则,调度器会尝试调度Pod到Node上,但并不强求,相当于软限制

举例

有如下要求:

  • requiredDuringSchedulingIgnoredDuringExecution:要求只运行在amd64的节点上(beta.kubernetes.io/arch In amd64);

  • preferredDuringSchedulingIgnoredDuringExecution:要求尽量运行在磁盘类型为ssd(disk-type In ssd)的节点上;

源文件定义如下:

apiVersion:vlkind:Podmetadata:  name:with-node-affinityspec:  affinity:    nodeAffinity:      requiredDuringSchedulingIgnoredDuringExecution:         nodeSelectorTerms        - matchExpressions:          - key:beta.kubernetes.io/arch             operator:In            values:            - amd64      preferredDuringSchedulingIgnoredDuringExecution:       - weight:1        preference:        matchExpressions:        - key:disk-type           operator:In        values:        - ssd  containers:  - name:with-node-affinity    image:gcr.io/google containers/pause:2.0

从上面的配置中可以看到 In操作符,NodeAffinity语法支持的操作符包括In、NotIn、Exists、DoesNotExist、Gt、Lt。虽然没有节点排斥功能,但是用NotIn 和DoesNotExist就可以实现排斥的功能了

4

亲和性与互斥性调度

功能:亲和性与互斥性可以理解为就是相关联的两种或多种Pod是否可以在同一个拓扑域中共存或者互斥。

举例

首先,创建一个名为pod-flag的Pod,带有标签security=S1和app=nginx,后面的例子将使用pod-flag作为Pod亲和与互斥的目标Pod

apiversion:v1kind:Podmetadata:  name:pod-flag  labels:    security:"S1"    app:"nginx"spec:  containers:  -name:nginx  image:nginx

下面创建第2个Pod来说明Pod的亲和性调度,这里定义的亲和标签是 “security=S1”,对应上面的Pod “pod-flag”,topologyKey的值被设置为 “kubernetes.io/hostname“:

apiVersion:vlkind:Podmetadata:  name:pod-affinityspec:  affinity:    podAffinity:      requiredDuringSchedulingIgnoredDuringExecution:       - labelSelector:        matchExpressions:        - key:security          operator:In          values:          -S1        topologyKey:kubernetes.io/hostname   containers:  - name:with-pod-affinity    image:gcr.io/google_containers/pause:2.0

创建Pod之后,使用kubectl get pods -o wide命令可以看到,这两个Pod在同一个Node上运行。

创建第3个Pod,我们希望它不与目标Pod运行在同一个Node上:

apiversion:v1kind:Podmetadata:  name:anti-affinityspec:  affinity:    podAffinity:      requiredDuringSchedulingIgnoredDuringExecution:       - labelSelector:        matchExpressions:              - key:security                operator:In                values:                -S1              topologyKey:topology.kubernetes.io/zone         podAntiAffinity:          requiredDuringSchedulingIgnoredDuringExecution:           - labelSelector:            matchExpressions:      - key:app        operator:In        values:              -nginx            topologyKey:kubernetes.io/hostname  containers:  - name:anti-affinity    image:gcr.io/google_containers/pause:2.0

这里要求这个新Pod与security=S1的Pod为同一个zone,但是不与app=nginx 的Pod为同一个Node。

创建Pod之后,同样用kubectl get pods -o wide来查看,会看到新的Pod被调度到了同一Zone内的不同Node上。

5

污点与容忍

功能:Taint(污点) 它让Node拒绝Pod的运行。简单地说,被标记为Taint的节点就是存在问题的节点,比 如磁盘要满、资源不足、存在安全隐患要进行升级维护,希望新的Pod不会被调度过来。但被标记为Taint的节点并非故障节点,仍是有效的工作节点,所以仍需将某些Pod调度到这些节点上时,可以通过使用Toleration属性来实现。

举例:TaintToleration一种处理节点并且让Pod进行规避或者驱逐Pod的弹性处理方式,下面列举一些常见的用例。


举例一(独占节点):如果想要拿出一部分节点专门给一些特定应用使用,则可以为节点添加这样Taint:

kubectl taint nodes nodename dedicated=groupName:NoSchedule

然后给这些应用的Pod加入对应的Toleration,这样,带有合适Toleration的Pod就会被允许同使用其他节点一样使用有Taint的节点。


举例二(具有特殊硬件设备的节点):在集群里可能有一小部分节点安装了特殊的硬件设备(如GPU芯片),用户自然会希望把不需要占用这类硬件的Pod排除在外,以确保对这类硬件有需求的Pod能够被顺利调度到这些节点上

可以用下面的命令为节点设置Taint

kubectl taint nodes nodename special=true:NoSchedule kubectl taint nodes nodename special=true:PreferNoSchedule

6

优先级调度

功能:提高资源利用率的常规做法是采用优先级方案,即不同类型的负载对应不同的优先级,同时允许集群中的所有负载所需的资源总量超过集群可提供的资源,在这种情况下,当发生资源不足的情况时,系统可以选择释放一些不重要的负载(优先级最低的),保障最重要的负载能够获取足够的资源稳定运行。

举例

首先,由集群管理员创建PriorityClass(PriorityClass不属于任何命名空间):

apiversion:scheduling.k8s.io/vlbetal kind:Priorityclassmetadata:name:high-priorityva1ue:1000000globalDefault:falsedescription:"This priority class should be used for XYZ service pods only."

上述YAML文件定义了一个名为high-priority的优先级类别,优先级为 100000数字越大,优先级越高,超过一亿的数字被系统保留,用于指派给系统组件。

可以在任意Pod上引用上述Pod优先级类别:

apiVersion: v1kind: Podmetadata:name: nginx labels:env: testspec:containers:-name: nginximage: nginximagePullPolicy: IfNotPresent priorityclassName: high-priority

如果发生了需要抢占的调度,高优先级Pod就可能抢占节点N,并将其低优先级Pod驱逐出节点N,高优先级Pod的status信息中的nominatedNodeName字段会记录目标节点的名称。

需要注意,高优先级Pod仍然无法保证最终被调度到节点N上,在节点N上低优先级Pod被驱逐的过程中,如果有新的节点满足高优先级Pod的需求,就会把它调度到新的Node上。

而如果在等待低优先级的Pod退出的过程中,又出现了优先级更高的Pod,调度器就会调度这个更高优先级的Pod到节点N上,并重新调度之前等待的高优先级Pod。

7

DaemonSet

每个Node上只调度一个pod

功能:DaemonSet是 Kubernetes1.2 版本新增的一种资源对象,用于管理在集群中的每个Node上仅运行一份Pod的副本实例。

举例:下面的例子定义了为在每个Node上都启动一个fluentd容器,配置文件 fluentd-ds.yaml的内容如下 (其中挂载了物理机的两个目录"/var/log"和 “/var/lib/docker/containers”):

apiVersion: apps/v1kind: DaemonSetmetadata:name: fluentd-cloud-logging namespace: kube-system labels:k8s-app: fluentd-cloud-loggingspec:template:metadata:namespace: kube-system labels:k8s-app: fluentd-cloud-loggingspec:containers:-name: fluentd-cloud-loggingimage: gcr.io/google containers/fluentd-elasticsearch:1.17 resources:limits:cpu: 100mmemory: 200Mienv:-name: FLUENTD ARGS value: -qvolumeMounts-name: varlogmountPath: /var/logreadOnly: false-name: containersmountPath: /var/lib/docker/containers readonly: falsevolumes:-name: containershostPath:path: /var/lib/docker/containers -name: varloghostPath:path: /var/log

查看创建好的DaemonSet和Pod,可以看到在每个Node上都创建了一个Pod:

8

批处理调度

功能:批处理任务通常并行(或者串行) 启动多个计算进程去处理一批工作项(Work item),处理完成后,整个批处理任务结束Kubernetes从1.2版本开始支持批处理类型的应用,我们可以通过Kubernetes Job资源对象来定义并启动一个批处理任务。


举例(Job Template Expansion案例):首先是Job Template Expansion模式,由于在这种模式下每个Work item都对应一个Job实例,所以这种模式首先定义一个Job模板,模板里的主要参数是Work item的标识,因为每个Job都处理不同的Work item。

如下所示的Job模板(文件名为job.yaml.txt)中的 $ITEM 可以作为任务项的标识:

apiVersion: batch/v1kind: Jobmetadata:name: process-item-$ITEM labels:jobgroup: jobexamplespec:template:metadata:name: jobexamplelabels:jobgroup: jobexamplespec:containers:-name: cimage: busyboxcommand: ["sh","-c","echo Processing item $ITEM &sleep 5"] restartPolicy: Never

通过下面的操作,生成了3个对应的Job定义文件并创建Job

>for i in apple banana cherry >do>  cat job.yaml.txt | sed "s/\$ITEM/$i/" > ./jobs/job-$i.yaml >done# ls jobsjob-apple.yaml job-banana.yaml job-cherry.yaml # kubectl create -f jobsjob "process-item-apple"created job "process-item-banana"created job "process-item-cherry"created

观察Job的运行情况:

$ kubect1 get jobs -l jobgroup=jobexampleNAME        DESIRED    SUCCESSFUL    AGEprocess-item-apple    1      1      4mprocess-item-banana    1      1      4mprocess-item-cherry    1      1      4m


举例(Queue with Pod Per Work Item案例):在这种模式下需要一个任务队列存放Work item,比如RabbitMQ客户端程序先把要处理的任务变成Work item放入任务队列,然后编写Worker程序、打包镜像并定义成为Job中的Work Pod。

Worker程序的实现逻辑是从任务队列中拉取一个Work item并处理, 在处理完成后结束进程。并行度为2的Demo如下图所示:


举例(Queue with Variable Pod Count案例):由于这种模式下,Worker程序需要知道队列中是否还有等待处理的Work item,如果有就取出来处理,否则就认为所有工作完成并结束进程,所以任务队列通常要采用Redis或者数据库来实现:

9

定时任务

功能:Kubernetes从1.5版本开始增加了一种新类型的Job,即类似Linux Cron的定时任务Cron Job。

举例:比如,我们要每隔1min执行一次任务,则Cron表达式如下

 */1 * * * *

编写一个Cron Job的配置文件(cron.yaml):

apiversion: batch/vl beta kind: CronJobmetadata:name: hellospec:schedule: "*/1 * * * *"jobTemplate:spec:template:spec:containers:-name:helloimage:busyboxargs:-/bin/sh--C-date;echo Hello from the Kubernetes cluster restartPolicy:OnFailure

该例子定义了一个名为helloCron Job,任务每隔1min执行一次,运行的镜像是busybox,运行的命令是Shell脚本,脚本运行时会在控制台输出当前时间和字符串"Hello from the Kubernetes cluster".

然后每隔1min运行kubectl get cronjob hello查看任务状态,发现的确每分钟调度了一次:

运行下面的命令,可以更直观地了解Cron Job定期触发任务执行的历史和现状:

10

容灾调度

功能:我们可以将Pod的各种常规调度策略认为是将整个集群视为一个整体,然后进行 “打散或聚合” 的调度。当我们的集群是为了容灾而建设的跨区域的多中心(多个Zone)集群,即集群中的节点位于不同区域的机房时,比如:

北京、上海、广 州、武汉,要求每个中心的应用相互容灾备份,又能同时提供服务,此时最好的调度策略就是将需要容灾的应用均匀调度到各个中心,当某个中心出现问题时, 又自动调度到其他中心均匀分布,

举例:假如我们的集群被划分为多个Zone,我们有一个应用(对应的Pod标签为 app=foo)需要在每个Zone均匀调度以实现容灾,则可以定义YAML文件如下:

spec: topologySpreadConstraints:  -maxSkew: 1whenUnsatisfiable: DoNotScheduletopologyKey: topology.kubernetes.io/zoneselector:matchLabels:      app: foo

在以上YAML定义中,关键的参数是maxSkew,用于指定Pod在各个Zone上调度时能容忍的最大不均衡数

  • 值越大,表示能接受的不均衡调度越大;

  • 值越小,表示各个Zone的Pod数量分布越均匀。

相关文章:

k8s pod调度总结

在Kubernetes平台上&#xff0c;我们很少会直接创建一个Pod&#xff0c;在大多数情况下会通过控制器完成对一组Pod副本的创建、调度 及全生命周期的自动控制任务&#xff0c;如&#xff1a;RC、Deployment、DaemonSet、Job 等。本文主要举例常见的Pod调度。1全自动调度功能&…...

28个案例问题分析---10---对生产环境的敬畏--生产环境

一&#xff1a;背景介绍 1&#xff1a;上午9:23&#xff0c;老师没有进行上课&#xff0c;但是却又很多的在线人员&#xff0c;并且在线人员的时间也不正确。 2&#xff1a;开发人员及时练习用户&#xff0c;查看用户上课情况。 3&#xff1a;10点整&#xff0c;询问项目组长发…...

视觉SLAM十四讲ch7-1视觉里程计笔记

视觉SLAM十四讲ch7-1 视觉里程计笔记本讲目标从本讲开始&#xff0c;开始介绍SLAM系统的重要算法特征点法ORB特征BRIEF实践特征提取与匹配2D-2D&#xff1a;对极几何八点法求E八点法的讨论从单应矩阵恢复R&#xff0c;t小结三角化![在这里插入图片描述](https://img-blog.csdni…...

模仿评论样式

主要用到了padding-left把左侧的空白给留出来&#xff0c;然后把头像定位到留出的空白位置。行内对齐样式&#xff0c;使用了display:inline-flex;align-items:center;图标本来要用字体比较方便&#xff0c;暂时用的从icon font下载的svg样式写的一塌糊涂&#xff0c;一点也没考…...

xxl-job调度中心、执行器源码详解

文章目录简介调度中心一.程序启动初始化1.初始化入口类2.初始化I18n3.初始化快慢调度线程池4.初始化处理执行器注册或移除线程池更新执行器最新在线的守护线程5.初始化监控任务调度失败或执行失败的守护线程6.初始化处理执行器回调线程池监控任务执行结果丢失的守护线程7.初始化…...

cpp c++summary笔记 复杂类型 “right-left” rule

复杂类型 “right-left” rule 先向右走在向左走&#xff0c;循环往复&#xff0c;右侧的终止为看到右括号&#xff0c;右中括号&#xff0c;左侧为左括号&#xff0c;指针&#xff08;或其他int等&#xff09;。 符号读作*指向AA的指针(总在左侧)[]容纳AA的数组(总在左侧)()返…...

bash编程(马哥)

bash基础特性&#xff1a; 命令行展开&#xff1a;~&#xff0c;{} 命令别名&#xff1a;alias&#xff0c;unalias 命令历史&#xff1a;history 命令和路径补全&#xff1a;$PATH glob通配符&#xff1a;*&#xff0c;?&#xff0c;[]&#xff0c;[^]&#xff0c; 快捷键&am…...

搭建Gerrit环境Ubuntu

搭建Gerrit环境 1.安装apache sudo apt-get install apache2 注意:To run Gerrit behind an Apache server using mod_proxy, enable the necessary Apache2 modules: 执行:sudo a2enmod proxy_http 执行:sudo a2enmod ssl 使新的配置生效&#xff0c;需要执行如下命令:serv…...

朋友去华为面试,轻松拿到26K的Offer,羡慕了......

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…...

springboot项目如何配置启动端口

文章目录0 写在前面1 配置文件(.yaml)--推荐2 配置文件(.properties)3 IDEA配置--不推荐4 写在最后0 写在前面 项目启动需要一个独立的端口&#xff0c;所以在此记录一下。 根据配置文件的后缀书写格式略有不同。 1 配置文件(.yaml)–推荐 若是.yaml后缀的配置文件&#xff0…...

IOS - 抓包通杀篇

IOS中大多数情况&#xff0c;开发者都会使用OC提供的api函数&#xff0c;CFNetworkCopySystemProxySettings来进行代理检测&#xff1b; CFNetworkCopySystemProxySettings 检测函数直接会检测这些ip和端口等&#xff1a; 采用直接附加页面进程&#xff1a; frida -UF -l 通…...

盒子模型的简介

盒子的组成 一个盒子由外到内可以分成四个部分&#xff1a;margin&#xff08;外边距&#xff09;、border&#xff08;边框&#xff09;、padding&#xff08;内边距&#xff09;、content&#xff08;内容&#xff09;。会发现margin、border、padding是css属性&#xff0c;因…...

Kubernetes 101,第二部分,pod

在上一篇文章中,我们了解了Kubernetes 的基础知识以及对其主要架构的介绍。 介绍完毕后,就该探索如何在 Kubernetes 中运行应用程序了。 容器包装器 在 Kubernetes 中,我们无法直接创建单个容器。相反,为了更好,我们可以将容器包装成一个单元,其中包括: 规范:多个容器可…...

protobuf序列化解码原理

Protobuf的编码方式 Varints是一种紧凑表示数字的办法。他用一个或者多个字节表示一个数字&#xff0c;值越小的数字节节数越少。相对与传统的用4字节表示int32类型的数字&#xff0c;Varints对于小于128的数值都可以用一个字节表示&#xff0c;大于128的数值会用更多的字节来表…...

OpenCV——line、circle、rectangle、ellipse、polylines函数的使用和绘制文本putText函数以及绘制中文的方法。

学习OpenCV的过程中&#xff0c;画图是不可避免的&#xff0c;本篇文章旨在介绍OpenCV中与画图相关的基础函数。 1、画线条——line()函数 介绍&#xff1a; cv2.line(image, start_point, end_point, color, thickness)参数&#xff1a; image: 图像start_point&#xff1a…...

性能平台数据提速之路

作者 | 性能中台团队 导读 性能平台负责MEG所有研发数据的管理、接入、传输、应用等各个环节。数据的提速对于公司报表建设、决策分析、转化策略效果都有至关重要的影响。重点介绍数据生产端与消费端提速落地实践&#xff0c;如何高性价比满足大数据生产端提速&#xff1f;如何…...

Dns域名解析服务器

前言 域名解析服务器的介绍 域名服务器的类型划分 DNS域名解析的过程 为什么需要DNS解析域名为IP地址&#xff1f; 通俗理解Dns DNS劫持 DNS污染 Dns面试经验 前言 DNS是一个应用层协议&#xff0c;用来获取域名对应的IP地址 域名解析服务器的介绍 DNS&#xff08;Dom…...

关于 JavaScript 中的 Promises

在 JavaScript 中&#xff0c;Promise 是一个对象&#xff0c;它表示一个可能还不可用&#xff0c;但会在未来解决的值。Promises 用于处理异步操作&#xff0c;例如发出网络请求或访问数据库&#xff0c;其中结果不是立即可用的。如果你准备好了&#xff0c;我想开始我们的冒险…...

PMP考前冲刺题——错题集

3、 [多选] 采购部门需要向全球不同的供应商采购项目所需的各种商品&#xff0c;所有采购订单均己发送给供应商并已按要求处理。项目经理后来收到客户提出的变更请求。由于项目经理未及时通知采购部门&#xff0c;运抵的所有物品都是按原来的需求所提供。 项目经理本应做什么来…...

【C++】30h速成C++从入门到精通(多态)

多态的概念多态&#xff1a;通俗来说就是多种心态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态。多态的定义及实现多态的构成条件多态是在不同继承关系的类对象&#xff0c;去调用同意函数&#xff0c;产生了不同的行为&#xff0…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

基于FPGA的PID算法学习———实现PID比例控制算法

基于FPGA的PID算法学习 前言一、PID算法分析二、PID仿真分析1. PID代码2.PI代码3.P代码4.顶层5.测试文件6.仿真波形 总结 前言 学习内容&#xff1a;参考网站&#xff1a; PID算法控制 PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

Admin.Net中的消息通信SignalR解释

定义集线器接口 IOnlineUserHub public interface IOnlineUserHub {/// 在线用户列表Task OnlineUserList(OnlineUserList context);/// 强制下线Task ForceOffline(object context);/// 发布站内消息Task PublicNotice(SysNotice context);/// 接收消息Task ReceiveMessage(…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案

问题描述&#xff1a;iview使用table 中type: "index",分页之后 &#xff0c;索引还是从1开始&#xff0c;试过绑定后台返回数据的id, 这种方法可行&#xff0c;就是后台返回数据的每个页面id都不完全是按照从1开始的升序&#xff0c;因此百度了下&#xff0c;找到了…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...