2. 环境准备:安装OPA CLI、配置Cosign工具、准备Serverless流水线模拟环境
本章是动手实践的基础环节。在开始编写和部署OPA策略之前,需要在本机或CI/CD环境中完成三个核心组件的安装与配置:OPA CLI(策略引擎)、Cosign(镜像签名工具)以及Serverless流水线模拟环境(本课程以Knative + Tekton为例)。以下步骤均经过验证,适用于Linux/macOS环境,Windows用户建议使用WSL2。
版本对齐提示:本课程所有示例基于 OPA v0.68.0、Cosign v2.4.0、Tekton v0.60.0 和 Knative Serving v1.15.0。请确保安装版本不低于上述版本,以避免API兼容性问题。
2.1 安装OPA CLI
OPA CLI是策略开发、测试和调试的核心工具。它既可以作为独立二进制运行,也可以作为Serverless流水线中的sidecar容器使用。推荐通过官方安装脚本或直接下载二进制文件进行安装。
方法一:使用官方安装脚本(推荐)
# Linux / macOS
curl -L -o opa https://openpolicyagent.org/downloads/v0.68.0/opa_linux_amd64_static
chmod 755 ./opa
sudo mv ./opa /usr/local/bin/
# 验证安装
opa version
方法二:使用Docker镜像(适用于流水线容器化场景)
docker pull openpolicyagent/opa:0.68.0-static
# 验证
docker run --rm openpolicyagent/opa:0.68.0-static version
安装后验证清单
| 验证项 | 命令 | 预期输出 |
|---|---|---|
| 版本检查 | opa version |
Version: 0.68.0 |
| REPL交互 | opa run |
进入交互式命令行 |
| 策略检查 | opa check *.rego |
无错误输出 |
常见问题:如果
opa version提示“command not found”,请确认/usr/local/bin已加入$PATH环境变量。使用Docker方式时,注意挂载本地策略目录:-v $(pwd):/policies。
2.2 配置Cosign工具
Cosign是Sigstore项目下的容器镜像签名工具,支持无密钥(Keyless)签名和密钥对签名两种模式。本课程采用密钥对签名模式,便于在流水线中集成OPA策略验证。
步骤1:安装Cosign
# Linux / macOS
curl -O -L "https://github.com/sigstore/cosign/releases/latest/download/cosign-linux-amd64"
sudo mv cosign-linux-amd64 /usr/local/bin/cosign
sudo chmod +x /usr/local/bin/cosign
# 验证安装
cosign version
步骤2:生成密钥对
# 生成加密密钥对(需要设置密码)
cosign generate-key-pair
# 查看生成的文件
ls -la
# 输出示例:
# -rw------- 1 user user 167 Nov 15 10:00 cosign.key # 私钥
# -rw-r--r-- 1 user user 178 Nov 15 10:00 cosign.pub # 公钥
步骤3:为测试镜像签名
# 使用本地测试镜像(假设已构建)
cosign sign --key cosign.key myregistry.io/app:latest
# 验证签名
cosign verify --key cosign.pub myregistry.io/app:latest
密钥管理建议
- 私钥保护:cosign.key 应存储在密钥管理服务(如AWS KMS、HashiCorp Vault)或CI/CD平台的Secret中,切勿提交到代码仓库。
- 公钥分发:cosign.pub 可以嵌入OPA策略的
data中,或通过ConfigMap挂载到流水线中。 - Keyless模式:生产环境推荐使用Sigstore的Keyless签名(基于OIDC),本课程为简化演示采用密钥对模式。
流水线集成提示:在Tekton流水线中,Cosign通常以Task形式运行。后续章节会提供完整的Tekton Task YAML定义,包含签名和验证步骤。
2.3 准备Serverless流水线模拟环境
本课程使用Tekton作为CI/CD流水线引擎,Knative Serving作为Serverless运行时平台。模拟环境可以在本地Kind集群或Minikube中部署,资源要求:4核CPU、8GB内存、20GB磁盘。
环境架构总览
部署步骤
- 创建Kind集群(本地测试)
kind create cluster --name serverless-lab --config - <<EOF kind: Cluster apiVersion: kind.x-k8s.io/v1alpha4 nodes: - role: control-plane extraPortMappings: - containerPort: 30080 hostPort: 30080 EOF - 安装Tekton Pipelines
kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml # 验证安装 kubectl get pods -n tekton-pipelines - 安装Knative Serving(使用Kourier网络层)
# 安装Knative Serving核心组件 kubectl apply -f https://github.com/knative/serving/releases/latest/download/serving-crds.yaml kubectl apply -f https://github.com/knative/serving/releases/latest/download/serving-core.yaml # 安装Kourier网络层 kubectl apply -f https://github.com/knative/net-kourier/releases/latest/download/kourier.yaml # 配置Knative使用Kourier kubectl patch configmap/config-network \ --namespace knative-serving \ --type merge \ --patch '{"data":{"ingress-class":"kourier.ingress.networking.knative.dev"}}' - 验证环境就绪
# 检查所有Pod状态 kubectl get pods --all-namespaces # 测试Knative Service部署 kubectl apply -f - <<EOF apiVersion: serving.knative.dev/v1 kind: Service metadata: name: hello-opa spec: template: spec: containers: - image: gcr.io/knative-samples/helloworld-go ports: - containerPort: 8080 EOF # 获取服务URL kubectl get ksvc hello-opa
环境组件清单
| 组件 | 版本 | 命名空间 | 用途 |
|---|---|---|---|
| Tekton Pipelines | v0.60.0 | tekton-pipelines | 定义和执行CI/CD流水线 |
| Knative Serving | v1.15.0 | knative-serving | Serverless应用部署和自动扩缩容 |
| Kourier | v1.15.0 | kourier-system | Knative网络层(入口网关) |
| OPA (sidecar) | v0.68.0 | 自定义 | 策略执行和决策 |
| Cosign | v2.4.0 | 自定义 | 镜像签名和验证 |
资源限制说明:Kind集群默认资源有限。如果部署Knative时Pod处于Pending状态,请执行
kubectl describe pod <pod-name>检查资源不足事件,并考虑增加Docker Desktop或Kind节点的内存/CPU配额。
2.4 环境验证脚本
完成上述安装后,建议运行以下综合验证脚本,确保所有组件可正常通信:
#!/bin/bash
# environment-verify.sh
echo "=== OPA CLI 验证 ==="
opa version || { echo "OPA未安装"; exit 1; }
echo "=== Cosign 验证 ==="
cosign version || { echo "Cosign未安装"; exit 1; }
echo "=== Kubernetes 集群验证 ==="
kubectl cluster-info || { echo "K8s集群不可达"; exit 1; }
echo "=== Tekton 验证 ==="
kubectl get pods -n tekton-pipelines --no-headers | grep -q "tekton-pipelines-controller" && echo "Tekton控制器运行中" || echo "Tekton未就绪"
echo "=== Knative 验证 ==="
kubectl get pods -n knative-serving --no-headers | grep -q "activator" && echo "Knative activator运行中" || echo "Knative未就绪"
echo "=== 镜像仓库连通性验证 ==="
# 假设使用Docker Hub或本地Registry
curl -s -o /dev/null -w "%{http_code}" https://registry-1.docker.io/v2/ | grep -q "200" && echo "镜像仓库可达" || echo "镜像仓库不可达(非阻塞警告)"
echo "=== 环境准备完成 ==="
下一步:环境就绪后,第3章将开始编写第一条OPA策略——验证镜像是否携带有效的Cosign签名。届时会用到本章安装的
opa命令和cosign.pub公钥文件。