【K8S基础】-k8s的核心概念控制器和调度器

        Kubernetes是一个开源的容器编排平台,旨在简化和自动化容器化应用程序的部署、扩展和管理。它提供了一个强大的基础设施来管理容器化应用程序的生命周期,并确保它们在整个集群中高效运行。

        Kubernetes的核心概念包括集群、节点、Pod、控制器、调度器等。本文重点讨论控制器和调度器的角色和功能。控制器负责管理应用程序的副本数目和状态,确保应用程序按预期运行。调度器负责将Pod调度到适合的节点上运行,以实现资源的最佳利用和负载均衡。我们将探讨控制器和调度器的工作原理、不同类型的控制器和调度器、它们之间的协作方式以及使用建议。

一、控制器的作用和种类

        在Kubernetes中,控制器是一种用于管理和维护应用程序状态的关键组件。 用于管理和维护应用程序的期望状态。它确保所需的Pod副本数目处于运行状态,并在需要时进行自动伸缩。常见的控制器类型包括ReplicaSet、Deployment、StatefulSet等。它们通过监控和调整Pod的数量和状态,实现应用程序的高可用性和弹性。

1.1 控制器的作用和重要性

        控制器的作用和重要性体现在以下几个方面:

  1. 应用程序可用性和弹性:控制器确保应用程序的副本数目处于运行状态,即使在节点故障或其他问题导致Pod失败的情况下,也能够自动恢复和重新创建Pod。通过监控和调整副本数目,控制器提供了高可用性和弹性,确保应用程序始终可用。

  2. 自动伸缩:控制器可以根据应用程序的负载情况自动调整副本数目。根据预定义的规则和指标,控制器可以增加或减少副本数目,以满足应用程序的需求。这种自动伸缩能力使应用程序能够根据负载变化而弹性地扩展或收缩。

  3. 版本管理和滚动更新:控制器可以管理应用程序的不同版本,并支持滚动更新。通过逐步替换旧版本的Pod,控制器可以确保应用程序在升级过程中保持可用性。这种版本管理和滚动更新的功能使得应用程序的部署和更新变得简单和可控。

  4. 配置管理:控制器可以管理应用程序的配置,包括环境变量、配置文件等。通过控制器,可以在运行时更新应用程序的配置,而无需重新部署整个应用程序。这种配置管理的能力使得应用程序的配置更加灵活和可管理。

  5. 故障检测和恢复:控制器可以监控应用程序的状态,并在发现故障或异常情况时采取相应的措施。它可以自动重启失败的Pod,或在必要时重新调度Pod到其他可用节点上运行。这种故障检测和恢复的能力提高了应用程序的可靠性和容错性。

1.2 常见的控制器类型

        在Kubernetes中,有几种常见的控制器类型,每种类型都有不同的功能和用途。以下是一些常见的控制器类型:

  1. ReplicaSet:ReplicaSet是Kubernetes最基本的控制器类型之一,用于确保指定数量的Pod副本在集群中运行。它可以根据需要自动扩展或缩减Pod的数量,以满足应用程序的需求。

  2. Deployment:Deployment是在ReplicaSet基础上构建的控制器类型,用于管理应用程序的部署和更新。它支持滚动更新,可以逐步替换旧版本的Pod,以实现应用程序的无缝升级。

  3. StatefulSet:StatefulSet用于管理有状态应用程序的部署。与ReplicaSet和Deployment不同,StatefulSet为每个Pod分配唯一的标识符和稳定的网络标识,以便于有状态应用程序的管理和数据持久化。

  4. DaemonSet:DaemonSet用于在集群中的每个节点上运行一个Pod副本。它常用于部署一些系统级别的服务,如日志收集器、监控代理等。

  5. Job和CronJob:Job用于运行一次性任务,而CronJob用于定期运行任务。它们可以确保任务的完成,并可根据需要自动重启失败的任务。

  6. Operator:Operator是一种自定义的控制器,用于管理和自动化特定类型的应用程序或服务。它结合了Kubernetes的原生资源和自定义逻辑,提供了更高级的应用程序管理功能。

1.3 常见控制器特点、用途和适用场景

        以下是一些常见控制器的特点、用途及适用场景的对比:

