3. Gatekeeper 安装与部署:使用 Helm 在 Kubernetes 集群中安装 Gatekeeper,配置准入控制器

3.1 安装方式选型:为什么选择 Helm

在生产环境中部署 OPA Gatekeeper,推荐使用 Helm 作为包管理工具。Helm 提供了声明式的版本管理、参数化配置和便捷的升级回滚能力,能够显著降低 Gatekeeper 组件的运维复杂度。

安装方式 适用场景 优势 劣势
Helm Chart 生产环境、多集群管理 版本控制、参数化、一键升级/回滚 需要 Helm CLI 和 Tiller(v2)或 Helm v3 客户端
kubectl apply 快速验证、开发环境 无需额外工具,直接应用 YAML 难以管理版本差异,升级需手动处理 CRD
Operator 需要自动化生命周期管理 自动处理升级、备份、故障恢复 引入额外复杂度,适合大规模集群
推荐实践:本课程统一使用 Helm v3(无需 Tiller)进行 Gatekeeper 部署。Helm v3 移除了服务端组件,安全性更高,且与 Kubernetes RBAC 集成更紧密。

3.2 前置条件检查

在开始安装之前,请确保集群满足以下条件:

  • Kubernetes 版本:v1.20 及以上(推荐 v1.24+)
  • Helm 版本:v3.8.0 及以上
  • 集群资源:至少预留 2 核 CPU、4 GiB 内存用于 Gatekeeper 控制平面
  • RBAC 权限:安装者需具备集群管理员(cluster-admin)权限
  • CRD 支持:Kubernetes API Server 需启用 CustomResourceDefinition
注意:如果集群已安装旧版本 Gatekeeper(如 v3.5.x),请先执行 helm uninstall gatekeeper -n gatekeeper-system 并清理残留 CRD,再执行新版本安装,避免 CRD 冲突。

3.3 使用 Helm 安装 Gatekeeper

3.3.1 添加 Helm 仓库

# 添加 Gatekeeper 官方 Helm 仓库
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts

# 更新仓库索引
helm repo update

3.3.2 安装 Gatekeeper

# 创建命名空间
kubectl create namespace gatekeeper-system

# 使用 Helm 安装(推荐生产配置)
helm install gatekeeper gatekeeper/gatekeeper \
  --namespace gatekeeper-system \
  --set replicas=3 \
  --set auditInterval=60 \
  --set constraintViolationsLimit=100 \
  --set enableExternalData=false \
  --set controllerManager.extraArgs.enable-merge-webhook=true \
  --set webhook.timeoutSeconds=5
参数 默认值 说明
replicas 1 Controller Manager 副本数,生产建议 3
auditInterval 60 审计检查间隔(秒),容量巡检时可调小
constraintViolationsLimit 20 单个 Constraint 最多记录违规数
enableExternalData false 是否启用外部数据源(如云 API)
webhook.timeoutSeconds 3 准入 Webhook 超时时间,建议 5-10 秒

3.3.3 验证安装状态

# 检查 Pod 状态
kubectl get pods -n gatekeeper-system

# 预期输出(3 副本示例):
# NAME                                             READY   STATUS    RESTARTS   AGE
# gatekeeper-audit-5d8f7b6c7f-abc12                1/1     Running   0          2m
# gatekeeper-controller-manager-6f9c8d9c4d-xyz34   1/1     Running   0          2m
# gatekeeper-controller-manager-6f9c8d9c4d-uvw56   1/1     Running   0          2m
# gatekeeper-controller-manager-6f9c8d9c4d-rst78   1/1     Running   0          2m

# 检查 Webhook 配置
kubectl get validatingwebhookconfigurations.admissionregistration.k8s.io
kubectl get mutatingwebhookconfigurations.admissionregistration.k8s.io
关键组件说明:
  • gatekeeper-controller-manager:核心准入控制器,处理 AdmissionReview 请求
  • gatekeeper-audit:后台审计组件,定期检查现有资源是否违反约束
  • ValidatingWebhookConfiguration:验证准入 Webhook,拦截资源创建/更新请求
  • MutatingWebhookConfiguration:变更准入 Webhook,用于自动注入标签或注解

3.4 Gatekeeper 组件架构与数据流

下图展示了 Gatekeeper 安装后的核心组件及其在准入控制流程中的交互关系:

