4

我们希望使用 OPA 网守来审计 K8s PodDisruptionBudget (PDB) 对象。特别是,我们正在寻求审计该领域disruptionsAllowed内的数量status

我相信这个字段在准入时将不可用,因为一旦 PDB 应用于集群,它就会由 apiserver 计算和添加。

似乎对于例如 Pod,该status字段作为AdmissionReview对象 [1] 的一部分传递。在该特定示例中,似乎只有准入前状态字段才能进入AdmissionReview对象。

1.) 对于 PDB,是否可以审计当前的集群内状态字段?

2.) 考虑到 OPA Gatekeeper 作为准入控制器的预期用途,这是否会被视为反模式?

[1] https://www.openpolicyagent.org/docs/latest/kubernetes-introduction/

4

1 回答 1

1

这实际上是相当合理的,并且是Audit的用例之一。您只需要确保审核已启用并spec.enforcementAction: dryrun在约束中设置。

这是 ConstraintTemplate 的 Rego 外观示例。OPA 游乐场

deny[msg] {
    value := input.request.object.status.disruptionsAllowed
    value > maxDisruptionsAllowed

    msg := sprintf("status.disruptionsAllowed must be <%v> or fewer; found <%v>", [maxDisruptionsAllowed, value])
}

在具体的 Constraint 中,一定要设置enforcementAction为,dryrun这样 Constraint 就不会阻止 k8s 更新 status 字段。例如:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sAllowedPodDisruptions
metadata:
  name: max-disruptions
spec:
  enforcementAction: dryrun
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["PodDisruptionBudget"]
    namespaces:
      - "default"
  parameters:
    maxDisruptionsAllowed:
      - 10

如果忘记设置enforcementAction,k8s 将无法更新 PodDisruptionBudget 的 status 字段。

于 2021-05-11T16:17:15.503 回答