控制器特点用途适用场景
ReplicaSetReplicaSet用于确保指定数量的Pod副本在集群中运行。它通过监控和调整Pod的副本数目来实现高可用性和弹性。ReplicaSet适用于无状态应用程序,如Web服务器、后端API等。它可以根据负载情况自动扩展或缩减Pod的数量,以满足应用程序的需求。当需要管理和维护一组无状态应用程序的副本时,可以使用ReplicaSet。
DeploymentDeployment是在ReplicaSet基础上构建的控制器类型。它支持滚动更新,可以逐步替换旧版本的Pod,以实现应用程序的无缝升级。Deployment适用于管理应用程序的部署和更新。它提供了版本管理、滚动更新、回滚等功能,使得应用程序的部署和更新变得简单可控。当需要对应用程序进行版本管理和滚动更新时,可以使用Deployment。
StatefulSetStatefulSet用于管理有状态应用程序的部署。它为每个Pod分配唯一的标识符和稳定的网络标识,以便于有状态应用程序的管理和数据持久化。StatefulSet适用于有状态应用程序,如数据库、分布式存储等。它可以确保有状态应用程序的有序部署、扩展和数据持久化。当需要管理有状态应用程序的部署和数据持久化时,可以使用StatefulSet。
DaemonSetDaemonSet用于在集群中的每个节点上运行一个Pod副本。它常用于部署一些系统级别的服务,如日志收集器、监控代理等。DaemonSet适用于需要在每个节点上运行一个副本的服务。它可以确保在每个节点上都有相应的Pod副本,以提供系统级别的功能和服务。当需要在每个节点上运行一个Pod副本的服务时,可以使用DaemonSet。
Job和CronJobJob用于运行一次性任务,而CronJob用于定期运行任务。它们可以确保任务的完成,并可根据需要自动重启失败的任务。Job和CronJob适用于运行一次性或定期任务的场景。它们可以用于批处理作业、定期数据处理等。当需要运行一次性或定期任务时,可以使用Job和CronJob。
OperatorOperator是一种自定义的控制器,用于管理和自动化特定类型的应用程序或服务。它结合了Kubernetes的原生资源和自定义逻辑,提供了更高级的应用程序管理功能。Operator适用于复杂应用程序或服务的管理和自动化。它可以根据特定的业务逻辑和需求,实现自定义的应用程序管理功能。当需要管理和自动化特定类型应用程序或服务的功能时,可以使用Operator。

二、调度器的功能和策略

2.1 调度器的基本功能

        调度器是Kubernetes中的另一个重要概念,用于决定在哪个节点上运行Pod。调度器考虑诸如节点资源利用率、亲和性和反亲和性等因素,选择最合适的节点来运行Pod。调度器的目标是实现资源的均衡分配和高效利用,确保应用程序的性能和可靠性。 它的基本功能有以下几个面:        

  1. 节点选择:调度器从集群中的可用节点中选择最合适的节点来运行Pod。选择的依据可以包括节点的资源可用性(如CPU、内存)、节点的标签和Pod的调度要求等。

  2. 资源分配:调度器根据Pod的资源需求(如CPU和内存)以及节点的资源容量,进行资源分配。它会确保每个节点上运行的Pod的资源需求不超过节点的资源容量。

  3. 亲和性和反亲和性:调度器支持亲和性和反亲和性规则,用于指定Pod与节点之间的关系。亲和性规则可以将Pod调度到与特定节点具有相同标签的节点上,而反亲和性规则可以将Pod调度到与特定节点具有不同标签的节点上。

  4. 互斥性:调度器可以实现Pod之间的互斥性,确保同一时间只有一个Pod运行在特定的节点上。这可以用于避免资源冲突或满足应用程序的特定需求。

  5. 负载均衡:调度器可以实现负载均衡,将Pod均匀地分布在集群的多个节点上,以实现资源的合理利用和提高应用程序的可用性。

  6. 调度策略:调度器支持多种调度策略,如优先级调度、节点亲和性、Pod亲和性、Pod反亲和性、Pod互斥性等。这些策略可以根据应用程序的需求和优先级,对Pod进行灵活的调度。

