OCP的operator——(2)OLM

文章目录

  • 了解Operator
    • Operator Lifecycle Manager(OLM)
      • OLM概念和资源
        • OLM是什么
        • OLM资源
          • Cluster service version(CSV)
          • Catalog source
            • 定制catalog source的image模板
            • 目录健康需求
          • Subscription
          • Install plan
          • Operator group
          • Operator condition
      • OLM架构
        • 组件职责
        • OLM Operator
        • Catalog Operator
        • Catalog Registry
      • OLM工作流
        • OLM中的Operator安装和升级工作流
          • 升级路径示例
          • 跳过升级
          • 替换多个Operator
          • Z-stream支持
      • OLM依赖项解析
      • Operator组
      • Multitenancy和Operator共置(colocation)
      • Operator状况
      • OLM指标
      • OLM中的webhook管理
  • 参考

了解Operator

Operator Lifecycle Manager(OLM)

OLM概念和资源

OLM是什么

Operator Lifecycle Manager(OLM)帮助用户安装、更新和管理Kubernetes原生应用(Operator)以及跨OCP集群运行的关联服务的生命周期。它是Operator Framework的一部分,是一个开源工具包,以高效、自动化、且可扩展的方式管理Operator。

在这里插入图片描述

OLM默认在OCP 4.14中运行,帮助集群管理员Operator进行安装、升级和授权。OCP web console提供了管理界面,供集群管理员安装Operator,以及为项目授权以便使用集群上可用的Operator目录。

开发人员通过自助服务体验,无需成为相关的专家也可provision和配置数据库实例、监控、大数据服务,因为Operator已将相关知识融入其中。

OLM资源

以下CRD由OLM定义和管理:

资源短名称描述
ClusterServiceVersion(CSV)csv应用元数据。例如:名称、版本、图标、所需资源。
CatalogSourcecatsrc定义应用的CSV、CRD和package存储库。
Subscriptionsub通过追踪package中的频道来保持CSV更新。
InstallPlanip为自动安装或升级CSV而需创建的资源的计算列表。
OperatorGroupog将部署在同一namespace中的所有Operator配置为 OperatorGroup 对象,以便在一系列namespace或集群范围内监视其CR。
OperatorConditions-在OLM和它管理的Operator之间创建通信频道。Operator可以写入 Status.Conditions 数组,以向OLM通报复杂状态。
Cluster service version(CSV)

CSV代表OCP集群中运行的Operator的一个特定版本。它是一个由Operator元数据所创建的YAML manifest,辅助OLM在集群中运行Operator。

OLM需要Operator的元数据,以确保它可以在集群中安全运行,并在发布Operator的新版本时提供如何做升级的信息。这和传统操作系统的软件打包相似。可将OLM的打包步骤看作是制作 rpmdebapk bundle的阶段。

CSV中包含Operator容器image附带的元数据,用于在用户界面填充名称、版本、描述、label、存储库链接、logo等信息。

CSV也是运行Operator所需的技术信息源,例如其管理或依赖哪些CR、RBAC规则、集群需求、安装策略。这些信息告诉OLM如何创建所需的资源并将Operator作为deployment来建立。

Catalog source

Catalog source代表元数据存储,通常是引用容器registry中存储的 index image 。OLM查询catalog source来发现和安装Operator及其依赖项。OCP web console中的OperatorHub也会显示由catalog source provision的Operator。

注意:集群管理员可以使用web console中的Administration -> Cluster Settings -> Configuration -> OperatorHub页面查看集群中已启用的catalog source所提供的Operator的完整列表。

CatalogSource 对象的 spec 指明了如何构造pod,或者是如何与服务于Operator Registry gRPC API的服务进行通信。

apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:generation: 1name: example-catalog # 1namespace: openshift-marketplace # 2annotations:olm.catalogImageTemplate: # 3"quay.io/example-org/example-catalog:v{kube_major_version}.{kube_minor_version}.{kube_patch_version}"
spec:displayName: Example Catalog # 4image: quay.io/example-org/example-catalog:v1 # 5priority: -400 # 6publisher: Example OrgsourceType: grpc #7grpcPodConfig:securityContextConfig: <security_mode> # 8nodeSelector: # 9custom_label: <label>priorityClassName: system-cluster-critical # 10tolerations: # 11- key: "key1"operator: "Equal"value: "value1"effect: "NoSchedule"updateStrategy:registryPoll: # 12interval: 30m0s
status:connectionState:address: example-catalog.openshift-marketplace.svc:50051lastConnect: 2021-08-26T18:14:31ZlastObservedState: READY # 13latestImageRegistryPoll: 2021-08-26T18:46:25Z # 14registryService: # 15createdAt: 2021-08-26T16:16:37Zport: 50051protocol: grpcserviceName: example-catalogserviceNamespace: openshift-marketplace
  1. CatalogSource 对象的名称。此值也用作在请求的namespace中创建相关pod的名称的一部分。

  2. 要创建目录的namespace。要使目录在所有namespace中都可用,需将此值设置为 openshift-marketplace 。默认Red Hat提供的catalog source也使用 openshift-marketplace namespace。否则,将值设置为特定namespace,以使得Operator仅在该namespace中可用。

  3. 可选:为避免集群升级可能会使Operator安装处于不支持的状态或没有连续更新路径,可以启用自动更改Operator目录的index image版本作为集群升级的一部分。

    为index image名称设置 olm.catalogImageTemplate 注解,并使用一个或多个Kubernetes集群版本变量,正如为image tag构建模板时所示。该注解会在运行时覆盖 spec.image 字段。更多详细信息,请参阅“定制catalog source的image模板”。

  4. 在web console和CLI中的显示名称。

  5. 目录的索引image。在使用 olm.catalogImageTemplate 注解时,也可以省略,该注解会在运行时设置pull spec。

  6. Catalog source的权重。OLM在依赖项解析过程中使用该权重来排优先级。高权重表示该目录优先于低权重目录。

  7. 源类型包括:

    • 带有 image 引用的 grpc :OLM pull该image并运行pod,为合规的API服务。
    • 带有 address 字段的 grpc :OLM会尝试通过给定地址来联系gRPC API。在大多数情况下不应该使用这种类型。
    • configmap :OLM解析configmap数据,并运行一个服务于gRPC API的pod。
  8. 指定 legacyrestricted 值。如果没有设置该字段,则默认值为 legacy 。在将来的OCP发行版本中,计划的默认值为 restricted 。如果目录无法使用 restricted 权限运行,建议手动将此字段设置为 legacy

  9. 可选:对于 grpc 类型的catalog source,请覆盖在 spec.image 的内容的pod的默认node选择器(如果定义了)。

  10. 可选:对于 grpc 类型的catalog source,请覆盖在 spec.image 的内容的pod的默认优先级类名称(如果定义了)。Kubernetes默认提供了 system-cluster-criticalsystem-node-critical 优先级类。将字段设置为空(“”),可为pod分配默认优先级。可以手动定义其它优先级类。

  11. 可选:对于 grpc 类型的catalog source,请覆盖 spec.image 的内容的pod的默认容限(tolerations)(如果定义了)。

  12. 以指定的时间间隔自动检查新版本,以保持更新。

  13. 目录连接的最后观察状态。例如:

    • READY :成功建立连接。
    • CONNECTING :正在尝试建立连接。
    • TRANSIENT_FAILURE :尝试建立连接时发生了临时的问题,比如超时。该状态将会最终切回到 CONNECTING ,然后重试。
  14. 存储目录image的容器registry最近一次的轮询时间,以确保image是最新的。

  15. 目录的Operator Registry服务的状态信息。

在订阅中引用 CatalogSource 对象的 name ,会指示OLM到哪里搜索请求的Operator:

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:name: example-operatornamespace: example-namespace
spec:channel: stablename: example-operatorsource: example-catalogsourceNamespace: openshift-marketplace
定制catalog source的image模板

Operator与底层集群的兼容性可以通过catalog source以各种方式表示。其中一种用于Red Hat默认提供的catalog的方法,是识别“为特定平台发行版本(比如OCP 4.14)特别创建的索引image”的image tag。

