使用 Gatekeeper 开展 OPA 策略管理
发布时间:2022-04-15 15:15:36 所属栏目:云计算 来源:互联网
导读:前面我们介绍了使用 kube-mgmt 这个 sidecar 容器来完成 OPA 策略的自动同步,此外还有另外一个更加高级的工具 Gatekeeper,相比于之前的模式,Gatekeeper(v3.0) 准入控制器集成了 OPA Constraint Framework,以执行基于 CRD 的策略,并允许声明式配置的策略
前面我们介绍了使用 kube-mgmt 这个 sidecar 容器来完成 OPA 策略的自动同步,此外还有另外一个更加高级的工具 Gatekeeper,相比于之前的模式,Gatekeeper(v3.0) 准入控制器集成了 OPA Constraint Framework,以执行基于 CRD 的策略,并允许声明式配置的策略可靠地共享,使用 kubebuilder 构建,它提供了验证和修改准入控制和审计功能。这允许为 Rego 策略创建策略模板,将策略创建为 CRD,并在策略 CRD 上存储审计结果,这个项目是谷歌、微软、红帽和 Styra 一起合作实现的。 然后下面的 targets 部分就是定义的约束目标,使用 Rego 进行编写。 首先通过 provided := {label | input.review.object.metadata.labels[label]} 获取到创建对象的所有 label 标签。 然后通过 required := {label | label := input.parameters.labels[_]} 获取到需要提供的 label 标签。 将上面两个标签集合相减(rego语言支持该操作),得到未满足的 label。 断言未满足的label数量>0,如果大于0,说明条件满足,violation 为 true,说明违反了约束,返回错误。 上面的约束模板创建完成后,实际上相当于创建了一个名为的 K8sRequiredLabels 对象,我们定义的属性位于 spec.parameters 属性下面: 复制 ➜ kubectl get K8sRequiredLabels No resources found ➜ kubectl explain K8sRequiredLabels.spec.parameters.labels KIND: K8sRequiredLabels VERSION: constraints.gatekeeper.sh/v1beta1 FIELD: labels <[]string> DESCRIPTION: A label string 1. 2. 3. 4. 5. 6. 7. 8. 现在我们就可以使用上面的 K8sRequiredLabels 这个约束模板来定义策略了,比如我们要求在所有命名空间上都定义一个 gatekeeper 的标签,则可以创建如下所示的对象: 复制 # all_ns_must_have_gatekeeper.yaml apiVersion: constraints.gatekeeper.sh/v1beta1 kind: K8sRequiredLabels metadata: name: ns-must-have-gk spec: match: kinds: - apiGroups: [""] kinds: ["Namespace"] # 表示这个约束会在创建命名空间的时候被应用,可以使用 namespaceSelector、namespaces等进行过滤 kind 接受带有 apiGroups 和 kind 字段的对象列表,这些字段列出了约束将应用到的对象的组/种类。如果指定了多个组/种类对象,则资源在范围内只需要一个匹配项。 scope 接受 、Cluster 或 Namespaced 决定是否选择集群范围和/或命名空间范围的资源。(默认为) namespaces 是命名空间名称的列表。如果已定义,则约束仅适用于列出的命名空间中的资源。命名空间还支持基于前缀的 glob。例如,namespaces: [kube-*] 匹配 kube-system 和 kube-public。 excludeNamespaces 是命名空间名称的列表。如果已定义,则约束仅适用于不在列出的命名空间中的资源。ExcludedNamespaces 还支持基于前缀的 glob,例如,excludedNamespaces: [kube-*] 匹配 kube-system 和 kube-public。 labelSelector 是标准的 Kubernetes 标签选择器。 namespaceSelector 是针对对象的包含名称空间或对象本身的标签选择器,如果对象是名称空间。name 是对象的名称。如果已定义,则匹配具有指定名称的对象。Name 还支持基于前缀的 glob。例如,名称:pod-* 匹配 pod-a 和 pod-b。 下面的 parameters.labels 就是根据上面的 CRD 规范定义的属性,该值是传递给 opa 的参数,此处表示一个 key 为 labels,value 为一个列表的字典,与 ConstraintTemplate 里的 properties 要匹配上,此处表示要创建的对象需要含有 gatekeeper 的 label。 (编辑:PHP编程网 - 黄冈站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |