4. 环境搭建:Kubernetes集群准备、Helm安装Gatekeeper、验证部署状态

本章聚焦于从零搭建 OPA Gatekeeper 策略引擎的运行环境。我们将依次完成 Kubernetes 集群的快速准备、使用 Helm 包管理器安装 Gatekeeper,以及通过多种手段验证部署状态。一个稳定、可复现的环境是后续策略开发与基线核验的基础。

4.1 环境概览与前置条件

在开始操作前,请确保满足以下最低资源要求与工具版本。本课程所有操作均基于以下已验证的环境组合。

组件 版本要求 说明
Kubernetes 集群 v1.24+ 支持 ValidatingAdmissionPolicy 或 Webhook 模式;推荐使用 kind 或 minikube 本地测试
Helm CLI v3.10+ 用于管理 Gatekeeper 的 Helm Chart 安装与升级
kubectl v1.24+ 与集群版本偏差不超过一个次要版本
Gatekeeper Chart v3.14+ OPA Gatekeeper 官方 Helm Chart,包含 CRD、Webhook 与审计组件
推荐实践: 建议使用 kind 创建本地集群进行学习。它启动快、资源占用低,且支持多节点模拟。生产环境请使用托管的云原生集群(如 EKS、AKS、GKE)。

4.2 Kubernetes 集群快速准备

我们使用 kind 创建一个包含 1 个控制平面节点和 2 个工作节点的集群。以下配置启用了必要的 API 特性门控,确保 Gatekeeper 的 Webhook 正常工作。

# 1. 创建 kind 配置文件:kind-config.yaml
cat <<EOF > kind-config.yaml
kind: Cluster
apiVersion: kind.x-k8s.io/v1alpha4
nodes:
  - role: control-plane
  - role: worker
  - role: worker
EOF

# 2. 创建集群
kind create cluster --name gatekeeper-demo --config kind-config.yaml

# 3. 验证集群状态
kubectl cluster-info --context kind-gatekeeper-demo
kubectl get nodes -o wide

集群就绪后,确认 kubectl 上下文已正确切换至新集群。输出应显示三个节点均为 Ready 状态。

4.3 使用 Helm 安装 Gatekeeper

Helm 是部署 Gatekeeper 最推荐的方式。它自动处理 CRD 安装、组件依赖和版本管理。我们使用官方 Chart 仓库进行安装。

4.3.1 添加 Helm 仓库并更新

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

# 更新本地仓库索引
helm repo update

4.3.2 安装 Gatekeeper

以下命令将 Gatekeeper 安装至 gatekeeper-system 命名空间,并启用审计与 Webhook 组件。

# 安装 Gatekeeper
helm install gatekeeper gatekeeper/gatekeeper \
    --namespace gatekeeper-system \
    --create-namespace \
    --set auditInterval=60 \
    --set logLevel=INFO \
    --set replicas=2

# 查看安装状态
helm status gatekeeper -n gatekeeper-system
关键参数说明:
  • auditInterval=60:审计循环间隔(秒),默认 60s。
  • replicas=2:Webhook 与审计 Pod 副本数,生产环境建议至少 2 个。
  • logLevel=INFO:日志级别,调试时可改为 DEBUG。

4.4 验证部署状态

安装完成后,需要从 Pod、Service、Webhook 和 CRD 四个维度验证 Gatekeeper 是否正常运行。

4.4.1 检查 Pod 与 Service

# 查看所有 Pod 是否 Running
kubectl get pods -n gatekeeper-system -o wide

# 查看 Service 与 Endpoints
kubectl get svc -n gatekeeper-system
kubectl get endpoints -n gatekeeper-system

预期输出应包含 gatekeeper-audit 和 gatekeeper-controller-manager 两类 Pod,且所有 Pod 的 STATUS 为 Running。Service 应暴露 gatekeeper-webhook-service 的 443 端口。

4.4.2 检查 ValidatingWebhookConfiguration

# 查看 Webhook 配置
kubectl get validatingwebhookconfiguration gatekeeper-validating-webhook-configuration -o yaml

确认 Webhook 配置中 clientConfig.service 指向正确的命名空间和 Service 名称,且 rules 包含需要拦截的资源操作(如 CREATE、UPDATE)。

4.4.3 检查 CRD 是否就绪

# 列出所有 Gatekeeper 相关的 CRD
kubectl get crd | grep gatekeeper.sh

核心 CRD 包括:

  • constrainttemplates.gatekeeper.sh:定义策略模板。
  • constraints.gatekeeper.sh:定义具体策略实例。
  • providers.gatekeeper.sh:外部数据提供者(可选)。

