i007.cc

i007.cc

优先队列-降维打击

05.价值资料

Crossplane Composition 通俗理解

Composition = 高层抽象 API 的实现模板Crossplane
  • XRD(CompositeResourceDefinition):定义对外 API 长什么样(schema、字段),相当于接口定义。
  • Composition:接口的实现,描述创建这个高层资源时,到底要生成哪些底层 Managed Resource(MR,云资源 CRD),字段怎么映射、怎么打补丁 (patch)Crossplane。
类比:
  • XRD:定义 kind: XPostgres,对外只暴露 storageGB、instanceClass 两个简单参数,只定义契约,不写怎么创建
  • Composition:写模板:创建 1 个 RDS 实例 + 1 个安全组 + 1 个 DB 子网组;把 XR 的storageGB赋值给 RDS 的存储字段;给资源打统一标签;处理字段拷贝、状态回写。
用户只需要提交一个简单的XPostgres(XR/ Claim),Crossplane 控制器读取绑定的 Composition,自动批量生成一堆底层云资源,统一生命周期:创建、更新、删除全部联动Crossplane。

核心三对象关系

  1. XRD:定义新的 K8s API(CRD),对外暴露参数、校验规则;集群范围 / 命名空间,定义 Claim 是否可用Crossplane。
  2. Compositionapiextensions.crossplane.io/v1,绑定一个 XRD(compositeTypeRef),描述要生成哪些资源、字段如何转换一个 XRD 可以绑定多个 Composition,实现多后端:比如同样XPostgres,prod 走 AWS RDS,dev 走 GCP CloudSQL,对使用者完全透明。
  3. XR / Claim(XRC):使用者提交实例。
    • XR:集群级别;
    • Claim:命名空间级别,给业务开发者使用,代理生成 XR。
数据流:
plaintext
User → Claim(命名空间) → XR(集群) → Composition模板 → 生成多个ManagedResource(云资源CR) → Provider Controller调用云API创建真实资源

 

修改 Claim → XR 更新 → Composition reconcile → 底层 MR 自动更新;删除 Claim → 所有底层资源一起删除(受 deletionPolicy 控制)GitHub。

Composition 两种模式

1. Resources 模式(传统 YAML+patch,v1 老模式)

spec.resources[],每个 resource 写base(资源模板),再写patches做字段映射:从 XR 的 spec 拷贝到底层 MR 的 spec,也可以把 MR 的 status 回写到 XR 的 statusCrossplane。
极简骨架示例:
yaml
apiVersion: apiextensions.crossplane.io/v1
kind: Composition
metadata:
  name: aws-postgres
spec:
  compositeTypeRef:   #绑定XRD定义的API
    apiVersion: db.platform.io/v1alpha1
    kind: XPostgres
  resources:
    - name: rds
      base:
        apiVersion: database.aws.upbound.io/v1beta1
        kind: Instance
        spec:
          forProvider:
            engine: postgres
            allocatedStorage: 10
      patches:
        #把XR.spec.parameters.storageGB覆盖到底层RDS
        - fromFieldPath: spec.parameters.storageGB
          toFieldPath: spec.forProvider.allocatedStorage
    - name: sg
      base:
        apiVersion: ec2.aws.upbound.io/v1beta1
        kind: SecurityGroup

 

缺点:只有声明式 patch,没有 if‑else、循环,复杂逻辑很难写,YAML 补丁爆炸。

2. Pipeline 模式(Composition Functions,现代推荐)

spec.mode: Pipeline,执行函数流水线,不再写spec.resources,用 gRPC 函数做资源渲染、条件判断、循环、复杂转换、校验。

最常用官方函数:function‑patch‑and‑transform,在函数内部写 resources+patch。还可以用 python/kcl/go 自定义 Function。

yaml
spec:
  compositeTypeRef:
    apiVersion: db.platform.io/v1alpha1
    kind: XPostgres
  mode: Pipeline
  pipeline:
  - step: render
    functionRef:
      name: function-patch-and-transform
    input:
      apiVersion: pt.fn.crossplane.io/v1beta1
      kind: Resources
      resources:
        #这里写resources与patches,和老模式几乎一样

 

production‑grade 的 Crossplane 平台,全部用 Pipeline+Function 模式,方便做复杂业务逻辑、多环境差异化、循环生成多个同类型资源。

Patch 是什么?

Patch 是 Composition 里的核心机制:
  • fromFieldPath:来源路径,来自 XR(用户输入)或者已生成的子资源 status;
  • toFieldPath:目标路径,底层 ManagedResource 字段;

    支持字符串拼接、条件、默认值,实现参数透传、元数据复制、状态回填(把 RDS 的 endpoint 回填到 XR 的 status 对外暴露)Crossplane。

关键能力与坑点

✅能力

  1. 封装复杂度:业务开发者只需要高层 API,不用懂云厂商几十个参数。平台团队维护 Composition,统一管控合规标签、安全策略。
  2. 多实现同一 API:同一个 XRD,多个 Composition,实现多云、环境差异化。
  3. 统一生命周期:删一个 Claim,所有子资源联动删除。可以用Usage资源控制删除顺序(先删依赖,再删主资源)Crossplane。
  4. 状态聚合:把多个底层资源 status 聚合到 XR 的 status,使用者只看一个对象状态。

⚠️常见坑

  1. Composition 只做模板,不存储状态;所有实际状态保存在 XR、子 ManagedResource 对象。控制器循环 reconcile,任何偏离模板都会被修复(漂移自愈)。
  2. Resources 模式无法循环生成不定数量资源(比如动态 N 个子网),这种场景必须上 Composition Function。
  3. 多 Composition 匹配策略:可以给 XR 打 label 选择匹配哪一个 Composition,实现同一个 XR 根据标签选择不同后端。
  4. deletionPolicy: Orphan:删除 XR/Claim 时,保留云上真实资源,生产务必谨慎
  5. Patch 路径写错不会报错,只会字段不生效,排障看 crossplane pod 日志。

和 Helm 对比(很容易混淆)

  • Helm:渲染出一堆 K8s 资源,交给 k8s api;不知道云资源,没有 reconcile 循环
  • Composition:模板生成 ManagedResource CRD 对象;Crossplane Provider 持续 reconcile 云上真实资源,持续状态对齐;可以抽象出全新的自定义 API(XRD)给外部调用,适合做企业内部 IaaS/PaaS 控制平面GitHub。
Helm 面向 K8s 应用;Crossplane Composition 面向基础设施控制平面抽象

一句话总结

XRD 定义 “对外长什么样”,Composition 定义 “内部怎么实现”。用户提交高层 Claim,Composition 负责展开成一堆底层云资源,并且持续维护它们生命周期。
如果你需要,我可以给一个极简完整示例:XRD + Composition + Claim 完整可运行 yaml。

发表回复