2.2 调度器的调度策略和算法

        调度器在将Pod调度到集群中的节点上时,使用一系列调度策略和算法来做出决策。这些策略和算法的选择可以根据集群的需求和配置进行调整。下面是一些常见的调度策略和算法:

  1. 优先级调度(Priority Scheduling):优先级调度是一种基于Pod的优先级属性来进行调度的策略。每个Pod都可以指定一个优先级,调度器会优先调度具有较高优先级的Pod。这可以用于确保重要任务的优先执行,或者确保关键应用程序的资源需求得到满足

  2. 节点亲和性(Node Affinity):用于指定Pod与特定节点之间的关系。通过标签选择器和节点选择器,可以将Pod调度到具有特定标签或属性的节点上。这可以用于实现Pod与特定节点的亲和性,例如将某些Pod调度到具有特定硬件设备或特定地理位置的节点上。

  3. Pod亲和性(Pod Affinity):用于指定Pod与其他Pod之间的关系。通过标签选择器和Pod选择器,可以将Pod调度到与其他Pod具有相同标签或属性的节点上。这可以用于实现Pod之间的亲和性,例如将具有相似功能或相互依赖的Pod调度到同一节点上。

  4. Pod反亲和性(Pod Anti-Affinity):用于指定Pod与其他Pod之间的关系的相反情况。通过标签选择器和Pod选择器,可以将Pod调度到与其他Pod具有不同标签或属性的节点上。这可以用于实现Pod之间的分散部署,增加容错性和可用性。

  5. Pod互斥性(Pod Taints and Tolerations):用于确保同一时间只有一个Pod运行在特定的节点上。通过在节点上设置特定的标记(Taint),只有具有相应容忍标记(Toleration)的Pod才能被调度到该节点上。这可以用于避免资源冲突或满足应用程序的特定需求。

  6. 负载均衡(Load Balancing):通过将Pod均匀地分布在集群的多个节点上,实现资源的合理利用和提高应用程序的可用性。调度器可以使用负载均衡算法(如轮询、最少连接等)来选择节点,以确保负载分布均匀。

        以上是一些常见的调度策略和算法。实际上,Kubernetes的调度器还支持自定义的调度策略和算法,可以根据特定的需求和场景进行扩展和定制。调度器的灵活性和可扩展性使得它能够适应各种不同的集群配置和应用程序需求。

三、控制器和调度器的协作

3.1 控制器与调试器的协作方式

        在Kubernetes中,控制器(Controller)和调度器(Scheduler)是两个独立但密切协作的组件,共同负责管理和调度Pod的生命周期。它们之间的关系和协作方式如下:

  1. 控制器的角色:控制器负责监控集群状态,根据用户定义的期望状态来维护和管理Pod的运行状态。它确保集群中的Pod按照用户的期望进行创建、更新和删除,并保持集群的期望状态与实际状态一致。

  2. 调度器的角色:调度器负责将新创建的Pod调度到集群中的合适节点上运行。它根据集群中节点的资源情况、Pod的调度要求和调度策略等因素,做出决策并将Pod分配给合适的节点。

  3. 协作方式:当用户创建一个新的Pod时,控制器会将Pod的定义信息存储在etcd等持久化存储中,并监控集群状态的变化。当控制器检测到新的Pod需要创建时,它会向调度器发送调度请求。

  4. 调度器的决策:调度器接收到调度请求后,会根据集群的状态和调度策略,对Pod进行调度决策。它会考虑节点的资源可用性、亲和性规则、互斥性规则和负载均衡等因素,选择最合适的节点来运行Pod。

  5. 调度器的调度结果:调度器根据调度决策,将Pod与目标节点的绑定关系信息存储在etcd中,并将调度结果返回给控制器。控制器根据调度结果,更新Pod的状态,并通知容器运行时(如Docker)在目标节点上创建和运行Pod的容器。

        通过这种协作方式,控制器和调度器实现了Pod的全生命周期管理。控制器负责维护期望状态和实际状态的一致性,调度器负责将Pod调度到合适的节点上运行。它们共同工作,确保集群中的Pod按照用户的期望和需求进行创建、更新和删除,实现高可用性、资源利用率和应用程序性能的优化。