Gatekeeper 组件架构与准入控制数据流 kubectl / 客户端 Kubernetes API Server ValidatingWebhookConfig Gatekeeper Controller Manager OPA 策略引擎 Rego 策略评估 Gatekeeper Audit 后台审计扫描 Constraint / ConstraintTemplate CRD 资源存储 数据流:客户端请求 → API Server → Webhook → Gatekeeper Controller → OPA 策略评估 → 允许/拒绝

3.5 配置准入控制器 Webhook

Gatekeeper 安装后会自动创建 ValidatingWebhookConfiguration 和 MutatingWebhookConfiguration。默认配置会拦截所有命名空间下的资源创建和更新操作。在生产环境中,建议根据容量巡检需求进行精细化调整。

3.5.1 查看默认 Webhook 配置

# 查看验证 Webhook 详情
kubectl get validatingwebhookconfiguration gatekeeper-validating-webhook-configuration -o yaml

3.5.2 配置 Webhook 作用范围

通过 Helm values 文件限制 Webhook 仅作用于特定命名空间或资源类型,避免不必要的性能开销:

# webhook-values.yaml
webhook:
  timeoutSeconds: 5
  failurePolicy: Fail
  namespaceSelector:
    matchExpressions:
      - key: admission.gatekeeper.sh/ignore
        operator: DoesNotExist
  objectSelector: {}
  rules:
    - operations: ["CREATE", "UPDATE"]
      apiGroups: ["*"]
      apiVersions: ["*"]
      resources: ["pods", "deployments", "statefulsets", "services", "configmaps"]
      scope: "Namespaced"
# 使用自定义 values 升级安装
helm upgrade gatekeeper gatekeeper/gatekeeper \
  --namespace gatekeeper-system \
  -f webhook-values.yaml
容量巡检优化:在容量规划场景中,建议将 Webhook 的 failurePolicy 设置为 Fail,确保违反资源配额约束的请求被严格拒绝。同时,通过 namespaceSelector 排除系统命名空间(如 kube-system),避免影响集群核心组件。

3.6 安装后验证与健康检查

完成安装后,执行以下步骤确认 Gatekeeper 正常工作:

  1. 检查组件日志:确认 Controller Manager 和 Audit 无错误日志
  2. 测试准入拦截:创建一个违反约束的测试资源,验证是否被拒绝
  3. 检查审计结果:查看 Constraint 状态中是否记录了现有资源的违规信息
# 查看 Controller Manager 日志
kubectl logs -n gatekeeper-system -l app.kubernetes.io/name=gatekeeper --tail=50

# 创建一个简单的测试约束(禁止使用 latest 镜像标签)
cat < 0
          msg := sprintf("Missing required labels: %v", [missing])
        }
EOF

# 创建约束实例
cat <

3.7 卸载 Gatekeeper

当需要移除 Gatekeeper 时,请按以下顺序操作,确保 CRD 和 Webhook 配置被彻底清理:

# 1. 删除所有 Constraint 和 ConstraintTemplate
kubectl delete constraints --all --all-namespaces
kubectl delete constrainttemplates --all

# 2. 卸载 Helm Release
helm uninstall gatekeeper -n gatekeeper-system

# 3. 删除命名空间
kubectl delete namespace gatekeeper-system

# 4. 手动清理残留 CRD(如有)
kubectl delete crd -l gatekeeper.sh/system=yes
重要:卸载前务必先删除所有 Constraint 和 ConstraintTemplate,否则 CRD 删除后可能导致集群中残留的约束资源无法被管理,引发 API Server 警告日志。

3.8 生产部署检查清单

检查项 推荐配置 说明
Controller 副本数 3 高可用,避免单点故障
审计间隔 60s 容量巡检场景可缩短至 30s
Webhook 超时 5s 避免长时间阻塞 API Server
资源限制 CPU: 500m, Memory: 512Mi 根据集群规模调整
命名空间排除 kube-system, gatekeeper-system 防止递归拦截
审计日志持久化 启用 用于容量趋势分析

完成以上步骤后,Gatekeeper 已成功部署并配置为 Kubernetes 集群的准入控制器。下一阶段将基于此基础环境,定义容量规划相关的 ConstraintTemplate 和 Constraint 资源。