在集群升级过程中,Red Hat默认提供的catalog source的索引image tag由Cluster Version Operator(CVO)自动更新,以便OLM pull目录的更新版本。例如,在从OCP 4.13 升级到 4.14 的过程中,redhat-operators 目录的 CatalogSource 对象中的 spec.image 字段,从:

registry.redhat.io/redhat/redhat-operator-index:v4.13

更新为:

registry.redhat.io/redhat/redhat-operator-index:v4.14

但是,CVO不会自动更新定制目录的image tag。为确保集群升级后,留给用户的Operator安装是兼容的、受支持的,还应保持更新定制目录,以引用更新的索引image。

从OCP 4.9开始,集群管理员可以在定制目录的 CatalogSource 对象中添加 olm.catalogImageTemplate 注解到包含模板的image引用。模板中支持使用以下Kubernetes版本变量:

  • kube_major_version
  • kube_minor_version
  • kube_patch_version

注意:必须指定Kubernetes集群版本,而不是OCP集群版本,因为后者目前不适用于模板。

如果已经创建并push了带有指定更新Kubernetes版本tag的索引image,设置此注解可使定制目录中的索引image版本在集群升级后自动更改。该注解值用于设置或更新 CatalogSource 对象的 spec.image 字段中的image引用。这有助于避免在集群升级后,Operator安装处于不受支持的状态,或没有连续更新路径。

注意:无论存储在哪个registry中,必须确保在集群升级时,有更新tag的索引image可被集群访问。

apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:generation: 1name: example-catalognamespace: openshift-marketplaceannotations:olm.catalogImageTemplate:"quay.io/example-org/example-catalog:v{kube_major_version}.{kube_minor_version}"
spec:displayName: Example Catalogimage: quay.io/example-org/example-catalog:v1.27priority: -400publisher: Example Org

注意:如果设置了 spec.image 字段和 olm.catalogImageTemplate 注解,则 spec.image 字段会被注解中的解析值覆盖。如果注解没有解析为可用的pull spec,catalog source会回退到设置的 spec.image 值。

如果没有设置 spec.image 字段,且注解没有解析为可用的pull spec,OLM会停止catalog source的reconciliation,并将其设置为人类可读的错误情况。

对于使用Kubernetes 1.27的OCP 4.14集群,上例中的 olm.catalogImageTemplate 注解会解析为以下image引用:

quay.io/example-org/example-catalog:v1.27

对于未来的OCP版本,可以为定制目录创建更新的索引image,该image以更新的Kubernetes版本为目标,供以后的OCP版本使用。升级前设置了 olm.catalogImageTemplate 注解,则将集群升级到更新的OCP版本也会自动更新目录的索引image。

目录健康需求

集群上的Operator目录从安装解析来说是可交换的。 Subscription 对象可能会引用特定目录,但依赖项会根据集群中的所有目录来解决。

例如,如果Catalog A不健康,则引用Catalog A的订阅可能会解析Catalog B中的依赖项,这可能不是集群管理员所预期的,因为B通常比A的目录优先级更低。

因此,OLM要求所有具有给定全局namespace的目录(例如,默认的 openshift-marketplace namespace或定制全局namespace)都是健康的。当目录不健康时,其共享全局namespace中所有的Operator安装或更新操作都将失败,带着 SourcesUnhealthy 状况。如果允许这些操作处于不健康状态,OLM可能会做出在集群管理员期望之外的解析和安装决策。

作为集群管理员,如果观察到一个不健康目录,并希望将目录视为无效并恢复Operator安装,请参阅“删除定制目录”或“禁用缺省OperatorHub catalog source"部分,以了解有关删除不健康目录的信息。

Subscription

订阅由 Subscription 对象定义,代表安装Operator的意图。它是将Operator与catalog source相关联的CR。

订阅描述了要订阅Operator包的哪个频道,以及自动还是手动更新。如果设置为自动更新,订阅可确保OLM管理并升级Operator,以确保集群中始终运行最新版本。

apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:name: example-operatornamespace: example-namespace
spec:channel: stablename: example-operatorsource: example-catalogsourceNamespace: openshift-marketplace

