# Gatekeeper
#### 插件简介
Gatekeeper是一个基于开放策略（OPA）的可定制的云原生策略控制器，有助于策略的执行和治理能力的加强，在集群中提供了更多符合Kubernetes应用场景的安全策略规则。
开源社区地址：<https://github.com/open-policy-agent/gatekeeper>
使用方式：<https://open-policy-agent.github.io/gatekeeper/website/docs/>
#### 约束与限制
- 如果您已经在集群中部署了社区的Gatekeeper，请您先将其卸载后再安装CCE提供的Gatekeeper插件，否则可能会出现插件安装失败的情况。
- 卸载Gatekeeper插件后将保留插件相关的CRD（Custom Resource Definitions）和对应的CR对象（Custom Resources，如ConstraintTemplates、Constraints等），您的自定义策略数据仍然将会保留。
  ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
  该行为是社区设计的逻辑实现，因为CRD往往包含用户重要的自定义策略数据（Constraints），自动删除可能导致数据丢失或集群策略混乱。如需卸载所有本插件相关的CRD，您可参考以下命令进行操作。
  ```
  kubectl delete crds $(kubectl get crds | grep gatekeeper.sh | awk '{print$1}')
  ```
  
 
#### 注意事项
Gatekeeper提供的webhook的能力可能会影响Kubernetes基本资源的使用，请确保业务必须使用webhook能力，并慎重评估使用该插件引入的风险。
![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/notice_3.0-zh-cn.png)
Gatekeeper是CCE基于开源软件进行适配并集成的精选开源插件，CCE将提供全面的技术支持服务。然而，CCE不承担因开源软件缺陷导致的业务损失责任，也不承担赔偿或额外的服务，强烈建议用户定期升级软件以修复潜在问题。
#### 安装步骤
1. 登录[CCE控制台](https://console.huaweicloud.com/cce2.0/?#/cce/cluster/list)，单击集群名称进入集群。
2. 单击左侧导航栏的"插件中心"，在右侧找到**Gatekeeper**插件，单击"安装"。
3. 在安装插件页面，设置"规格配置"。 
   - 选择"系统预置规格"时，您可根据集群规模选择"小规格"或"大规格"，系统会根据不同的预置规格配置插件的实例数及资源配额，具体配置值请以控制台显示为准。
   
   - 选择"自定义规格"时，您可根据需求调整插件实例数和资源配额。实例数为1时插件不具备高可用能力，当插件实例所在节点异常时可能导致插件功能无法正常使用，请谨慎选择。
   
   
   
   
4. 选择需要修改的配置，修改参数值。详情请参见[社区参数说明](https://github.com/open-policy-agent/gatekeeper/tree/master/charts/gatekeeper#parameters)。
5. 设置插件实例的部署策略。 
   ![](https://support.huaweicloud.com/usermanual-cce/public_sys-resources/note_3.0-zh-cn.png)
   - 调度策略对于DaemonSet类型的插件实例不会生效。
   
   - 设置多可用区部署或节点亲和策略时，需保证集群中存在满足调度策略的节点且拥有足够的资源，否则插件实例将无法运行。
    
   表1插件调度配置 
   | 参数   | 参数说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
   |:---|:---|
   | 多可用区部署 | - 优先模式：优先将插件的Deployment实例调度到不同可用区的节点上，如集群下节点不满足多可用区，插件实例将调度到单可用区下的不同节点。  - 均分模式：插件Deployment实例均匀调度到当前集群下各可用区，增加新的可用区后建议扩容插件实例以实现跨可用区高可用部署；均分模式限制不同可用区间插件实例数相差不超过1，单个可用区资源不足会导致后续其他实例无法调度。  - 强制模式：插件Deployment实例强制调度到不同可用区的节点上，每个可用区下最多运行一个实例。如集群下节点不满足多可用区，插件实例将无法全部运行。节点故障后，插件实例存在无法迁移风险。                                                                                                    |
   | 节点亲和 | - 不配置：插件实例不指定节点亲和调度。  - 指定节点调度：指定插件实例部署的节点。若不指定，将根据集群默认调度策略进行随机调度。  - 指定节点池调度：指定插件实例部署的节点池。若不指定，将根据集群默认调度策略进行随机调度。  - 自定义亲和策略：填写期望插件部署的节点标签实现更灵活的调度策略，若不填写将根据集群默认调度策略进行随机调度。 同时设置多条自定义亲和策略时，需要保证集群中存在同时满足所有亲和策略的节点，否则插件实例将无法运行。    |
   | 容忍策略  | 容忍策略与节点的污点能力配合使用，允许（不强制）插件的 Deployment 实例调度到带有与之匹配的污点的节点上，也可用于控制插件的 Deployment 实例所在的节点被标记污点后插件的 Deployment 实例的驱逐策略。 插件会对实例添加针对**node.kubernetes.io/not-ready** 和**node.kubernetes.io/unreachable**污点的默认容忍策略，容忍时间窗为60s。 详情请参见[设置容忍策略](https://support.huaweicloud.com/usermanual-cce/cce_10_0728.html)。                                                                                                                                                                                                                                                                |
      
   
   
6. 单击"安装"。
 
#### 组件说明
表2Gatekeeper组件 
| 容器组件                          | 说明                                            | 资源类型        |
|:---|:---|:---|
| gatekeeper-audit               | 提供audit相关信息。                                 | Deployment |
| gatekeeper-controller-manager | 提供Gatekeeper的webhook能力，按照用户自定义的策略对k8s资源进行控制。 | Deployment   |
   
#### 使用示例
本示例将演示如何通过Gatekeeper插件实现限制指定命名空间下创建的Pod必须包含一个名为test-label的标签。更多Gatekeeper的用法，可参考[官网文档](https://open-policy-agent.github.io/gatekeeper/website/docs/howto/)。
1. 请参见[通过kubectl连接集群](https://support.huaweicloud.com/usermanual-cce/cce_10_0107.html)，使用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的标签成功。
   
   
 
#### 版本记录
表3Gatekeeper插件版本记录 
| 插件版本     | 支持的集群版本                                                                                                                                                                                                                                                                                                                                                                                                                                                                 | 更新特性                                                                                                                                                                                                                                                                                         | 社区版本                                                                              |
|:---|:---|:---|:---|
| 1.1.29  | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35 v1.36 | 对应的社区版本升级为v3.22.2                                                                                                                                                                                                                                                                             | [3.22.2](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.22.2) |
| 1.1.23    | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35 v1.36      | 支持CCE v1.36集群                                                                                                                                                                                                                                                                                   | [3.20.1](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.20.1)     |
| 1.1.22 | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35                                                           | 修复部分问题                                                                                                                                                                                                                                                                                          | [3.20.1](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.20.1)   |
| 1.1.10  | v1.29 v1.30 v1.31 v1.32 v1.33 v1.34 v1.35                                                               | 支持CCE v1.35集群                                                                                                                                                                                                                                                                                  | [3.20.1](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.20.1)    |
| 1.1.5     | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                                  | 修复部分问题                                                                                                                                                                                                                                                                                        | [3.20.1](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.20.1)     |
| 1.1.4  | v1.28 v1.29 v1.30 v1.31 v1.32 v1.33 v1.34                                                         | - 支持CCE v1.34集群  - 对应的社区版本升级为v3.20.1   | [3.20.1](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.20.1)   |
| 1.1.3    | v1.27 v1.28 v1.29 v1.30 v1.31 v1.32 v1.33                                                         | - 支持CCE v1.33集群  - 对应的社区版本升级为v3.19.3        | [3.19.3](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.19.3)    |
| 1.0.32 | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31 v1.32                                                                 | 支持CCE v1.32集群                                                                                                                                                                                                                                                                                 | [3.16.3](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.16.3)    |
| 1.0.23  | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31                                                                                                                            | 修正若干问题                                                                                                                                                                                                                                                                                        | [3.16.3](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.16.3)     |
| 1.0.22 | v1.25 v1.27 v1.28 v1.29 v1.30 v1.31                                                                                                                           | 支持CCE v1.31集群                                                                                                                                                                                                                                                                                  | [3.16.3](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.16.3)    |
| 1.0.10  | v1.23 v1.25 v1.27 v1.28 v1.29 v1.30                                                                                                                                  | 支持CCE v1.30集群                                                                                                                                                                                                                                                                                  | [3.16.3](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.16.3)  |
| 1.0.3  | v1.23 v1.25 v1.27 v1.28 v1.29                                                                                                                                                                                              | 首次提供Gatekeeper插件。                                                                                                                                                                                                                                                                            | [3.16.3](https://github.com/open-policy-agent/gatekeeper/releases/tag/v3.16.3)   |
   
