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 请求的等待时长。
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 部署完成后、未施加策略压力前,先执行一次空负载压测,记录基线延迟。后续章节将对比基线,定位异常增量。
4.4 环境验证清单
完成部署后,逐项确认以下状态,确保环境就绪:
- Gatekeeper Pod 运行中:
kubectl get pods -n gatekeeper-system显示 2 个 controller-manager 和 1 个 audit Pod 均为 Running。 - Webhook 配置已注册:
kubectl get validatingwebhookconfiguration包含gatekeeper-validating-webhook-configuration。 - 策略约束已创建:
kubectl get constraints显示no-privileged-containers状态为Active。 - 策略拦截生效:创建特权容器请求被拒绝,返回 Forbidden 错误。
- 压测工具可用:
hey和wrk命令可正常执行,并能访问 API Server 代理。
环境就绪后,即可进入第 5 章: 使用压测工具对 Gatekeeper 施加负载,采集 Webhook 延迟数据,建立性能基线。