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 网络拓扑中的解析流程,从资源创建请求到策略引擎裁决的完整路径:
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)
当多条策略规则同时匹配同一资源时,优先级决定了最终动作。下图展示了优先级冲突的解决机制:
误报高发区:当多条规则优先级相同时,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) | 基础策略优先于审计策略 |