---
title: OPA Gatekeeper
---

为了确保一致性和合规性，每个组织都需要能够以自动化的方式在环境中定义和执行策略。[OPA（Open Policy Agent）](https://www.openpolicyagent.org/) 是一个策略引擎，用于基于策略控制云原生环境。Rancher 支持在 Kubernetes 集群中启用 OPA Gatekeeper，并且还安装了一些内置的策略定义（也称为约束模板）。

OPA 提供了一种高级声明性语言，可以让你将策略指定为代码，还能扩展简单的 API，从而减轻策略决策的负担。

[OPA Gatekeeper](https://github.com/open-policy-agent/gatekeeper) 是一个提供 OPA 和 Kubernetes 集成的项目。OPA Gatekeeper 提供：

- 一个可扩展的参数化策略库。
- 用于实例化策略库的原生 Kubernetes CRD，也称为“约束”。
- 用于扩展策略库的原生 Kubernetes CRD，也称为“约束模板”。
- 审计功能。

要了解更多关于 OPA 的信息，请参阅[官方文档](https://www.openpolicyagent.org/docs/latest/)。

## OPA Gatekeeper 集成的工作原理

Kubernetes 支持通过准入控制器（准入控制器）webhook 来扩展 API Server 的功能，创建、更新或删除资源时都会调用这些 webhook。Gatekeeper 作为验证 webhook 安装，并执行由 Kubernetes CRD（Custom Resource Definition）定义的策略。除了使用准入控制之外，Gatekeeper 还能审计 Kubernetes 集群中的现有资源，并对违反当前策略的情况进行标记。

OPA Gatekeeper 由 Rancher 的 Helm system Chart 提供，它安装在名为 `gatekeeper-system` 的命名空间中。

## 在集群中启用 OPA Gatekeeper

:::note

Rancher 2.5 改进了 OPA Gatekeeper 应用。无法从 Rancher 2.4 升级到 Rancher 2.5 中的新版本。如果你在 Rancher 2.4 中安装了 OPA Gatekeeper，则需要在旧 UI 中卸载 OPA Gatekeeper 及其 CRD，然后在 Rancher 2.5 中重新安装它。如需卸载 CRD，请在 kubectl 控制台中运行 `kubectl delete crd configs.config.gatekeeper.sh constrainttemplates.templates.gatekeeper.sh` 命令。

:::

:::note 先决条件：

只有管理员和集群所有者才能启用 OPA Gatekeeper。

:::

你可以在 **Apps** 页面安装 OPA Gatekeeper Helm Chart。

### 启用 OPA Gatekeeper

1. 在左上角，单击 **☰ > 集群管理**。
1. 在**集群**页面中，转到要启用 OPA Gatekeeper 的集群，然后单击 **Explore**。
1. 在左侧导航栏中，点击 **Apps**。
1. 点击 **Charts** 并点击 **OPA Gatekeeper**。
1. 单击**安装**。

**结果**：已将 OPA Gatekeeper 部署到你的 Kubernetes 集群。

## 约束模板

[约束模板](https://github.com/open-policy-agent/gatekeeper#constraint-templates)是 Kubernetes 自定义资源，用于定义要由 Gatekeeper 应用的 OPA 策略的架构和 Rego 逻辑。有关 Rego 策略语言的更多信息，请参阅[官方文档](https://www.openpolicyagent.org/docs/latest/policy-language/)。

启用 OPA Gatekeeper 后，Rancher 默认会安装一些模板。

要列出集群中安装的约束模板，请转到 OPA Gatekeeper 下的左侧菜单，然后单击**模板**。

Rancher 还支持通过导入 YAML 定义来创建你自己的约束模板。

## 创建和配置约束

[约束](https://github.com/open-policy-agent/gatekeeper#constraints)是 Kubernetes 自定义资源，用于定义要应用约束模板的对象范围。约束模板和约束共同定义一个完整的策略。

:::note 先决条件：

集群中已启用 OPA Gatekeeper。

:::

要列出已安装的约束，请转到 OPA Gatekeeper 下的左侧菜单，然后单击**约束**。

可以从约束模板创建新的约束。

Rancher 支持通过使用方便的表单来创建约束，你可以在该表单中输入各种约束字段。

**以 YAML 文件编辑**选项也可以用于配置约束的 YAML 定义。

### 使 Rancher 的 System 命名空间不受约束

创建约束时，请确保该约束不应用于任何 Rancher 或 Kubernetes System 命名空间。如果不排除 System 命名空间，则可能会出现 system 命名空间下的许多资源被标记为违反约束。

要让约束仅限制用户命名空间，请在约束的**匹配**字段下指定这些命名空间。

此外，该约束可能会干扰其他 Rancher 功能并拒绝部署系统工作负载。为避免这种情况，请从你的约束中排除所有 Rancher 特定的命名空间。

## 在集群中实施约束

如果**执行动作**为 **Deny**，约束会立即启用，并拒绝任何违反策略的请求。默认情况下，执行的值为 **Deny**。

如果**执行动作** 为 **Dryrun**，违反策略的资源仅会记录在约束的状态字段中。

要强制执行约束，请使用表单创建约束。在**执行动作**字段中，选择 **Deny**。

## 集群中的审计和违规

OPA Gatekeeper 运行定期审计，以检查现有资源是否违反强制执行的约束。你可以在安装 Gatekeeper 时配置审计间隔（默认 300 秒）。

Gatekeeper 页面上列出了违反已定义的约束的情况。

此外，你也可以在**约束**页面中找到违反约束的数量。

每个约束的详细信息视图列出了违反约束的资源的信息。

## 禁用 Gatekeeper

1. 导航到集群的仪表板视图。
1. 在左侧菜单中，展开集群菜单并单击 **OPA Gatekeeper**。
1. 单击 **⋮ > 禁用**。

**结果**：禁用 OPA Gatekeeper 后，所有约束模板和约束也将被删除。