Subscription 对象定义了Operator的名称和namespace,以及可以找到Operator数据的目录。频道(比如 alphabetastable )可帮助确定应从catalog source安装哪个Operator流。

订阅中的频道名称可能会因Operator而异,但在给定的Operator中,命名schema应遵守通用惯例。例如,频道名称可能会遵循Operator ( 1.21.3 )或发行频率( stablefast )提供的次发行版本更新流。

除了可从OCP web console轻松查看外,还可以通过检查相关订阅的状态来识别是否有新版本的Operator。 currentCSV 字段的值是OLM所知道的最新版本,而 installedCSV 是集群中的安装版本。

Install plan

安装计划(Install Plan, IP)由 InstallPlan 对象定义,描述了OLM为了安装或升级到Operator特定版本而创建的一组资源。该版本由CSV定义。

要安装Operator,集群管理员或被授予Operator安装许可的用户,必须首先创建一个 Subscription 对象。订阅代表了从catalog source订阅Operator可用版本流的意图。然后,订阅会创建一个 InstallPlan 对象来方便Operator的资源安装。

然后,根据以下批准策略之一来批准安装计划:

  • 如果订阅的 spec.installPlanApproval 字段被设置为 Automatic ,则会自动批准安装计划。
  • 如果订阅的 spec.installPlanApproval 字段被设置为 Manual ,则安装计划必须由集群管理员或具有适合权限的用户手工批准。

批准安装计划后,OLM会创建指定的资源,并在订阅指定的namespace中安装Operator。

apiVersion: operators.coreos.com/v1alpha1
kind: InstallPlan
metadata:name: install-abcdenamespace: operators
spec:approval: Automaticapproved: trueclusterServiceVersionNames:- my-operator.v1.0.1generation: 1
status:...catalogSources: []conditions:- lastTransitionTime: '2021-01-01T20:17:27Z'lastUpdateTime: '2021-01-01T20:17:27Z'status: 'True'type: Installedphase: Completeplan:- resolving: my-operator.v1.0.1resource:group: operators.coreos.comkind: ClusterServiceVersionmanifest: >-...name: my-operator.v1.0.1sourceName: redhat-operatorssourceNamespace: openshift-marketplaceversion: v1alpha1status: Created- resolving: my-operator.v1.0.1resource:group: apiextensions.k8s.iokind: CustomResourceDefinitionmanifest: >-...name: webservers.web.servers.orgsourceName: redhat-operatorssourceNamespace: openshift-marketplaceversion: v1beta1status: Created- resolving: my-operator.v1.0.1resource:group: ''kind: ServiceAccountmanifest: >-...name: my-operatorsourceName: redhat-operatorssourceNamespace: openshift-marketplaceversion: v1status: Created- resolving: my-operator.v1.0.1resource:group: rbac.authorization.k8s.iokind: Rolemanifest: >-...name: my-operator.v1.0.1-my-operator-6d7cbc6f57sourceName: redhat-operatorssourceNamespace: openshift-marketplaceversion: v1status: Created- resolving: my-operator.v1.0.1resource:group: rbac.authorization.k8s.iokind: RoleBindingmanifest: >-...name: my-operator.v1.0.1-my-operator-6d7cbc6f57sourceName: redhat-operatorssourceNamespace: openshift-marketplaceversion: v1status: Created...
Operator group

Operator组由 OperatorGroup 资源定义,为OLM安装的Operator提供multitenant配置。Operator组选择目标namespace,在其中为其成员Operator生成所需的RBAC访问权限。

这一组目标namespace通过存储在CSV的 olm.targetNamespaces 注解中的一个以逗号分隔的字符串来提供。该注解应用于成员Operator的CSV实例,并映射到其deployment中。

Operator condition

作为管理Operator生命周期的角色的一部分,OLM从定义Operator的Kubernetes资源状态来推断Operator状态。虽然此方法在一定程度上保证Operator处于给定状态,但在有些情况下,Operator可能需要和OLM沟通信息,而这些信息是无法推断的。这些信息可以被OLM使用来更好地管理Operator的生命周期。

