4. Rekor 部署模式:单节点部署、高可用集群部署、与 Kubernetes 集成

Rekor 作为 Sigstore 生态中的透明日志组件,其部署模式直接影响镜像供应链的冷启动速度与削峰能力。根据生产环境的可靠性要求与资源配额限制,Rekor 支持三种主流部署模式:单节点部署用于开发测试与低负载场景,高可用集群部署用于生产环境保障日志写入与查询的连续性,Kubernetes 集成部署则利用容器编排能力实现弹性伸缩与资源配额管理。

4.1 单节点部署

单节点部署是 Rekor 最简洁的启动方式,适用于本地开发、功能验证或日志量较小的内部环境。该模式下所有组件(API Server、Trillian Log Server、MySQL/SQLite 后端)运行在同一进程中或同一主机上。

适用场景: 开发环境、CI/CD 流水线本地测试、日均日志条目 < 10,000 条的低负载场景。

部署步骤

  1. 下载 Rekor 二进制或容器镜像:
    # 使用预编译二进制
    wget https://github.com/sigstore/rekor/releases/download/v1.3.6/rekor-server-linux-amd64
    chmod +x rekor-server-linux-amd64
    
    # 或使用 Docker 镜像
    docker pull gcr.io/projectsigstore/rekor-server:v1.3.6
  2. 初始化数据库: 默认使用 SQLite 作为后端存储,无需额外配置。若使用 MySQL,需提前创建数据库并执行迁移脚本。
  3. 启动 Rekor Server:
    # 使用 SQLite 后端(开发模式)
    ./rekor-server-linux-amd64 serve --trillian_log_server.port=8090
    
    # 使用 MySQL 后端
    ./rekor-server-linux-amd64 serve \
      --trillian_log_server.port=8090 \
      --mysql_dsn="rekor_user:password@tcp(127.0.0.1:3306)/rekor_db"
  4. 验证服务状态:
    curl -s http://localhost:3000/api/v1/log | jq .
注意: 单节点部署不具备数据冗余与故障转移能力。若 Rekor 进程崩溃或主机宕机,透明日志将不可用,正在进行的镜像签名验证可能失败。生产环境不建议使用此模式。

4.2 高可用集群部署

高可用集群部署是生产环境的标准方案,通过引入 Trillian Log Server 的分布式架构实现日志写入的横向扩展与数据冗余。核心组件包括:Rekor API Server(无状态,可多副本)、Trillian Log Server(有状态,需一致性协议)、Trillian Log Signer(负责 Merkle 树计算与检查点签名)、MySQL/Spanner 数据库集群。

架构要点: Rekor API Server 本身是无状态的,所有日志数据实际存储在 Trillian 层。因此高可用部署的核心是 Trillian 集群与后端数据库的高可用。

组件角色与资源配额建议

组件 状态 推荐副本数 CPU/内存配额(每副本) 存储要求
Rekor API Server 无状态 2~4 1 CPU / 2 GiB 无持久存储
Trillian Log Server 有状态 3(奇数) 2 CPU / 4 GiB 50 GiB SSD(日志树)
Trillian Log Signer 有状态 1~2 2 CPU / 4 GiB 10 GiB SSD(临时)
MySQL Cluster 有状态 3(Group Replication) 4 CPU / 8 GiB 200 GiB+ SSD

部署流程(基于 Docker Compose 示例)

# docker-compose.rekor-ha.yml 核心片段
version: '3.8'
services:
  rekor-server:
    image: gcr.io/projectsigstore/rekor-server:v1.3.6
    command: >
      serve
      --trillian_log_server.address=trillian-log-server
      --trillian_log_server.port=8090
      --mysql_dsn="rekor:password@tcp(mysql:3306)/rekor"
    ports:
      - "3000:3000"
    depends_on:
      - trillian-log-server
      - mysql

  trillian-log-server:
    image: gcr.io/projectsigstore/trillian_log_server:v1.6.0
    command: >
      --storage_system=mysql
      --mysql_uri="test:zaphod@tcp(mysql:3306)/test"
      --rpc_endpoint=0.0.0.0:8090
      --http_endpoint=0.0.0.0:8091

  trillian-log-signer:
    image: gcr.io/projectsigstore/trillian_log_signer:v1.6.0
    command: >
      --storage_system=mysql
      --mysql_uri="test:zaphod@tcp(mysql:3306)/test"
      --rpc_endpoint=0.0.0.0:8092
      --http_endpoint=0.0.0.0:8093
      --sequencer_interval=1000ms
      --batch_size=50

  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: rootpass
      MYSQL_DATABASE: rekor
      MYSQL_USER: rekor
      MYSQL_PASSWORD: password
