kro 概念 - Amazon EKS

帮助改进此页面

要帮助改进本用户指南,请选择位于每个页面右侧窗格中的在 GitHub 上编辑此页面链接。

kro 概念

kro 支持平台团队创建自定义 Kubernetes API,将多个资源组合为更高级别的抽象资源。本主题会先引导您完成一个实操案例的演练,再详细阐释使用 EKS 托管型 kro 所需掌握的核心概念。

kro 入门

创建 kro 托管功能后(详见创建 kro 功能文档),即可开始在集群中通过 ResourceGraphDefinition 来创建自定义 API。

以下完整示例用于创建简单的 Web 应用程序抽象资源:

apiVersion: kro.run/v1alpha1 kind: ResourceGraphDefinition metadata: name: webapplication spec: schema: apiVersion: v1alpha1 kind: WebApplication group: kro.run spec: name: string | required=true image: string | default="nginx:latest" replicas: integer | default=3 resources: - id: deployment template: apiVersion: apps/v1 kind: Deployment metadata: name: ${schema.spec.name} spec: replicas: ${schema.spec.replicas} selector: matchLabels: app: ${schema.spec.name} template: metadata: labels: app: ${schema.spec.name} spec: containers: - name: app image: ${schema.spec.image} ports: - containerPort: 80 - id: service template: apiVersion: v1 kind: Service metadata: name: ${schema.spec.name} spec: selector: app: ${schema.spec.name} ports: - protocol: TCP port: 80 targetPort: 80

应用该 ResourceGraphDefinition 后,应用团队即可通过您定义的简化版 API 来创建 Web 应用程序:

apiVersion: kro.run/v1alpha1 kind: WebApplication metadata: name: my-app spec: name: my-app replicas: 5

kro 会自动创建带有相应配置的 Deployment 和 Service 资源。由于配置中未指定 image 参数,系统会采用模式定义中预设的默认值 nginx:latest

核心概念

重要

kro 会在创建阶段对 ResourceGraphDefinition 进行验证,而非在运行时阶段。当您创建一个 RGD 时,kro 会执行以下验证操作:校验 CEL 语法的正确性、基于实际的 Kubernetes 模式对表达式进行类型检查、验证字段是否存在、检测是否存在循环依赖。这意味着相关错误会在创建 RGD 时被立即发现,无需等到部署任何实例之后。

ResourceGraphDefinition

ResourceGraphDefinition(RGD)通过配置以下内容来定义一种 Kubernetes 自定义 API:

  • Schema:采用 SimpleSchema 格式定义的 API 结构(字段名称、字段类型、默认值及验证规则)

  • Resources:待创建的底层 Kubernetes 资源或 AWS 资源的模板

  • Dependencies:资源之间的关联方式(会通过字段引用自动识别)

当您应用一份 RGD 配置后,kro 会在集群中注册一个全新的自定义资源定义(CRD)。之后应用团队即可创建该自定义 API 的实例,由 kro 负责创建并管理所有对应的底层资源。

有关更多信息,请参阅 kro 文档中的 ResourceGraphDefinition Overview

SimpleSchema 格式

SimpleSchema 提供了一种简化的 API 模式定义方式,无需使用者掌握 OpenAPI 相关知识:

schema: apiVersion: v1alpha1 kind: Database spec: name: string | required=true description="Database name" size: string | default="small" enum=small,medium,large replicas: integer | default=1 minimum=1 maximum=5

SimpleSchema 支持 stringintegerbooleannumber 等类型,并可配置 requireddefaultminimum/maximumenumpattern 等约束规则。

有关更多信息,请参阅 kro 文档中的 SimpleSchema

CEL 表达式

kro 采用公共表达式语言(CEL)来实现值的动态引用和条件逻辑的添加。CEL 表达式需要包裹在 ${} 之内,主要有两种使用方式:

独立表达式:字段的完整值由单个表达式构成:

spec: replicas: ${schema.spec.replicaCount} # Expression returns integer labels: ${schema.spec.labelMap} # Expression returns object

表达式的计算结果会直接替换整个字段的值,且结果类型必须与字段预期的类型相匹配。

字符串模板:在字符串中嵌入一个或多个表达式:

metadata: name: "${schema.spec.prefix}-${schema.spec.name}" # Multiple expressions annotation: "Created by ${schema.spec.owner}" # Single expression in string

字符串模板中的所有表达式必须返回字符串类型。若要转换其他类型,可使用 string() 函数,例如:"replicas-${string(schema.spec.count)}"

字段引用:通过 schema.spec 访问实例的规格参数:

