4. Rekor 部署模式:单节点部署、高可用集群部署、与 Kubernetes 集成
Rekor 作为 Sigstore 生态中的透明日志组件,其部署模式直接影响镜像供应链的冷启动速度与削峰能力。根据生产环境的可靠性要求与资源配额限制,Rekor 支持三种主流部署模式:单节点部署用于开发测试与低负载场景,高可用集群部署用于生产环境保障日志写入与查询的连续性,Kubernetes 集成部署则利用容器编排能力实现弹性伸缩与资源配额管理。
4.1 单节点部署
单节点部署是 Rekor 最简洁的启动方式,适用于本地开发、功能验证或日志量较小的内部环境。该模式下所有组件(API Server、Trillian Log Server、MySQL/SQLite 后端)运行在同一进程中或同一主机上。
适用场景: 开发环境、CI/CD 流水线本地测试、日均日志条目 < 10,000 条的低负载场景。
部署步骤
- 下载 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 - 初始化数据库: 默认使用 SQLite 作为后端存储,无需额外配置。若使用 MySQL,需提前创建数据库并执行迁移脚本。
- 启动 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" - 验证服务状态:
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
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: 2maxReplicas: 10targetCPUUtilizationPercentage: 70 |
根据 CPU 使用率自动扩缩 Rekor API Server 副本数,应对冷启动时的写入峰值 |
| PodDisruptionBudget | minAvailable: 1 |
确保集群升级或节点维护时至少保留一个 Rekor 实例可用 |
| PriorityClass | value: 1000globalDefault: 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
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 能力匹配,避免冷启动时出现写入积压。