更新时间:2024-11-25 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.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

相关文档