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磁盘。

环境架构总览

Serverless流水线模拟环境架构 开发者 Git 仓库 Tekton 流水线引擎 Task: 代码检出 Task: 镜像构建+签名 Task: OPA策略验证 OPA 策略引擎 Knative Serving 容器镜像仓库 OPA策略从ConfigMap 加载公钥和规则

部署步骤

  1. 创建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
  2. 安装Tekton Pipelines
    kubectl apply --filename https://storage.googleapis.com/tekton-releases/pipeline/latest/release.yaml
    # 验证安装
    kubectl get pods -n tekton-pipelines
  3. 安装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"}}'
  4. 验证环境就绪
    # 检查所有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公钥文件。