OLM提供了一个名为 OperatorCondition 的CRD,它允许Operator向OLM沟通状况。当 OperatorCondition 资源的 Spec.Conditions 数组存在时,有一组受支持的状况,它们会影响OLM管理 Operator。

注意:默认情况下, OperatorCondition 对象中没有 Spec.Conditions 数组,直到由用户添加或使用定制Operator逻辑添加。

OLM架构

组件职责

OLM由两个Operator组成:OLM Operator和Catalog Operator。

每个Operator均负责管理CRD,而CRD是OLM框架的基础。

由OLM 和Catalog Operator管理的CRD:

资源短名称所有者描述
ClusterServiceVersion (CSV)csvOLM应用元数据:名称、版本、图标、所需资源、安装等。
InstallPlanipCatalog为自动安装或升级CSV而需创建的资源计算列表。
CatalogSourcecatsrcCatalog定义应用的CSV、CRD、package存储库。
SubscriptionsubCatalog用于通过追踪包中的频道来保持CSV更新。
OperatorGroupogOLM将部署在同一namespace中的所有Operator配置为 OperatorGroup 对象,以便在一系列namespace或集群范围内监视其CR。

每个Operator还负责创建以下资源。

由OLM和Catalog Operator创建的资源:

资源所有者
DeploymentsOLM
ServiceAccountsOLM
(Cluster)RolesOLM
(Cluster)RoleBindingsOLM
CustomResourceDefinitions (CRDs)Catalog
ClusterServiceVersions (CSVs)Catalog
OLM Operator

集群中存在CSV中指定的所需资源后,OLM Operator将负责部署由CSV资源定义的应用。

OLM Operator不关注所需资源的创建。可选择使用CLI或者使用Catalog Operator来手工创建这些资源。关注点的分离可以使得用户可以逐渐增加他们为其应用选择的OLM框架量。

OLM Operator使用以下工作流:

  1. 观察namespace中的CSV,并检查是否满足需求。
  2. 如果满足需求,运行CSV的安装策略。

注意:CSV必须是Operator组里的活跃成员,才可运行该安装策略。

Catalog Operator

Catalog Operator负责解析和安装CSV以及它们指定的所需资源。另外还负责监视频道中的catalog source中是否有软件包更新,并将其升级(如果有需要可选择自动)至最新的可用版本。

要追踪频道中的软件包,可以创建一个 Subscription 对象来配置所需的软件包、频道和 CatalogSource 对象,以便pull更新。在找到更新后,便会代表用户将一个适当的 InstallPlan 对象写入namespace。

Catalog Operator使用以下工作流:

  1. 连接到集群中的每个catalog source。
  2. 监视用户创建的未解析的install plan,如果找到了:
    1. 查找与请求名称相匹配的CSV,并将此CSV添加为已解析的资源。
    2. 对于每个受管的或所需的CRD,将其添加为已解析的资源。
    3. 对于每个所需的CRD,找到管理它的CSV。
  3. 监视已解析的install plan,并为其创建所有已发现的资源(如果用户批准或自动批准)。
  4. 监视catalog source和subscription,并基于它们创建install plan。
Catalog Registry

Catalog Registry存储CSV和CRD以便在集群中创建,并存储有关软件包和频道的元数据。

package manifest 是Catalog Registry中的一个条目,用于将软件包标识与CSV集相关联。在软件包中,频道指向某个CSV。因为CSV显式引用了所替换的CSV,软件包manifest向Catalog Operator提供了将CSV更新至频道中的最新版本所需的所有信息,逐步安装和替换每个中间版本。

OLM工作流

OLM中的Operator安装和升级工作流

在OLM生态系统中,以下资源用于解析Operator的安装和升级:

  • ClusterServiceVersion (CSV)
  • CatalogSource
  • Subscription

CSV中定义的Operator元数据,可保存在一个被称为catalog source的集合中。Catalog source使用Operator Registry API,OLM又使用catalog source来查询可用的Operator,以及已安装Operator的更新。

Catalog source概览:

在这里插入图片描述

