更新时间:2025-02-06 GMT+08:00
分享

Gatekeeper

插件简介

Gatekeeper是一个基于开放策略(OPA)的可定制的云原生策略控制器,有助于策略的执行和治理能力的加强,在集群中提供了更多符合Kubernetes应用场景的安全策略规则。

开源社区地址:https://github.com/open-policy-agent/gatekeeper

使用方式:https://open-policy-agent.github.io/gatekeeper/website/docs/

约束与限制

如果您已经在集群中部署了社区的Gatekeeper,请您先将其卸载后再安装CCE提供的Gatekeeper插件,否则可能会出现插件安装失败的情况。

注意事项

Gatekeeper提供的webhook的能力可能会影响Kubernetes基本资源的使用,请确保业务必须使用webhook能力,并慎重评估使用该插件引入的风险。

Gatekeeper是CCE基于开源软件进行适配并集成的精选开源插件,CCE将提供全面的技术支持服务。然而,CCE不承担因开源软件缺陷导致的业务损失责任,也不承担赔偿或额外的服务,强烈建议用户定期升级软件以修复潜在问题。

安装步骤

  1. 登录CCE控制台,单击集群名称进入集群,单击左侧导航栏的“插件中心”,在右侧找到opa-gatekeeper插件,单击“安装”
  2. 在安装插件页面,设置“规格配置”

    表1 插件规格配置

    参数

    参数说明

    插件规格

    该插件可配置“高可用”“单实例”“自定义”规格。

    实例数

    选择上方插件规格后,显示插件中的实例数。

    选择“自定义”规格时,您可根据需求调整插件实例数。

    实例数为1时插件不具备高可用能力,当插件实例所在节点异常时可能导致插件功能无法正常使用,请谨慎选择。

    容器

    选择“自定义”规格时,您可根据需求调整插件实例的容器规格。

  3. 选择需要修改的配置,修改参数值。详情请参见社区参数说明
  4. 设置插件实例的部署策略。

    • 调度策略对于DaemonSet类型的插件实例不会生效。
    • 设置多可用区部署或节点亲和策略时,需保证集群中存在满足调度策略的节点且拥有足够的资源,否则插件实例将无法运行。
    表2 插件调度配置

    参数

    参数说明

    多可用区部署

    • 优先模式:优先将插件的Deployment实例调度到不同可用区的节点上,如集群下节点不满足多可用区,插件实例将调度到单可用区下的不同节点。
    • 均分模式:插件Deployment实例均匀调度到当前集群下各可用区,增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署;均分模式限制不同可用区间插件实例数相差不超过1,单个可用区资源不足会导致后续其他实例无法调度。
    • 强制模式:插件Deployment实例强制调度到不同可用区的节点上,每个可用区下最多运行一个实例。如集群下节点不满足多可用区,插件实例将无法全部运行。节点故障后,插件实例存在无法迁移风险。

    节点亲和

    • 不配置:插件实例不指定节点亲和调度。
    • 指定节点调度:指定插件实例部署的节点。若不指定,将根据集群默认调度策略进行随机调度。
    • 指定节点池调度:指定插件实例部署的节点池。若不指定,将根据集群默认调度策略进行随机调度。
    • 自定义亲和策略:填写期望插件部署的节点标签实现更灵活的调度策略,若不填写将根据集群默认调度策略进行随机调度。

      同时设置多条自定义亲和策略时,需要保证集群中存在同时满足所有亲和策略的节点,否则插件实例将无法运行。

    容忍策略

    容忍策略与节点的污点能力配合使用,允许(不强制)插件的 Deployment 实例调度到带有与之匹配的污点的节点上,也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。

    插件会对实例添加针对node.kubernetes.io/not-readynode.kubernetes.io/unreachable污点的默认容忍策略,容忍时间窗为60s。

    详情请参见设置容忍策略

  5. 单击“安装”

组件说明

表3 Gatekeeper组件

容器组件

说明

资源类型

gatekeeper-audit

提供audit相关信息。

Deployment

gatekeeper-controller-manager

提供Gatekeeper的webhook能力,按照用户自定义的策略对k8s资源进行控制。

Deployment

使用示例

本示例将演示如何通过Gatekeeper插件实现限制指定命名空间下创建的Pod必须包含一个名为test-label的标签。更多Gatekeeper的用法,可参考官网文档

  1. 请参见通过kubectl连接集群,使用kubectl连接集群。
  2. 执行以下命令,创建一个测试的命名空间test-gatekeeper。

    kubectl create ns test-gatekeeper

  3. 执行以下命令,创建一个检查标签的策略模板。

    kubectl apply -f - <<EOF
    apiVersion: templates.gatekeeper.sh/v1beta1
    kind: ConstraintTemplate
    metadata:
      name: k8srequiredlabels
    spec:
      crd:
        spec:
          names:
            kind: K8sRequiredLabels
          validation:
            openAPIV3Schema:
              properties:
                labels:
                  type: array
                  items:
                    type: string
      targets:
        - target: admission.k8s.gatekeeper.sh
          rego: |
            package k8srequiredlabels
            violation[{"msg": msg, "details": {"missing_labels": missing}}] {
              provided := {label | input.review.object.metadata.labels[label]}
              required := {label | label := input.parameters.labels[_]}
              missing := required - provided
              count(missing) > 0
              msg := sprintf("you must provide labels: %v", [missing])
            }
    EOF

  4. 执行以下命令,创建上述策略模板的约束,这个约束限制test-gatekeeper命名空间下创建的Pod必须包含名为test-label的标签。

    kubectl apply -f - <<EOF
    apiVersion: constraints.gatekeeper.sh/v1beta1
    kind: K8sRequiredLabels
    metadata:
      name: pod-must-have-test-label
    spec:
      match:
        kinds:
          - apiGroups: [""]
            kinds: ["Pod"]
        namespaces:
          - test-gatekeeper
      parameters:
        labels: ["test-label"]
    EOF

  5. 验证约束的效果。

    1. 执行以下命令,在test-gatekeeper命名空间下创建一个不包含test-label标签的Pod。
      kubectl -n test-gatekeeper run test-deny --image=nginx --restart=Never

      预期输出:

      Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request: [pod-must-have-test-label] you must provide labels: {"test-label"}

      可以看到,不包含test-label标签的Pod无法在test-gatekeeper命名空间下创建。

    2. 执行以下命令,在test-gatekeeper命名空间下创建一个包含test-label标签的Pod。
      kubectl -n test-gatekeeper run test -l test-label=test --image=nginx --restart=Never

      查看Pod,正常完成创建:

      kubectl get pod test -n test-gatekeeper

    根据以上验证,说明通过Gatekeeper限制指定命名空间下创建的Pod必须包含一个名为test-label的标签成功。

版本记录

表4 Gatekeeper插件版本记录

插件版本

支持的集群版本

更新特性

社区版本

1.0.22

v1.25

v1.27

v1.28

v1.29

v1.30

v1.31

支持CCE v1.31集群

3.16.3

1.0.10

v1.23

v1.25

v1.27

v1.28

v1.29

v1.30

支持CCE v1.30集群

3.16.3

1.0.3

v1.23

v1.25

v1.27

v1.28

v1.29

首次提供Gatekeeper插件。

3.16.3

相关文档