template: metadata: name: ${schema.spec.name}-deployment namespace: ${schema.metadata.namespace} # Can also reference metadata spec: replicas: ${schema.spec.replicas}

可选字段访问:对于可能不存在的字段,可使用 ? 符号,例如:

# For ConfigMaps or Secrets with unknown structure value: ${configmap.data.?DATABASE_URL} # For optional status fields ready: ${deployment.status.?readyReplicas > 0}

若目标字段不存在,表达式会返回 null 而非直接执行失败。

条件式资源:仅在满足指定条件时才创建资源:

resources: - id: ingress includeWhen: - ${schema.spec.enableIngress == true} template: # ... ingress configuration

includeWhen 字段会接收一份布尔表达式列表。只有所有表达式结果均为 true,对应的资源才会被创建。目前 includeWhen 仅支持引用 schema.spec 中的字段。

数据转换:通过三元运算符与函数实现值的转换处理:

template: spec: resources: requests: memory: ${schema.spec.size == "small" ? "512Mi" : "2Gi"} # String concatenation image: ${schema.spec.registry + "/" + schema.spec.imageName} # Type conversion port: ${string(schema.spec.portNumber)}

跨资源引用:引用其他资源的值:

resources: - id: bucket template: apiVersion: s3.services.k8s.aws/v1alpha1 kind: Bucket spec: name: ${schema.spec.name}-data - id: configmap template: apiVersion: v1 kind: ConfigMap data: BUCKET_NAME: ${bucket.spec.name} BUCKET_ARN: ${bucket.status.ackResourceMetadata.arn}

当您在 CEL 表达式中引用另一资源时,kro 会自动创建资源间的依赖关系,并确保被引用的资源优先完成创建。

有关更多信息,请参阅 kro 文档中的 CEL Expressions

资源依赖关系

kro 会通过 CEL 表达式自动推导资源间的依赖关系,无需您手动指定资源的创建顺序,只需描述资源之间的关联逻辑即可。当某一资源通过 CEL 表达式引用另一资源时,kro 会自动创建两者的依赖关系,并确定正确的资源创建顺序。

resources: - id: bucket template: apiVersion: s3.services.k8s.aws/v1alpha1 kind: Bucket spec: name: ${schema.spec.name}-data - id: notification template: apiVersion: s3.services.k8s.aws/v1alpha1 kind: BucketNotification spec: bucket: ${bucket.spec.name} # Creates dependency: notification depends on bucket

表达式 ${bucket.spec.name} 会触发依赖关系的生成。kro 会为所有资源及其依赖关系构建一个有向无环图(DAG),再据此计算出资源的拓扑创建顺序。

创建顺序:资源会按照拓扑顺序进行创建(被依赖的资源优先创建)。

并行创建:无依赖关系的资源会被同时创建。

删除顺序:资源会按照拓扑顺序的逆序进行删除(依赖方优先被删除)。

循环依赖:不被允许。kro 会在 ResourceGraphDefinition 验证阶段,直接拒绝存在循环依赖的配置。

您可以查看系统计算出的资源创建顺序:

kubectl get resourcegraphdefinition my-rgd -o jsonpath='{.status.topologicalOrder}'

有关更多信息,请参阅 kro 文档中的 Graph inference

与 ACK 的组合编排

kro 可与 EKS 托管型 ACK 无缝协同,实现 AWS 资源与 Kubernetes 资源的组合编排:

resources: # Create {aws} S3 bucket with ACK - id: bucket template: apiVersion: s3.services.k8s.aws/v1alpha1 kind: Bucket spec: name: ${schema.spec.name}-files # Inject bucket details into Kubernetes ConfigMap - id: config template: apiVersion: v1 kind: ConfigMap data: BUCKET_NAME: ${bucket.spec.name} BUCKET_ARN: ${bucket.status.ackResourceMetadata.arn} # Use ConfigMap in application deployment - id: deployment template: apiVersion: apps/v1 kind: Deployment spec: template: spec: containers: - name: app envFrom: - configMapRef: name: ${config.metadata.name}

这种模式支持您创建 AWS 资源、提取其详细信息(如 ARN、URL、端点)并注入应用配置,且所有操作均作为单一单元进行管理。

有关更多组合编排模式及进阶示例,请参阅 EKS 托管型 kro 注意事项

后续步骤

  • EKS 托管型 kro 注意事项:了解 EKS 专属模式、RBAC 以及与 ACK、Argo CD 的集成方法

  • kro 文档:包含进阶 CEL 表达式、验证模式及问题排查方案的完整 kro 文档