在catalog source里,Operator被整合为更新软件包和更新流,被称为频道,这应是OCP或其它持续发行周期的软件(比如Web浏览器)的熟悉的更新模式。

Catalog source里的包和频道:

在这里插入图片描述
用户在subscription的某个catalog source中指定某个软件包和频道,比如 etcd 包及其 alpha 频道。如果订阅了命名空间中尚未安装的软件包,则会安装该软件包的最新Operator。

注意:OLM有意避免了版本比较,因此从给定catalog -> channel -> package路径提供的“latest”或“newest”Operator并不一定是最高的版本号。更应将其视为频道的head引用,类似Git存储库。

每个CSV均有一个 replaces 参数,指明所替换的是哪个Operator。这样便构建了一个OLM可以查询的CSV图,且频道之间可共享更新。可将频道视为更新图的入口点。

可用频道更新的OLM图:

在这里插入图片描述

软件包的频道示例:

packageName: example
channels:
- name: alphacurrentCSV: example.v0.1.2
- name: betacurrentCSV: example.v0.1.3
defaultChannel: alpha

为了让OLM成功查询更新、给定一个catalog source、软件包、频道、CSV,目录必须能够明确无误地返回一个CSV,替换输入的CSV。

升级路径示例

略。

跳过升级

略。

替换多个Operator

略。

Z-stream支持

略。

OLM依赖项解析

略。

Operator组

略。

Multitenancy和Operator共置(colocation)

略。

Operator状况

略。

OLM指标

略。

OLM中的webhook管理

略。

参考

  • https://access.redhat.com/documentation/en-us/openshift_container_platform/4.14/html-single/operators/index

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

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

相关文章

文件压缩炸弹,想到有点后怕

今天了解到一个概念&#xff0c;压缩炸弹。 参考&#xff1a; https://juejin.cn/post/7289667869557178404 https://www.zhihu.com/zvideo/1329374649210302464 什么是压缩炸弹 压缩炸弹&#xff08;也称为压缩文件炸弹、炸弹文件&#xff09;是一种特殊的文件&#xff0c;它…

面试:大数据和深度学习之间的关系是什么?

大数据与深度学习之间存在着紧密的相互关系&#xff0c;它们在当今技术发展中相辅相成。 大数据的定义与特点:大数据指的是规模(数据量)、多样性(数据类型)和速度(数据生成及处理速度)都超出了传统数据处理软件和硬件能力范围的数据集。它具有四个主要特点&#xff0c;通常被称…

【Java】零基础蓝桥杯算法学习——二分查找

算法模板一: // 数组arr的区间[0,left-1]满足arr[i]<k,[left,n-1]满足arr[i]>k;Scanner scan new Scanner(System.in);int[] arr {1,2,3,4,5};int left 0,right arr.length-1;int k scan.nextInt();while(left<right) {//leftright时退出循环int mid (leftrigh…

leetcode(双指针)11.盛最多水的容器(C++详细解释)DAY9

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回…

【Django】Django项目部署

项目部署 1 基本概念 项目部署是指在软件开发完毕后&#xff0c;将开发机器上运行的软件实际安装到服务器上进行长期运行。 在安装机器上安装和配置同版本的环境[python&#xff0c;数据库等] django项目迁移 scp /home/euansu/Code/Python/website euansuxx.xx.xx.xx:/home…

OpenCV基础:用Python生成一幅随机的噪声图像

使用Python&#xff1a;生成一幅随机数值的灰度图像&#xff0c;图像大小为1616像素。借助OpenCV库。输出数值&#xff0c;并显示图像。 # -*- coding: utf-8 -*- """ Created on Wed Feb 14 21:49:09 2024author: 李立宗公众号&#xff1a;计算机视觉之光知识…

【QT+QGIS跨平台编译】之四十:【gsl+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、GSL介绍二、GSL下载三、文件分析四、pro文件五、编译实践一、GSL介绍 GSL(GNU Scientific Library)是一个开源的数值计算库,用于提供一系列常用的数学函数和算法。它为科学计算和数据分析提供了高效、可靠的工具。 GSL库提供了丰富的功能,包括数值积分、数值…