Rekor 高可用集群部署架构 客户端 / Cosign 负载均衡器 (HAProxy/Nginx) Rekor API Server 1 Rekor API Server 2 Rekor API Server 3 Trillian Log Server 1 Trillian Log Server 2 Trillian Log Server 3 Trillian Log Signer MySQL Primary MySQL Replica 1 MySQL Replica 2

4.3 与 Kubernetes 集成

在 Kubernetes 环境中部署 Rekor 可以充分利用容器编排的弹性伸缩、健康检查、资源配额管理能力,是实现镜像供应链冷启动削峰的关键手段。通过配置 HorizontalPodAutoscaler (HPA) 和 ResourceQuota,Rekor 集群能够根据日志写入压力自动扩缩容,并在资源受限时优先保障核心日志写入。

Kubernetes 部署清单核心配置

# rekor-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: rekor-server
  namespace: sigstore
spec:
  replicas: 2
  selector:
    matchLabels:
      app: rekor-server
  template:
    metadata:
      labels:
        app: rekor-server
    spec:
      containers:
      - name: rekor-server
        image: gcr.io/projectsigstore/rekor-server:v1.3.6
        args:
          - "serve"
          - "--trillian_log_server.address=trillian-log-server.sigstore.svc"
          - "--trillian_log_server.port=8090"
          - "--mysql_dsn=rekor:password@tcp(mysql.sigstore.svc:3306)/rekor"
        ports:
          - containerPort: 3000
        resources:
          requests:
            cpu: "500m"
            memory: "1Gi"
          limits:
            cpu: "1"
            memory: "2Gi"
        livenessProbe:
          httpGet:
            path: /api/v1/log
            port: 3000
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /api/v1/log
            port: 3000
          initialDelaySeconds: 5
          periodSeconds: 5

资源配额与自动扩缩容配置

Kubernetes 资源 配置示例 削峰作用
ResourceQuota spec.hard.cpu: "8"
spec.hard.memory: "16Gi"
限制 Rekor 命名空间总资源,防止日志写入风暴耗尽集群资源
HorizontalPodAutoscaler minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 70
根据 CPU 使用率自动扩缩 Rekor API Server 副本数,应对冷启动时的写入峰值
PodDisruptionBudget minAvailable: 1 确保集群升级或节点维护时至少保留一个 Rekor 实例可用
PriorityClass value: 1000
globalDefault: false
为 Rekor 设置高优先级,确保在资源竞争时日志服务优先获得调度

HPA 配置示例

# rekor-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
  name: rekor-server-hpa
  namespace: sigstore
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: rekor-server
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70
  - type: Resource
    resource:
      name: memory
      target:
        type: Utilization
        averageUtilization: 80
Kubernetes 集成下的 Rekor 弹性伸缩与资源配额 镜像签名请求 K8s Service / Ingress HPA (CPU 70%) Pod 1 Pod 2 Pod N ResourceQuota (8 CPU / 16Gi) Trillian + MySQL 后端

4.4 部署模式对比与选型建议

对比维度 单节点部署 高可用集群部署 Kubernetes 集成部署
可靠性 低(单点故障) 高(多副本 + 数据库集群) 高(K8s 自愈 + 多副本)
扩展性 不可扩展 手动扩展(需调整配置) 自动扩展(HPA)
资源配额管理 无 需外部工具 原生 ResourceQuota + LimitRange
冷启动削峰能力 无 有限(需预分配资源) 强(弹性伸缩 + 优先级调度)
运维复杂度 低 中 中高(需 K8s 集群管理)
推荐场景 开发测试 传统 VM 部署的生产环境 云原生生产环境
削峰最佳实践: 在 Kubernetes 集成部署中,建议将 Rekor API Server 的 HPA 目标 CPU 利用率设置为 60%~70%,并配合 --sequencer_interval=500ms 和 --batch_size=100 参数调整 Trillian Log Signer 的写入节奏,使日志写入速率与后端数据库的 IOPS 能力匹配,避免冷启动时出现写入积压。