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,一经查实,立即删除!

相关文章

SQL世界之命令语句Ⅴ

目录 一、SQL CREATE INDEX 语句 1.SQL CREATE INDEX 语句 2.SQL CREATE INDEX 语法 3.SQL CREATE UNIQUE INDEX 语法 4.SQL CREATE INDEX 实例 二、SQL 撤销索引、表以及数据库 1.SQL DROP INDEX 语句 2.SQL DROP TABLE 语句 3.SQL DROP DATABASE 语句 4.SQL TRUNCA…

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

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

ACTable开源框架的使用及异常

介绍 ACTable是对Mybatis做的增强功能&#xff0c;支持SpringBoot以及传统的SpringMvc架构&#xff0c;配置简单&#xff0c;使用方便。主要是自动生成数据库表&#xff0c;直接修改java代码&#xff0c;数据库就会对应的变化&#xff0c;省去在调整数据库表的问题&#xff0c…

笔试刷题(持续更新)| Leetcode 45,1190

45. 跳跃游戏 题目链接&#xff1a; 45. 跳跃游戏 II - 力扣&#xff08;LeetCode&#xff09; 这道题思路不难记&#xff0c;遍历数组每个位置&#xff0c;更新下一次的范围&#xff0c;当当前位置已经在当前范围之外时&#xff0c;步数一定得加一&#xff0c;当前范围更新成…

蓝桥杯官网填空题(质数拆分)

问题描述 将 2022 拆分成不同的质数的和&#xff0c;请问最多拆分成几个&#xff1f; 答案提交 本题为一道结果填空的题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将结果输出即可。 运行限制 import java.util.Scanner;public class Main {static int …

Pandas Series 的学习笔记

Pandas Series 的学习笔记 0. Pandas 简介1. Series 学习1-1. 创建 Series1-2. 索引1-3. 选择数据1-4. 修改 Series1-5. Series 的操作 2. 结论 0. Pandas 简介 想象一下&#xff0c;你有一张超级大的餐桌&#xff0c;上面放满了各种各样的食物。Pandas 就像是这张餐桌&#x…

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

大数据与深度学习之间存在着紧密的相互关系&#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…

Rust的Match语句:强大的控制流运算符

在Rust中&#xff0c;match语句是一种强大的控制流运算符&#xff0c;用于比较一个值与一系列模式&#xff0c;并执行与第一个匹配的模式对应的代码块。它提供了一种清晰而灵活的方式来处理多个条件&#xff0c;使得代码更加可读、易于理解。 Match语句的基本使用 首先&#…

2月14作业

21.C 22.D 23.B 5先出栈表示1&#xff0c;2&#xff0c;3&#xff0c;4已经入栈了&#xff0c;5出后4出&#xff0c;但之后想出1得先让3&#xff0c;2先后出栈&#xff0c;所以 B 不可能 24.10&#xff0c;12&#xff0c;120 25.2&#xff0c;5 26.可能会出现段错误…

js importmap

在html文件中使用npm 下载的包&#xff0c;比如vue&#xff0c;在使用import引入的时候会报错 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-widt…

vue使用Mars3d弹框嵌套video视频/实时视频(flv) 使用jessibuca.js播放器

在html引入jessibuca.js (还需下载decoder.js&#xff0c;decoder.wasm) http://jessibuca.monibuca.com/player.html 官方下载 <script type"text/javascript" src"./jessibuca.js"></script> 同Mars3d弹框嵌套视频播放m3u8前面相同 1.播放…

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

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

SQL世界之命令语句Ⅱ

目录 一、SQL TOP语句 1.TOP 子句 2.SQL TOP 实例 3.SQL TOP PERCENT 实例 二、SQL LIKE 操作符 1.LIKE 操作符 2.SQL LIKE 操作符语法 3.LIKE 操作符实例 三、SQL通配符 1.SQL 通配符 2.使用 % 通配符 3.使用 _ 通配符 4.使用 [charlist] 通配符 四、SQL IN操作…

Raspbian简易RTSP服务

Raspbian简易RTSP服务 1. 源由2. 搭建简易RTSP服务器2.1 系统安装2.2 软件安装2.3 命令介绍2.3.1 libcamera-hello2.3.2 libcamera-vid2.3.3 cvlc 3. 实测4. 参考资料 1. 源由 鉴于前期的一些准备工作&#xff1a; 《ArduPilot开源飞控之Companion Computers简单分析》《Ardu…

Python re找到特定pattern并将此pattern重复n次

要找到字符串s中的数字&#xff0c;并将这些数字重复3次&#xff1a; import re s "abc123def456ghi789" # 找到所有的数字 numbers re.findall(r\d, s) # 重复每个数字3次 repeated_numbers [num * 3 for num in numbers] # 将重复的数字放回原位置 #…

【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;而且底层空间需…