C++-带你深度理解string类的常见接口

1. 为什么学习string类&#xff1f; C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需…

“从根到叶:深入理解堆数据结构“

​​​​​​​ 一.堆的概念及实现 1.1堆的概念 在数据结构中&#xff0c;堆是一种特殊的树形数据结构。堆可以分为最大堆和最小堆两种类型。 最大堆&#xff1a;对于堆中的任意节点&#xff0c;其父节点的值都不小于它的值。换句话说&#xff0c;最大堆中的根节点是堆中的最…

AI论文速读 | 2024【综述】图神经网络在智能交通系统中的应用

论文标题&#xff1a;A Survey on Graph Neural Networks in Intelligent Transportation Systems 链接&#xff1a;https://arxiv.org/abs/2401.00713 作者&#xff1a;Hourun Li, Yusheng Zhao, Zhengyang Mao, Yifang Qin, Zhiping Xiao, Jiaqi Feng, Yiyang Gu, Wei Ju, …

PR:熟悉PR工作环境

新建项目 设置自己的页面布局 首选项

【Algorithms 4】算法(第4版)学习笔记 07 - 2.4 优先队列

文章目录 前言参考目录学习笔记1&#xff1a;API1.1&#xff1a;实现 demo 示例1.2&#xff1a;初级实现&#xff08;有序或无序的数组&#xff09;2&#xff1a;二叉堆2.1&#xff1a;完全二叉树2.2&#xff1a;二叉堆2.2.1&#xff1a;堆的表示2.2.2&#xff1a;属性2.3&…

Java 基于 SpringBoot+Vue 的智慧外贸平台的研究与实现,附源码

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

【Vue】Vue基础入门

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Vue ⛺️稳重求进&#xff0c;晒太阳 Vue概念 是一个用于构建用户界面的渐进式框架优点&#xff1a;大大提高开发效率缺点&#xff1a;需要理解记忆规则 创建Vue实例 步骤&#xff1a; …

Arm发布新的人工智能Cortex-M处理器

Arm发布了一款新的Cortex-M处理器&#xff0c;旨在为资源受限的物联网&#xff08;IoT&#xff09;设备提供先进的人工智能功能。这款新的Cortex-M52声称是最小的、面积和成本效率最高的处理器&#xff0c;采用了Arm Helium技术&#xff0c;使开发者能够在单一工具链上使用简化…

小结与数字的魅力的开篇

小结 本系列主要介绍了一些排序算法&#xff0c;包括冒泡排序、快速排序、直接插入排序、希尔排序、简单选择排序、堆排序、归并排序、计数排序、桶排序和基数排序。 排序算法本身并不难&#xff0c;但其涉及的知识点却星罗棋布&#xff0c;其变化莫测的思路更让人难以捉摸&am…

移动机器人激光SLAM导航(五):Cartographer SLAM 篇

参考 Cartographer 官方文档Cartographer 从入门到精通 1. Cartographer 安装 1.1 前置条件 推荐在刚装好的 Ubuntu 16.04 或 Ubuntu 18.04 上进行编译ROS 安装&#xff1a;ROS学习1&#xff1a;ROS概述与环境搭建 1.2 依赖库安装 资源下载完解压并执行以下指令 https://pa…

Spring Boot 笔记 009 创建接口_更新用户基本信息

1.1.1 给User实体类添加校验 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotEmpty; import jakarta.validation.constraints.NotNull; import jakarta…

【Java程序设计】【C00260】基于Springboot的企业客户信息反馈平台(有论文)

基于Springboot的企业客户信息反馈平台&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的企业客户信息反馈平台 本系统分为平台功能模块、管理员功能模块以及客户功能模块。 平台功能模块&#xff1a;在平台首页可…

FastAI 之书(面向程序员的 FastAI)(六)

原文&#xff1a;www.bookstack.cn/read/th-fastai-book 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十三章&#xff1a;卷积神经网络 原文&#xff1a;www.bookstack.cn/read/th-fastai-book/44d8848dfac0c1b0.md 译者&#xff1a;飞龙 协议&#xff1a;CC BY-N…