Gatekeeper/OPA 在不使用标签的情况下限制命名空间的子集
Gatekeeper/OPA constraints on a subset of namespaces without using labels
我正在使用 gatekeeper/OPA 为我在特定命名空间中拥有 运行 的各种服务创建约束。为此,我依靠 namespaceSelectors 将约束仅匹配到一组名称空间。我的 CI/CD 流程负责使用我的约束将要查找的所需标签来标记我的所有自定义名称空间。
但是我现在需要确保没有创建没有所需标签的新命名空间(否则这个命名空间将忽略我的所有约束)。我的 CI/CD 工具应用了这些标签这一事实不允许我确定在我的集群中没有创建没有这些标签的其他命名空间。
如果我在所有命名空间上应用 k8srequiredlabels[2] 约束模板,这将发现系统命名空间(例如 kube-system)存在违规。看门人约束允许您指定以下任一项以匹配您的约束[1]:
labelSelector
namespaceSelector
namespaces list
理想情况下我想确保所有命名空间上都有 x 标签,排除列表中的命名空间除外(例如 kube-system).但是,没有以独占方式使用上述 'Namespaces' 列表的选项,而其他 2 个选项需要有人手动将标签添加到新创建的名称空间(这为错误打开了空间)。
- 关于如何确保集群子集的任何建议
命名空间有 x 个标签,无需手动标记它们,并且
使用 label/namespaceSelector?
- 您将如何防止使用 OPA & 创建名称空间
网守,如果它不符合某些标准,例如有 x
上面有标签吗?
[1] https://github.com/open-policy-agent/gatekeeper/pull/131/files
您可以使用 Helm 为特定命名空间动态分配标签。
namespace 值可以从 --namespace
参数派生,该参数与 helm chart 部署到的命名空间相同。在图表中,应该使用 {{.Release.Namespace}}
访问它。或者,您可以在使用 helm upgrade 部署 helm chart 时使用 --set
设置这些命名空间。如果环境很少,您可以在 values.yaml 中作为别名访问它们,然后像这样为它们设置命名空间值:
helm upgrade \
<chart_name> \
<path_to_the_chart> \
--set <environment_one>.namespace=namespace1 \
--set <environment_two>.namespace=namespace2 \
...
请看一下:dynamic-namespace-variable。
要检查特定命名空间是否具有正确的标签,请使用 Webhook 准入控制器。
在这里您可以找到更多信息:webhook-admssion-controller。
问题1可以通过使用OPA本身来解决。您可以使用 OPA (https://github.com/open-policy-agent/opa/issues/943) 编写可变 webhook 以将标签添加到新创建的命名空间,或者您可以编写可变控制器(使用 Golang)。下面两者做同样的事情。
对于第二个问题,您需要在您的 rego 文件中添加关于命名空间创建的验证规则,并验证标签是否存在。
额外相关信息:要根据标签对特定命名空间执行操作,您可以在 validating/mutating webhook 配置中添加 namesapceSelector。
我正在使用 gatekeeper/OPA 为我在特定命名空间中拥有 运行 的各种服务创建约束。为此,我依靠 namespaceSelectors 将约束仅匹配到一组名称空间。我的 CI/CD 流程负责使用我的约束将要查找的所需标签来标记我的所有自定义名称空间。
但是我现在需要确保没有创建没有所需标签的新命名空间(否则这个命名空间将忽略我的所有约束)。我的 CI/CD 工具应用了这些标签这一事实不允许我确定在我的集群中没有创建没有这些标签的其他命名空间。
如果我在所有命名空间上应用 k8srequiredlabels[2] 约束模板,这将发现系统命名空间(例如 kube-system)存在违规。看门人约束允许您指定以下任一项以匹配您的约束[1]:
labelSelector
namespaceSelector
namespaces list
理想情况下我想确保所有命名空间上都有 x 标签,排除列表中的命名空间除外(例如 kube-system).但是,没有以独占方式使用上述 'Namespaces' 列表的选项,而其他 2 个选项需要有人手动将标签添加到新创建的名称空间(这为错误打开了空间)。
- 关于如何确保集群子集的任何建议 命名空间有 x 个标签,无需手动标记它们,并且 使用 label/namespaceSelector?
- 您将如何防止使用 OPA & 创建名称空间 网守,如果它不符合某些标准,例如有 x 上面有标签吗?
[1] https://github.com/open-policy-agent/gatekeeper/pull/131/files
您可以使用 Helm 为特定命名空间动态分配标签。
namespace 值可以从 --namespace
参数派生,该参数与 helm chart 部署到的命名空间相同。在图表中,应该使用 {{.Release.Namespace}}
访问它。或者,您可以在使用 helm upgrade 部署 helm chart 时使用 --set
设置这些命名空间。如果环境很少,您可以在 values.yaml 中作为别名访问它们,然后像这样为它们设置命名空间值:
helm upgrade \
<chart_name> \
<path_to_the_chart> \
--set <environment_one>.namespace=namespace1 \
--set <environment_two>.namespace=namespace2 \
...
请看一下:dynamic-namespace-variable。
要检查特定命名空间是否具有正确的标签,请使用 Webhook 准入控制器。
在这里您可以找到更多信息:webhook-admssion-controller。
问题1可以通过使用OPA本身来解决。您可以使用 OPA (https://github.com/open-policy-agent/opa/issues/943) 编写可变 webhook 以将标签添加到新创建的命名空间,或者您可以编写可变控制器(使用 Golang)。下面两者做同样的事情。
对于第二个问题,您需要在您的 rego 文件中添加关于命名空间创建的验证规则,并验证标签是否存在。
额外相关信息:要根据标签对特定命名空间执行操作,您可以在 validating/mutating webhook 配置中添加 namesapceSelector。