首页 > 解决方案 > 防止非空命名空间删除

问题描述

我有约束模板 yaml 代码策略来防止所有命名空间被删除。

现在我想创建一个策略来防止仅删除非空命名空间,即包含 pod、ingress、pv、pvc、secret、service 等资源。

因此空的命名空间应该可以被删除,但包含内容的命名空间不应该被删除。

对此有什么建议吗?

模板:

apiVersion: templates.gatekeeper.sh/v1beta1
kind: ConstraintTemplate
  metadata:
    name: k8snamespacecannotbedeleted 
  spec:
    crd:
      spec:
        names:
          kind: K8sNamespaceCannotBeDeleted 
      targets:
        - target: admission.k8s.gatekeeper.sh
          rego: |
            package kubernetes.admission     
            violation[{"msg": msg}] {
              input.review.kind.kind == "Namespace"
              input.review.operation == "DELETE"
              msg := "[OPA] Namespace deletions are not permitted"         
            }

约束:

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sNamespaceCannotBeDeleted
metadata:
  name: namespace-cannot-be-deleted
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Namespace"]

标签: githubazure-devopsyamldevopsopen-policy-agent

解决方案


它可能有点太晚了,但这就是我解决这个问题的方法:

第一步:用您喜欢的语言创建一个调用 API 服务器的 cronjob,每 x 分钟运行一次以检查非空命名空间,向这些命名空间添加注释,如“can_delete”:“no”

第二步:

编辑你的rego代码并检查是否有任何名为“can_delete”的注释,如果有,并将其设置为“no”,防止删除


推荐阅读