|
本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。 |
|
这是尚未发布的文档。 Admission Controller 1.34-dev. |
SUSE Security Admission Controller 与 OPA Gatekeeper
|
此页面来自 2023 年 8 月。自那时以来,这两个项目可能已经发展。 如果您发现有缺失或不准确的内容,请https://github.com/kubewarden/docs/[提交问题]或使用页面底部的链接打开 PR。 |
OPA Gatekeeper 和 Kubewarden(SUSE Security Admission Controller 的来源)都是开源项目,属于 CNCF。
此表提供 OPA Gatekeeper 和 Admission Controller 之间的比较。需要更多信息的主题有进一步解释的链接。
| 功能 | OPA Gatekeeper | Admission Controller |
|---|---|---|
Validation |
✅ |
✅ |
变更 |
✅ |
✅ |
策略语言 [1] |
Rego |
Rego、CEL、Go、Rust,… |
上下文感知 [2] |
✅ |
✅ |
Kubernetes 集成 [3] |
集群范围的 CRD |
集群范围和命名空间的 CRD |
策略分发 [4] |
嵌入到 Kubernetes CR 中 |
容器注册表,或嵌入到 Kubernetes CR 中(CEL) |
CI/CD 集成 [5] |
✅ |
✅ |
策略强制模式 |
拒绝,警告 |
拒绝,警告 |
部署模式 [6] |
单个评估服务器 |
多个评估服务器 |
背景检查 [7] |
✅ |
✅ |
编写策略
上下文感知
有时,策略需要关于集群当前状态的数据,以做出验证或变更决策。例如,验证Ingress资源的策略可能需要知道集群中已定义的其他Ingress资源,以确保不会发生冲突。Admission Controller称这些策略为“上下文感知”。
OPA Gatekeeper 和 Admission Controller 都支持这些类型的策略。
在部署 OPA Gatekeeper 时,Kubernetes 管理员决定在评估时向策略提供哪种类型的集群数据。
重要的是要强调这些数据如何被所有已部署的策略访问。
例如,如果 OPA Gatekeeper 策略需要访问 Kubernetes Secrets,则所有其他已部署的策略也能够读取这些数据。
相反,Admission Controller 提供对集群资源的细粒度访问。 每个策略仅能访问 Kubernetes 管理员指定的资源。尝试读取未经授权的数据会立即被阻止,并报告给集群管理员。
Kubernetes 集成
OPA Gatekeeper 具有集群范围的自定义资源,允许策略定义以及如何和在哪里强制执行它们。
Admission Controller 有两种不同类型的自定义资源用于声明策略。一种在集群级别工作,另一种是名称空间级别的。名称空间自定义资源的名称是 AdmissionPolicy。
通过 AdmissionPolicy 资源部署的策略仅影响其所属名称空间内创建的资源。因此,您可以允许非管理员的 Kubernetes 用户拥有管理 AdmissionPolicy 资源所需的 RBAC 权限,前提是他们可以访问的名称空间。
这使得 Kubernetes 管理员能够委派与策略相关的工作。
策略分发
OPA Gatekeeper 和 Admission Controller 策略在定义 Kubernetes 中策略的自定义资源中具有策略源代码(OPA Gatekeeper 的 Rego,Admission Controller 的 CEL)。
此外,Admission Controller 策略可以像容器镜像一样管理策略的源代码(对于 Rego、Go、Rust、…)。一旦构建完成,它们会作为 OCI 工件推送到容器注册表中。
您可以使用像 Admission Controller 这样的容器镜像工具对 cosign 策略进行签名和验证,来自 Sigstore 项目。
您可以使用传统的工具和流程在地理分布的容器注册表之间分发 Admission Controller 策略,这些工具和流程是为容器镜像采用的。
CI/CD 集成
OPA Gatekeeper 和 Admission Controller 都是使用 GitOps 方法进行管理的。
然而,对于 OPA Gatekeeper,策略的 Rego 代码与用于在 Kubernetes 中部署它的自定义资源之间存在耦合。 这在 CI/CD 管道中引入了额外的步骤。
Rego 具有 测试工具,允许创建单元测试套件。编写测试并在 CI/CD 管道中执行它们对于确保策略按预期行为至关重要。
要使用这些测试工具,策略的源代码必须以专用文本文件的形式提供。无法从用于声明 OPA Gatekeeper 策略的 YAML 文件中读取源代码。CI/CD 管道必须将 Rego 源代码与在 OPA Gatekeeper 自定义资源中定义的代码进行同步以进行测试。您可以使用第三方工具来实现这一点。
Admission Controller 策略具有像传统微服务一样的 CI/CD 管道。 通常,它们的源代码存储在 Git 仓库中,然后使用传统的 CI/CD 系统对其进行单元测试。您使用编写策略所用语言的测试框架编写单元测试。一旦所有测试通过,您将策略编译为 WebAssembly 并推送到容器注册表。这种管道通常由策略作者维护。
Kubernetes 管理员通常维护其他自动化管道,以响应策略的新版本(使用自动化工具如 Dependabot、https://www.mend.io/renovate/[Renovate bot]、https://www.updatecli.io/[updatecli] 等),或响应策略配置的更改。
该管道对不同类型的请求进行策略测试。您可以使用 kwctl CLI 工具进行测试,而无需运行 Kubernetes 集群。kwctl CLI 工具使用与在 Kubernetes 集群中部署的 Admission Controller 堆栈相同的评估引擎。
策略强制模式
OPA Gatekeeper 和 Admission Controller 都可以使用两种不同的操作模式部署策略:
-
deny:违反策略会拒绝请求 -
warn:违反策略不会导致拒绝,并被记录
部署模式
同一服务器评估所有 OPA Gatekeeper 策略。相反,Admission Controller 允许定义多个评估服务器。您通过名为 PolicyServer 的自定义资源定义这些服务器。
在声明 Admission Controller 策略时,Kubernetes 管理员决定哪个 PolicyServer 托管它。
|
每个 |
这允许出现以下有趣的场景:
-
将关键策略部署到专用的策略服务器池。
-
将嘈杂租户的策略部署到专用的策略服务器池中。
背景检查
随着策略的添加、删除和重新配置,集群中已经存在的资源可能会变得不合规。
OPA Gatekeeper 和 Admission Controller 都有一个在后台运行的扫描器。该扫描器评估集群中已定义的资源,并标记不合规的资源。
OPA Gatekeeper 和 Admission Controller 之间唯一的区别在于扫描器结果的保存方式。
OPA Gatekeeper 将违规细节添加到给定 Constraint 自定义资源的 status 字段中(请参见 这里)。
Admission Controller 则将结果存储在由 openreports.io 定义的一组 Reports 自定义资源中。