0

我正在使用网守/OPA 为我在特定命名空间中运行的各种服务创建约束。为此,我依靠 namespaceSelectors 将约束与一组命名空间相匹配。我的 CI/CD 流程负责使用我的约束将要查找的所需标签来标记我的所有自定义命名空间。

但是,我现在需要确保在没有所需标签的情况下不会创建新的命名空间(否则这个命名空间将忽略我的所有约束)。我的 CI/CD 工具应用了这些标签这一事实并不能让我确定在没有这些标签的情况下我的集群中没有创建其他命名空间。

如果我在所有命名空间上应用 k8srequiredlabels[2] 约束模板,这将发现对系统命名空间(如 kube-system)的违反。网守约束允许您指定以下任一项以匹配您的约束[1]:

labelSelector
namespaceSelector
namespaces list

理想情况下,我想说我想确保所有名称空间上都有 x 标签,排除列表中的名称空间除外(例如 kube-system)。但是,没有选项可以以独占方式使用上述“命名空间”列表,而其他 2 个选项需要有人手动将标签添加到新创建的命名空间(这为错误提供了空间)。

  • 关于如何确保集群命名空间的子集具有 x 个标签而无需手动标记它们并使用标签/命名空间选择器的任何建议?
  • 如果名称空间不符合某些条件(例如带有 x 标签),您将如何防止使用 OPA 和 Gatekeeper 创建名称空间?

[1] https://github.com/open-policy-agent/gatekeeper/pull/131/files

[2] https://github.com/open-policy-agent/gatekeeper/blob/master/demo/agilebank/templates/k8srequiredlabels_template.yaml

4

2 回答 2

2

问题 1 可以通过使用 OPA 本身来解决。您可以使用 OPA ( https://github.com/open-policy-agent/opa/issues/943 )编写变异 webhook 来为新创建的命名空间添加标签,或者您可以编写变异控制器(使用 Golang)。在下面两者都做同样的事情。

对于第二个问题,您需要在创建命名空间时在 rego 文件中添加验证规则并验证标签是否存在。

额外相关信息:要根据标签对特定命名空间执行操作,您可以在验证/变异 webhook 配置中添加 namesapceSelector。

于 2020-02-15T06:56:13.663 回答
0

您可以使用Helm为特定命名空间动态分配标签。

命名空间值可以从--namespace与 helm chart 部署到的同一命名空间的参数中派生。在图表中,应使用{{.Release.Namespace}}then 访问它。或者,您可以--set在使用 helm upgrade 部署 helm chart 时设置这些命名空间。如果环境很少,您可以在 values.yaml 中将它们作为别名访问,然后为它们设置命名空间值,如下所示:

helm upgrade \
   <chart_name> \
      <path_to_the_chart> \
        --set <environment_one>.namespace=namespace1 \
        --set <environment_two>.namespace=namespace2 \
...

请看一下:动态命名空间变量

要检查特定命名空间是否具有正确的标签,请使用Webhook 准入控制器。

在这里您可以找到更多信息:webhook-admssion-controller

于 2020-01-10T12:38:53.690 回答