本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

这是尚未发布的文档。 Admission Controller 1.34-dev.

创建新的 Gatekeeper Rego 策略

在本教程中,您将实现与您在 Open Policy Agent 中编写的相同策略。 即,如果资源目标是 default 名称空间,则拒绝该资源的策略。

有一个 储存库模板,您可以将其用作移植现有策略的基础。

要求

您需要以下工具:

  • opa

  • kwctl

该策略

Gatekeeper 策略必须返回零个或多个违规对象。 如果没有报告违规,则请求被接受。 如果报告一个或多个违规,则请求被拒绝。

创建一个名为 rego-policy 的新文件夹。 在其中,创建一个 policy.rego 文件,内容为:

package policy

violation[{"msg": msg}] {
        input.review.object.metadata.namespace == "default"
        msg := "it is forbidden to use the default namespace"
}

在这种情况下,入口点是 policy/violation,由于 Rego 的工作方式,策略可以有以下结果:

  • 返回 1 个违规:审核的对象目标是默认名称空间。

  • 返回 0 个违规:审核的对象符合该策略。

花点时间将此策略与在 Open Policy Agent 部分编写的策略进行比较。 那个策略需要构建整个 AdmissionReview 响应,输入略有不同。 在 Gatekeeper 模式下,AdmissionRequest 对象具有 input.review 属性。 AdmissionRequest 的所有属性和 object 都是可读的。

现在,您可以创建请求以在下一部分进行评估。

您首先在 data 目录中创建一个包含以下内容的 default-ns.json 文件:

{
  "apiVersion": "admission.k8s.io/v1",
  "kind": "AdmissionReview",
  "request": {
    "uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
    "operation": "CREATE",
    "object": {
      "kind": "Pod",
      "apiVersion": "v1",
      "metadata": {
        "name": "nginx",
        "namespace": "default",
        "uid": "04dc7a5e-e1f1-4e34-8d65-2c9337a43e64"
      }
    }
  }
}

现在,创建另一个 AdmissionReview 对象,这次针对与 default 不同的名称空间。 将此文件命名为 other-ns.json。 它包含以下内容:

{
  "apiVersion": "admission.k8s.io/v1",
  "kind": "AdmissionReview",
  "request": {
    "uid": "1299d386-525b-4032-98ae-1949f69f9cfc",
    "operation": "CREATE",
    "object": {
      "kind": "Pod",
      "apiVersion": "v1",
      "metadata": {
        "name": "nginx",
        "namespace": "other",
        "uid": "04dc7a5e-e1f1-4e34-8d65-2c9337a43e64"
      }
    }
  }
}

您可以看到,这模拟了另一个 pod 创建请求,这次是在名为 other 的名称空间下。