所有 CRD 应处于 ESTABLISHED 状态。

4.5 部署架构与组件关系

下图展示了 Gatekeeper 在 Kubernetes 集群中的核心组件及其交互关系。理解此架构有助于后续策略调试与故障排查。

Gatekeeper 部署架构与组件关系 Kubernetes API Server Admission Review 请求 gatekeeper-webhook-service Service (ClusterIP:443) Controller Manager Webhook + Constraint Controller Audit Controller 定期审计现有资源 OPA 策略引擎 Rego 策略评估 Constraint / Template CRD etcd 存储 AdmissionReview 转发请求 Rego 查询 读取策略 审计评估 说明: 1. 所有资源变更请求(CREATE/UPDATE)先到达 API Server,再转发至 Webhook Service。 2. Controller Manager 负责处理 Webhook 请求并调用 OPA 引擎执行 Rego 策略。 3. Audit Controller 定期扫描集群现有资源,标记违反策略的资源。

4.6 快速健康检查脚本

以下脚本可用于一键验证 Gatekeeper 部署状态,适合集成到 CI/CD 或日常巡检中。

#!/bin/bash
# gatekeeper-healthcheck.sh

NAMESPACE="gatekeeper-system"
EXPECTED_PODS=3  # 根据 replicas 调整

echo "=== Gatekeeper 健康检查 ==="

# 1. 检查命名空间是否存在
kubectl get namespace $NAMESPACE &>/dev/null
if [ $? -ne 0 ]; then
    echo "[FAIL] 命名空间 $NAMESPACE 不存在"
    exit 1
fi
echo "[PASS] 命名空间 $NAMESPACE 存在"

# 2. 检查所有 Pod 是否 Running
RUNNING_PODS=$(kubectl get pods -n $NAMESPACE --field-selector=status.phase=Running --no-headers | wc -l)
if [ "$RUNNING_PODS" -lt "$EXPECTED_PODS" ]; then
    echo "[FAIL] 预期 $EXPECTED_PODS 个 Running Pod,实际 $RUNNING_PODS"
    kubectl get pods -n $NAMESPACE
    exit 1
fi
echo "[PASS] 所有 Pod 处于 Running 状态 ($RUNNING_PODS)"

# 3. 检查 Webhook Service 是否存在
kubectl get svc gatekeeper-webhook-service -n $NAMESPACE &>/dev/null
if [ $? -ne 0 ]; then
    echo "[FAIL] Webhook Service 不存在"
    exit 1
fi
echo "[PASS] Webhook Service 存在"

# 4. 检查核心 CRD
for crd in constrainttemplates.gatekeeper.sh constraints.gatekeeper.sh; do
    kubectl get crd $crd &>/dev/null
    if [ $? -ne 0 ]; then
        echo "[FAIL] CRD $crd 未就绪"
        exit 1
    fi
done
echo "[PASS] 核心 CRD 已就绪"

echo "=== Gatekeeper 部署健康 ==="
常见问题排查:
  • Pod 一直处于 Pending 状态: 检查集群资源是否充足,特别是 CPU 和内存。使用 kubectl describe pod <pod-name> -n gatekeeper-system 查看事件。
  • Webhook 导致集群资源无法创建: 如果 Gatekeeper 配置错误,可能阻塞所有资源操作。此时可临时删除 Webhook 配置:kubectl delete validatingwebhookconfiguration gatekeeper-validating-webhook-configuration,修复后再重新安装。
  • 审计日志为空: 确认 auditInterval 参数设置合理,且审计 Pod 日志中无错误。使用 kubectl logs -n gatekeeper-system deployment/gatekeeper-audit-controller 查看。

4.7 环境验证总结

完成以上步骤后,你的 Kubernetes 集群已具备运行 OPA Gatekeeper 策略引擎的完整能力。下表总结了各组件验证的关键指标。

验证项 预期结果 验证命令
Pod 状态 所有 Pod 为 Running kubectl get pods -n gatekeeper-system
Service 暴露 gatekeeper-webhook-service 监听 443 kubectl get svc -n gatekeeper-system
Webhook 配置 ValidatingWebhookConfiguration 存在且规则正确 kubectl get validatingwebhookconfiguration
CRD 就绪 constrainttemplates / constraints 等 CRD 已建立 kubectl get crd | grep gatekeeper.sh
审计功能 审计 Pod 日志无错误,定期输出审计结果 kubectl logs -n gatekeeper-system deployment/gatekeeper-audit-controller

环境搭建完成后,下一阶段将进入策略模板开发与基线核验规则的编写。确保当前环境稳定可靠,是后续所有策略实验的前提。