3.2 控制器与调度器的交互

        在Kubernetes中,控制器(Controller)和调度器(Scheduler)之间通过以下方式进行交互和通信:

  1. API Server:控制器和调度器都通过Kubernetes API Server进行通信。API Server是Kubernetes集群的控制平面组件,它提供了与集群的交互接口。控制器和调度器通过API Server读取和写入集群状态的信息,包括Pod、节点、标签和事件等。

  2. Watch机制:控制器使用Watch机制来监视集群状态的变化。它向API Server发送Watch请求,以获取与其关联的资源(如Pod、节点)的变化通知。当Pod的状态发生变化时,API Server会将相应的事件通知发送给控制器。

  3. 调度请求:当控制器检测到新的Pod需要创建时,它会向调度器发送调度请求。控制器将Pod的定义信息传递给调度器,请求将其调度到合适的节点上运行。调度请求可以包括Pod的资源需求、亲和性规则、互斥性规则和调度策略等信息。

  4. 调度决策:调度器接收到调度请求后,会根据集群的状态和调度策略,做出调度决策。它会考虑节点的资源可用性、亲和性规则、互斥性规则和负载均衡等因素,选择最合适的节点来运行Pod。

  5. 调度结果:调度器根据调度决策,将Pod与目标节点的绑定关系信息存储在etcd等持久化存储中,并将调度结果返回给控制器。控制器根据调度结果,更新Pod的状态,并通知容器运行时在目标节点上创建和运行Pod的容器。

        通过这些交互和通信方式,控制器和调度器实现了协同工作,保证了集群的稳定性、可用性和性能。

四、控制器和调度器的使用建议

4.1 控制器的使用建议

  1. 使用适当的控制器类型:Kubernetes提供了多种类型的控制器,如Deployment、StatefulSet、DaemonSet等。根据应用程序的需求选择适当的控制器类型。例如,使用Deployment来管理无状态应用程序,使用StatefulSet来管理有状态应用程序。

  2. 设置合适的副本数:根据应用程序的负载和可用资源,设置合适的副本数。确保副本数足够满足应用程序的需求,并在需要时进行自动扩展。

  3. 使用滚动更新策略:在更新应用程序时,使用滚动更新策略来逐步替换旧的Pod。这样可以确保应用程序的可用性和稳定性,避免一次性替换导致的应用中断或系统故障。

  4. 监控和处理事件:控制器会生成与Pod和应用程序相关的事件。监控这些事件,并及时处理异常和故障。使用工具如Prometheus、Grafana等来监控控制器的状态和性能。

4.2 调度器的使用建议

  1. 调度策略的定制化:根据集群的需求和应用程序的特性,定制化调度策略。例如,通过标签和亲和性规则来约束Pod的调度位置,使用Pod反亲和性来避免Pod在同一节点上运行。

  2. 资源限制和配额管理:使用资源限制和配额管理来确保集群中的资源被合理分配和使用。调度器可以根据资源需求和限制来进行调度决策,避免节点过载或资源浪费。

  3. 负载均衡:调度器可以通过负载均衡策略来平衡集群中的负载。使用合适的负载均衡策略,将Pod均匀地分布在不同的节点上,避免节点的不均衡和过载。

  4. 节点亲和性和互斥性规则:利用节点亲和性和互斥性规则,将Pod调度到与其相关的节点上。例如,将具有相同标签的Pod调度到同一节点上,或将具有互斥标签的Pod调度到不同的节点上。

  5. 调度器插件的使用:Kubernetes提供了各种调度器插件,如Predicates和Priority Functions等。根据集群的需求和应用程序的特性,使用适当的插件来扩展和定制调度器的功能。

        控制器和调度器的使用涉及多个方面,包括控制器类型选择、副本数设置、滚动更新策略、调度策略定制、资源限制和配额管理等。根据具体的应用场景和需求,可以优化应用程序的部署和管理,提高集群的性能和可用性。

