4. 环境准备:部署 OPA Gatekeeper、配置示例策略、准备压测工具

本章是实战课程的基石。在正式进入通信延迟故障排查之前,必须搭建一套标准化的实验环境。环境包含三个核心组件:OPA Gatekeeper(策略执行引擎)、示例约束策略(禁止特权容器)、压测工具链(kubectl、hey、wrk)。以下步骤已在 Kubernetes v1.28+ 集群上验证通过。

4.1 部署 OPA Gatekeeper

Gatekeeper 以 Admission Webhook 方式运行,推荐使用 Helm 3 部署,便于版本管理与配置更新。

组件 版本要求 说明
Kubernetes 集群 ≥ v1.24 需启用 admissionregistration.k8s.io/v1
Helm ≥ v3.8 用于安装 Gatekeeper chart
Gatekeeper ≥ v3.14 稳定版,支持 Webhook 超时配置
部署命令:
# 添加 Gatekeeper Helm 仓库
helm repo add gatekeeper https://open-policy-agent.github.io/gatekeeper/charts
helm repo update

# 安装 Gatekeeper(命名空间:gatekeeper-system)
helm install gatekeeper gatekeeper/gatekeeper \
  --namespace gatekeeper-system --create-namespace \
  --set webhook.timeoutSeconds=5 \
  --set replicas=2

# 验证 Pod 状态
kubectl get pods -n gatekeeper-system -o wide

部署完成后,集群中会新增以下关键资源:

  • ValidatingWebhookConfiguration:拦截所有 Pod 创建/更新请求。
  • gatekeeper-controller-manager:核心控制器,负责策略评估。
  • gatekeeper-audit:定期审计已有资源,生成违规报告。
延迟排查预备: 务必记录 Gatekeeper Webhook 的 timeoutSeconds 值(默认 5s)。后续故障排查中,该参数直接影响 API 请求的等待时长。
Gatekeeper 部署架构与 Admission 请求流 kubectl / 客户端 Kubernetes API Server Gatekeeper Webhook OPA 策略引擎 ConstraintTemplate Constraint 实例 请求路径:客户端 → API Server → Webhook → OPA 引擎

4.2 配置示例策略:禁止特权容器

策略由两层资源构成:ConstraintTemplate(策略模板,定义 Rego 逻辑)和 Constraint(约束实例,定义生效范围)。以下配置禁止所有命名空间中的特权容器。

4.2.1 创建 ConstraintTemplate

apiVersion: templates.gatekeeper.sh/v1
kind: ConstraintTemplate
metadata:
  name: k8spspprivilegedcontainer
spec:
  crd:
    spec:
      names:
        kind: K8sPSPPrivilegedContainer
  targets:
    - target: admission.k8s.gatekeeper.sh
      rego: |
        package k8spspprivilegedcontainer

        violation[{"msg": msg}] {
          input.review.object.kind == "Pod"
          container := input.review.object.spec.containers[_]
          container.securityContext.privileged == true
          msg := sprintf("特权容器不被允许:容器 %v 设置了 privileged=true", [container.name])
        }

4.2.2 创建 Constraint 实例

apiVersion: constraints.gatekeeper.sh/v1beta1
kind: K8sPSPPrivilegedContainer
metadata:
  name: no-privileged-containers
spec:
  match:
    kinds:
      - apiGroups: [""]
        kinds: ["Pod"]
    excludedNamespaces:
      - kube-system
      - gatekeeper-system
  parameters: {}
延迟陷阱: 如果 Constraint 的 match 范围过大(例如匹配所有资源类型),Gatekeeper 需要评估更多请求,直接增加 Webhook 处理延迟。建议在生产中按命名空间或标签缩小匹配范围。

4.2.3 验证策略生效

# 尝试创建特权容器(应被拒绝)
kubectl run test-privileged --image=nginx --privileged

# 预期输出:
# Error from server (Forbidden): admission webhook "validation.gatekeeper.sh" denied the request:
# 特权容器不被允许:容器 test-privileged 设置了 privileged=true

# 查看审计结果
kubectl get constraint -o yaml

4.3 准备压测工具

压测工具用于模拟高并发 API 请求,暴露 Gatekeeper 在压力下的延迟表现。本课程选用三种工具,覆盖不同场景:

工具 安装方式 适用场景 延迟指标
kubectl 集群自带 单请求延迟、手动触发 time 命令测量
hey 二进制下载 HTTP 级别并发压测 平均/最大延迟、P99
wrk 源码编译或包管理器 高并发、长连接压测 吞吐量、延迟分布

3.1 安装 hey

# Linux amd64
curl -Lo /usr/local/bin/hey https://hey-release.s3.us-east-2.amazonaws.com/hey_linux_amd64
chmod +x /usr/local/bin/hey

# 验证
hey -n 10 -c 1 http://localhost:8080

3.2 安装 wrk

# Ubuntu/Debian
sudo apt-get install -y build-essential libssl-dev git
git clone https://github.com/wg/wrk.git /tmp/wrk
cd /tmp/wrk && make
sudo cp wrk /usr/local/bin/

# 验证
wrk -v

3.3 准备压测脚本与目标

压测目标为 Gatekeeper 的 Webhook 端点。通过 kubectl proxy 暴露 API Server,然后向 Webhook 路径发送请求。

# 启动代理(后台运行)
kubectl proxy --port=8001 &

# 获取 Webhook 路径(示例)
WEBHOOK_PATH="/apis/admissionregistration.k8s.io/v1/validatingwebhookconfigurations/gatekeeper-validating-webhook-configuration"

# 使用 hey 压测(1000 请求,50 并发)
hey -n 1000 -c 50 -m GET \
  http://127.0.0.1:8001${WEBHOOK_PATH}

# 使用 wrk 压测(4 线程,100 连接,持续 30 秒)
wrk -t4 -c100 -d30s \
  http://127.0.0.1:8001${WEBHOOK_PATH}
延迟基线: 在 Gatekeeper 部署完成后、未施加策略压力前,先执行一次空负载压测,记录基线延迟。后续章节将对比基线,定位异常增量。
压测工具与 Gatekeeper 交互流程 压测工具 kubectl (单请求) hey (HTTP 并发) wrk (高并发长连接) kubectl proxy API Server Gatekeeper 输出延迟指标 平均延迟 / 最大延迟 / P99 延迟 / 吞吐量 (RPS)

4.4 环境验证清单

完成部署后,逐项确认以下状态,确保环境就绪:

  1. Gatekeeper Pod 运行中:kubectl get pods -n gatekeeper-system 显示 2 个 controller-manager 和 1 个 audit Pod 均为 Running。
  2. Webhook 配置已注册:kubectl get validatingwebhookconfiguration 包含 gatekeeper-validating-webhook-configuration。
  3. 策略约束已创建:kubectl get constraints 显示 no-privileged-containers 状态为 Active。
  4. 策略拦截生效:创建特权容器请求被拒绝,返回 Forbidden 错误。
  5. 压测工具可用:hey 和 wrk 命令可正常执行,并能访问 API Server 代理。
环境就绪后,即可进入第 5 章: 使用压测工具对 Gatekeeper 施加负载,采集 Webhook 延迟数据,建立性能基线。