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 安装后的核心组件及其在准入控制流程中的交互关系:
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 正常工作:
- 检查组件日志:确认 Controller Manager 和 Audit 无错误日志
- 测试准入拦截:创建一个违反约束的测试资源,验证是否被拒绝
- 检查审计结果:查看 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 资源。