【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-containerimage: my-imageaffinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: my-labeloperator: Invalues:- 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-containerimage: my-imageaffinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchLabels:app: my-apptopologyKey: 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-containerimage: my-imageresources: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 投票

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

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

相关文章

基于springboot的智慧养老系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容:毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

数学建模学习之简单设备分配问题

简单的设备分配问题 某公司新购置了某种设备 6台,欲分配给下属的4 个企业,已知各企业获得这种设备后年创利润如表 1.1 所示,单位为千万元。问应如何分配这些设备能使年创总利润最大,最大利润是多少? 表1.1的数据为: 对…

Go 微服务开发框架 DMicro 的设计思路

Go 微服务开发框架 DMicro 的设计思路 DMicro 源码地址: Gitee:dmicro: dmicro是一个高效、可扩展且简单易用的微服务框架。包含drpc,dserver等 背景 DMicro 诞生的背景,是因为我写了 10 来年的 PHP,想在公司内部推广 Go, 公司内部的组件及 rpc 协议…

LeetCode 142.环形链表II

142. 环形链表 II - 力扣(LeetCode) /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(NULL) {}* };*/ class Solution { public:ListNode *detectCycle(ListNode …

4.日志分布式-ELK

文章目录 日志分布式-ELK概念可以添加的其它组件filebeat 结合 logstash 带来好处为什么要使用 ELK缓存和Fluentd完整日志系统基本特征ELK 的工作原理 部署Elasticsearchjdk环境和防火墙配置安装Elasticsearch修改配置文件优化内存参数启动程序并测试效果安装 Elasticsearch-he…

leetcode-344. 反转字符串

leetcode-344. 反转字符串 文章目录 leetcode-344. 反转字符串一.题目描述二.第1次提交(std::reverse)三.第2次提交(左右指针)四.第3次提交(左右指针,swap函数)五.第4次提交(左右指针) 一.题目描述 二.第1次提交(std::reverse) class Solution {public:void revers…

Springboot启用HTTP响应压缩

官方文档:https://docs.spring.io/spring-boot/docs/2.3.12.RELEASE/reference/htmlsingle/#how-to-enable-http-response-compression

mmc记录

1、获取csd,也就是DSR寄存器 说是应该可以获取块长度、卡存储容量等,但是在8953上,没看到这个日志 参考: 一、有6个主要的和寄存器 1、OCR寄存器 描述了存储卡的Vdd电压描述 ,总共32Bit Bit31 --- 卡上电状态位&…

赋能智能智造-RK3568智能主板助力机器人产业高速发展

机器人作为现代制造业的重要一环,正在以惊人的速度推动着生产效率和智能化水平的提升,它们在生产线上的准确操作和高效工作,为企业带来了巨大的竞争优势。关于工业机器人的编程和控制技术,在过去几年中已经有了很多发展和新的应用…

计算机网络——物理层

物理层 物理层是计算机网络体系结构中的底层层级,负责处理计算机与物理传输媒介之间的接口和通信细节。它主要关注如何在物理媒介上传输原始比特流,并确保数据能够可靠地从发送方传输到接收方。 物理层的主要任务包括: 传输介质&#xff1a…

谷歌Bard入门指南

文章目录 谷歌Bard入门指南一、简介二、使用指南三、中文化3.1 中文提问3.2 中文回答 四、Hello Game五、亮点 谷歌Bard入门指南 一、简介 Bard 是一个大型语言模型,也称为对话式 AI 或聊天机器人,经过训练,内容丰富且全面。Bard 接受过大量…

无线基站与无线频谱资源

文章目录 基站的主要组成天线馈线(电缆线)RRU(射频拉远单元,Remote Radio Unit)BBU(室内基带处理单元,Building Base band Unit)AAU(有源天线单元,Active Ant…

计算机网络 day3 广播风暴 - VLAN - Trunk

目录 广播风暴: 1.什么是广播风暴? 2.危害: 3.防范 STP生成树协议:(72条消息) 生成树协议 — STP_生成树协议步骤_一下子就醒了的博客-CSDN博客 VLAN: VLAN是什么? VLAN起到的作用: 广…

Python Flask构建微信小程序订餐系统 (六)

🔥 账号管理 🔥 展示账户列表 默认情况下的账户列表布局 查询用户信息 查询 所有用户信息 按照 倒序 的方式查询出来 User.query.order_by( User.uid.desc() ).all() ......@route_account.route("/index") def index():#模版文件夹取名叫 "account/login…

【Python爬虫与数据分析】Jupyter的安装与快捷键

目录 一、jupyter notebook安装与配置 二、命令模式快捷键 三、编辑模式快捷键 四、文件操作 一、jupyter notebook安装与配置 安装:Jupyter Notebook是以网页的形式打开的一个程序,集成在Anaconda包里面,也可以直接安装python3解释器&a…

C#基础学习_泛型集合List<T>

C#基础学习_泛型集合List 为什么要使用集合? 数组元素个数是固定的,数组一旦定义,就无法改变元素总数。如果需求变化,则必须修改源码。 如果初始化元素总数非常大,则会造成浪费。 集合的特点: 根据需要动态增加元素个数,没有限制 List泛型集合的存储结构,与数组类似,…

数据库基本操作-----数据库用户管理和授权

目录 一、数据库用户管理 1.新建用户 2.查看用户信息 3.重命名用户 4.删除用户 ​编辑5.修改当前登录用户密码 6.修改其他用户密码 7.忘记 root 密码的解决办法 (1)修…

window环境下安装Node并修改保存缓存的位置

0, 卸载Node 打开cmd命令行窗口 输入: npm cache clean --force然后在控制面版中卸载node 1,官网下载Node.js 点击官网下载 如一台电脑需要多个node环境 可使用nvm命令进行操作安装并且可以切换 2, 配置环境变量 安装成功之后&#x…

一、Dell服务器的iDRAC管理卡连接

Dell服务器的iDRAC管理卡图文教程 1、网线连接idrac口2、查看idrac地址3、匹配IP地址4、web登录idrac页面5、登录成功页面 带有集成戴尔远程访问控制器 (idrac)的系统具有默认用户名和密码,但您也可以使用安全密码对其进行配置。默认使用web浏…

OpenCV 入门教程:SIFT和SURF特征描述

OpenCV 入门教程: SIFT 和 SURF 特征描述 导语一、SIFT特征描述原理二、SURF特征描述原理三、SIFT特征描述步骤四、SURF特征描述步骤总结 导语 SIFT (尺度不变特征变换)和 SURF (加速稳健特征)是图像处理中常用的特征描…