五、性能和可靠性优化

  1. 集群规模和资源管理:合理规划集群的规模和资源分配,确保集群具有足够的计算、存储和网络资源来支持控制器和调度器的正常运行。根据应用程序的需求和预期负载,调整节点数量、节点规格和资源配额,以避免资源瓶颈和过载。

  2. 控制器和调度器的水平扩展:根据集群的负载和性能需求,考虑将控制器和调度器进行水平扩展。通过增加实例数量来分担负载,并使用负载均衡策略将请求均匀地分发给多个实例。这样可以提高系统的吞吐量和并发处理能力。

  3. 监控和日志记录:设置监控和日志记录系统,实时监测控制器和调度器的性能指标和运行状态。使用工具如Prometheus、Grafana等来收集和可视化监控数据,及时发现性能问题和故障,并采取相应的措施进行调整和修复。

  4. 调度器策略的优化:根据应用程序的特性和需求,优化调度器的策略。考虑使用亲和性规则、节点标签、资源限制和优先级等,来确保Pod被调度到合适的节点上。定期评估和调整调度器的策略,以提高资源利用率和负载均衡效果。

  5. 故障恢复和容错机制:实施故障恢复和容错机制,以保证控制器和调度器的可靠性。使用健康检查和自动重启策略,监测和恢复控制器和调度器实例的健康状态。考虑使用备份和冗余机制,确保在单个实例故障时能够无缝切换到备用实例。

  6. 定期更新和升级:保持控制器和调度器的版本更新和升级。新版本通常会修复bug、改进性能和引入新功能。定期进行版本检查,并根据需要进行升级。确保在升级过程中采取适当的备份和回滚策略,以最小化潜在的中断和故障。

  7. 健康检查和自动恢复:为控制器和调度器设置健康检查和自动恢复机制。定期检查控制器和调度器的健康状态,并在发现异常时自动进行恢复。这可以包括重启实例、重新分配任务或启动备用实例等。

        持续监控和调整控制器和调度器的配置是保持系统高性能和可靠性的关键环节。通过实时监控、故障监测、日志记录和分析、自动化告警和通知、定期评估和调整,以及团队的培训和知识共享,可以及时发现和解决问题,优化配置和策略,从而提高控制器和调度器的性能和可靠性。

六、总结

        作为Kubernetes的两个重要组件,控制器和调度器之间具有互补的作用。控制器负责维护Pod的生命周期和应用程序的期望状态,而调度器负责将Pod调度到合适的节点上运行。控制器通过监控集群状态和处理事件,驱动调度器进行调度决策,并确保Pod按照用户的期望进行部署和管理。调度器根据控制器提供的调度请求和集群状态,做出调度决策并将调度结果返回给控制器,以实现Pod的正确分配和运行。

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

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

相关文章

lv13 环境搭建之内核编译 4

一、开发板运行Linux 1. 网线连接开发板和主机 2. ubuntu下拷贝uImage、exynos4412-fs4412.dtb两个文件到/tftpboot目录下cd ~/fs4412cp uImage exynos4412-fs4412.dtb /tftpboot 3. rootfs.tar.xz解压到/opt/4412sudo tar xvf rootfs.tar.xz -C /opt/4412sudo chmod 777 /opt…

软件测试面试八股文——基础篇

5)错误推测法:是基于经验和直觉推测程序中所有可能存在的各种错误,从而有针对性的设计测试用例的方法 6)正交实验法 7)判定表法 8)测试大纲法 3、提交缺陷的八大要素 1)缺陷编号&#xff1a…

2023.12.24 关于 Redis 中 String 类型内部编码和应用场景

目录 String 类型内部编码 3 种内部编码方式 String 类型应用场景 Cache 缓存 键名命名规则 计数(Counter) 共享会话(Session ) 手机验证码 总结 String 类型内部编码 3 种内部编码方式 int:用来表示 64 位 —…

智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于食肉植物算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.食肉植物算法4.实验参数设定5.算法结果6.…

详细学习Java注解Annotation、元注解(通俗易懂,一学就会)

概述 底层原理 自定义注解 示例代码: 1. 2.只有属性名为value的才可以,java对它进行了标识,如果是其他别名如value1是不行的 3.多个属性,必须用键值对形式,不能少写,也不能多写,除非有default修…

嵌入式中一文搞定C语言数据结构--跳表

大家好,今天分享一篇C语言数据结构相关的文章--跳表。 1. 什么是跳表 跳表是 链表 索引 的一种数据结构 ,是以空间换取时间的方式,关于跳表参考: https://baike.baidu.com/item/跳表/22819833?fraladdin 2. 跳表概念 跳表在原有链表的基…

【算法】利用双指针法解决算法题(C++)

