3. Crossplane 策略语法入门:策略规则的基本结构

在 IDP 网络拓扑中,Crossplane 策略是控制资源合规性、安全性与成本的核心手段。理解策略规则的基本结构——条件、动作、优先级——以及常见关键字与操作符,是编写高效、可复用策略的前提。本节将系统拆解策略语法,帮助你在网络拓扑场景中精准命中目标资源,同时降低误报率。

3.1 策略规则的三要素:条件、动作、优先级

每条 Crossplane 策略规则由三个核心部分组成,它们共同决定了策略的生效范围与行为:

要素 说明 网络拓扑示例
条件(Condition) 定义策略匹配的资源特征,支持标签、注解、spec 字段、状态等 spec.forProvider.cidrBlock == "10.0.0.0/16"
动作(Action) 指定匹配后的处理方式:允许(allow)、拒绝(deny)、审计(audit) action: deny 禁止创建非合规 VPC
优先级(Priority) 数值越小优先级越高,高优先级规则覆盖低优先级规则 priority: 10 高于 priority: 100
关键原则:条件越精确,命中率越高;动作越明确,误报率越低;优先级排序决定了策略冲突时的最终裁决。

3.2 常见关键字与操作符

Crossplane 策略语法基于 Rego(OPA 策略语言)或 Crossplane 原生 Composition 策略引擎。以下是最常用的关键字与操作符分类:

3.2.1 条件匹配关键字

  • matchLabels:基于资源标签精确匹配,常用于网络拓扑中的子网、路由表分类。
  • matchAnnotations:基于注解匹配,适合传递运维元数据。
  • matchExpressions:支持集合运算(In、NotIn、Exists、DoesNotExist),实现灵活的条件组合。
  • spec.forProvider:直接访问资源的 spec 字段,用于检查 CIDR、端口、实例类型等网络参数。

3.2.2 逻辑与比较操作符

操作符 类型 示例
== 等于 spec.forProvider.region == "us-east-1"
!= 不等于 spec.forProvider.instanceType != "t2.micro"
in 属于集合 spec.forProvider.cidrBlock in ["10.0.0.0/8", "172.16.0.0/12"]
not in 不属于集合 spec.forProvider.securityGroup not in ["sg-xxxx", "sg-yyyy"]
and 逻辑与 condition1 and condition2
or 逻辑或 condition1 or condition2
not 逻辑非 not condition

3.3 策略规则结构示例(内联 SVG)

下图展示了一条典型的 Crossplane 策略规则在 IDP 网络拓扑中的解析流程,从资源创建请求到策略引擎裁决的完整路径:

Crossplane 策略规则结构解析流程 策略规则结构解析流程 资源创建请求 条件匹配引擎 优先级排序 动作裁决 允许/拒绝/审计 条件不匹配,回退 说明: 条件匹配引擎支持标签、spec 字段、表达式组合;优先级数值越小越优先;动作裁决支持 allow/deny/audit 三种模式。

3.4 完整策略规则代码示例

以下是一个针对 IDP 网络拓扑中 VPC 子网 CIDR 合规性的策略规则,展示了条件、动作、优先级的完整写法:

apiVersion: policy.crossplane.io/v1alpha1
kind: PolicyRule
metadata:
  name: subnet-cidr-constraint
spec:
  priority: 10
  matchConditions:
    - matchLabels:
        network-tier: "production"
    - matchExpressions:
        - key: "spec.forProvider.cidrBlock"
          operator: NotIn
          values:
            - "10.0.0.0/16"
            - "10.1.0.0/16"
  action: deny
  message: "生产环境子网 CIDR 必须为 10.0.0.0/16 或 10.1.0.0/16"
实战提示:在 IDP 网络拓扑中,建议将 priority 按功能分层:基础合规策略(1-50)、安全策略(51-100)、成本策略(101-200),避免优先级冲突导致误报。

3.5 常见操作符组合与误报规避

操作符组合不当是导致误报的主要原因。以下表格总结了高频组合场景与推荐写法:

场景 错误写法 正确写法 误报风险
多 CIDR 白名单 cidrBlock != "10.0.0.0/16" cidrBlock not in ["10.0.0.0/16", "10.1.0.0/16"] 高(单个 != 会拒绝所有其他 CIDR)
标签与 spec 联合 matchLabels + 单独 spec 条件 matchExpressions 内嵌 spec 字段 中(条件分离导致逻辑遗漏)
优先级覆盖 多条规则相同优先级 显式分配不同优先级 高(随机裁决产生误报)

3.6 策略规则优先级冲突解决(内联 SVG)

当多条策略规则同时匹配同一资源时,优先级决定了最终动作。下图展示了优先级冲突的解决机制:

策略规则优先级冲突解决机制 优先级冲突解决机制 规则A:优先级 10 动作:deny 规则B:优先级 50 动作:allow 规则C:优先级 100 动作:audit 最终裁决:规则A(优先级最高) 动作:deny 优先级数值越小越优先,规则A(优先级10)覆盖规则B(50)和规则C(100),最终执行 deny。
误报高发区:当多条规则优先级相同时,Crossplane 默认按创建时间或名称排序裁决,这会导致不可预期的命中结果。务必为每条规则显式设置唯一优先级。

3.7 策略语法速查表

为方便日常编写与复核,以下汇总了最常用的关键字与操作符速查表:

类别 关键字/操作符 用途 网络拓扑场景
条件匹配 matchLabels 标签精确匹配 匹配生产环境子网标签
条件匹配 matchExpressions 表达式集合匹配 CIDR 白名单/黑名单
字段访问 spec.forProvider 访问资源 spec 字段 检查 VPC CIDR、路由表 ID
逻辑操作 and / or / not 组合多个条件 同时检查标签和 CIDR
集合操作 in / not in 成员关系判断 允许的可用区列表
动作 allow / deny / audit 策略执行动作 拒绝非合规资源创建
优先级 priority 规则排序(1-1000) 基础策略优先于审计策略