文档首页/ 华为云UCS/ 用户指南/ 策略中心/ 策略定义与策略实例的基本概念
更新时间:2024-04-15 GMT+08:00

策略定义与策略实例的基本概念

策略定义

在创建策略实例之前,您需要先定义一个策略定义,它描述了强制执行约束的Rego代码和约束的模式。约束的模式允许管理员像调整函数参数一样微调约束的行为。策略定义中的Rego代码描述了强制执行的具体逻辑,根据您的需求来实现不同的合规性规则。而约束模式则提供了一种灵活的方式,让管理员在创建策略实例时,能够根据实际需求调整策略行为,以满足不同场景的合规控制需求。策略定义的详细说明请参见官方文档

下面是一个示例策略定义,它要求所有在约束中描述的标签都必须存在。

apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8srequiredlabels
spec:
  crd:
    spec:
      names:
        kind: K8sRequiredLabels
      validation:
        # Schema for the `parameters` field
        openAPIV3Schema:
          type: object
          properties:
            labels:
              type: array
              items:
                type: string
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8srequiredlabels
        violation[{"msg": msg, "details": {"missing_labels": missing}}] {
          provided := {label | input.review.object.metadata.labels[label]}
          required := {label | label := input.parameters.labels[_]}
          missing := required - provided
          count(missing) > 0
          msg := sprintf("you must provide labels: %v", [missing])
        }

策略实例

策略实例用于告知Gatekeeper应执行哪个策略定义以及如何执行。策略实例的详细说明请参见官方文档

下面是一个策略实例示例,该示例使用先前提到的K8sRequiredLabels策略定义,确保Gatekeeper在所有命名空间上强制执行指定的标签。

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sRequiredLabels
metadata:
  name: ns-must-have-gk
spec:
  enforcementAction: deny
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]
  parameters:
    labels: ["gatekeeper"]

改策略实例示例指定了使用“K8sRequiredLabels”策略定义并将执行策略的操作设置为“deny”,这意味着Gatekeeper将拒绝违反策略的请求。“match”部分限制了此策略实例仅适用于命名空间资源。“parameters”部分指定了必须存在于资源上的标签,本例中为“gatekeeper”。