文章目录 1. 前言2. 双指针法引入283.移动零 3. 使用双指针法解决算法题1089.复写零202.快乐数11.盛最多水的容器[611.有效三角 形的个数](https://leetcode.cn/problems/valid-triangle-number/description/)LCR179.查找总价格为目标值的两个商品15.三数之和18.四数之和 1. 前…

redis基本用法学习(C#调用StackExchange.Redis操作redis)

StackExchange.Redis是基于C#的高性能通用redis操作客户端,也属于常用的redis客户端之一,本文学习其基本用法。   新建Winform项目,在Nuget包管理器中搜索并安装StackExchange.Redis,如下图所示:   StackExchange.…

开发利器——C语言必备实用第三方库

​ 对于广大C语言开发者来说,缺乏类似C STL和Boost的库会让开发受制于基础库的匮乏,也因此导致了开发效率的骤降。这也使得例如libevent这类事件库(基础组件库)一时间大红大紫。 今天,码哥给大家带来一款基础库&#…

JavaScript进阶(事件+获取元素+操作元素)

目录 事件基础 事件组成 执行事件的步骤 获取元素 根据ID获取元素 根据标签名获取元素 获取ol中的小li 类选择器(html5新增的I9以上支持) 获取body和html 操作元素 innerText和innerHtml 表单标签 样式属性操作 操作元素总结 事件基础 事…

JY901S 9轴姿态角度传感器模块

JY901S 9轴姿态角度传感器模块 JY901S 简介模块特性引脚说明IIC通讯IIC读写寄存器代码示例 JY901S 简介 模块集成高精度的陀螺仪、加速度计、地磁场传感器,采用高性能的微处理器和先进的动力学解算与卡尔曼动态滤波算法,能够快速求解出模块当前的实时运…

基于Python的新能源汽车销量分析与预测系统

温馨提示:文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 基于Python的新能源汽车销量分析与预测系统是一个使用Python编程语言和Flask框架开发的系统。它可以帮助用户分析和预测新能源汽车的销量情况。该系统使用了关系数据库进行数据存储,并…

MATLAB信号处理与应用 读书笔记 一

完成了基本操作,今天组数也正常,需要对应解决fsctrl文件中的信号处理相关 重点关注4傅里叶变换,6FIR滤波器,10信号处理中的应用字符的链接[aa,bb]; N18;N216; n0:N-1;k10:N1-1;k20:N2-1; w2*pi*(0:2047)/2048; Xw(1-…

【并发设计模式】聊聊 基于Copy-on-Write模式下的CopyOnWriteArrayList

在并发编程领域,其实除了使用上一篇中的属性不可变。还有一种方式那就是针对读多写少的场景下。我们可以读不加锁,只针对于写操作进行加锁。本质上就是读写复制。读的直接读取,写的使用写一份数据的拷贝数据,然后进行写入。在将新…

CSS5 | CSS滑动门左扇与右扇图片重叠问题解决

本文中所使用的滑动门背景图片是自己用微软相册手工切的,没用ps,所以凑乎看吧 首先放出一张目标效果也是最终完成图 下面说问题 CSS推拉门原理 按原理来说,就是两个行内块前后站一行,然后前面的a标签和span标签分别是推拉门素材…

TCP 三次握手:四次挥手

TCP 三次握手/四次挥手 TCP 在传输之前会进行三次沟通,一般称为“三次握手”,传完数据断开的时候要进行四次沟通,一般称为“四次挥手”。 数据包说明 源端口号( 16 位):它(连同源主机 IP 地址…

验证码服务使用指南

验证码服务使用指南 1 部署验证码服务 1.1 基础环境 Java 1.8 Maven3.3.9 1.2 安装Redis 参考“Redis安装指南” 1.3 部署验证码服务 1.3.1 下载源码 使用git从远程下载验证码服务代码(开源)。 1.3.2 使用idea打开项目 使用idea打开上一步下载的sailing目录&#xf…

优维产品最佳实践第20期:控制台全链路监控

之前我们会觉得cmdb自动发现没有上报很难排查,弄不清楚数据的上报链路;监控指标的数据断点很难定位,flink对现场来说是一个黑盒子;apm数据更新不及时到底是上报异常还是入库失败呢? 现在控制台集成了对数据链路的监控…

超声系统前端理论与模拟仿真-续

作者:蒋志强 本人同意他人对我的文章引用,但请在引用时注明出处,谢谢.作者:蒋志强 前言 近期整理了一下彩超前端及波束合成相关的内容,很早以前已经有过一次,这次把其它的内容总结一下&#xf…

【数据结构】什么是二叉树?

🦄个人主页:修修修也 🎏所属专栏:数据结构 ⚙️操作环境:Visual Studio 2022 目录 📌二叉树的定义 📌二叉树的特点 📌特殊二叉树 📌二叉树的性质 📌二叉树的存储结构 📌二叉树…