3. 镜像仓库选型与部署:公有云镜像仓库对比、Harbor部署、AWS ECR配置

镜像仓库是 Serverless 集群镜像管理的基础设施核心。选型时需综合考虑成本、网络延迟、安全合规、多集群分发能力以及与 CI/CD 管线的集成深度。本章从公有云托管仓库对比入手,逐步深入到自建 Harbor 的部署实践,最后以 AWS ECR 为例展示云原生仓库的配置要点。

3.1 公有云镜像仓库对比

主流公有云厂商均提供托管式镜像仓库服务,免去运维负担,但功能侧重与计费模式差异显著。以下从关键维度进行横向对比:

对比维度 AWS ECR Azure ACR GCP Artifact Registry 阿里云 ACR
基础存储计费 按实际存储量 + 数据传输 按存储量 + 网络流出 按存储量 + 网络流出 按存储量 + 公网流量
漏洞扫描 基础扫描(免费) + Inspector(付费) Microsoft Defender for Cloud(集成) Container Analysis(集成) ACR 安全扫描(按次计费)
多区域复制 跨区域复制(需手动配置) Geo-replication(一键启用) 多区域仓库(独立管理) 全球加速(需开通)
OCI 制品支持 支持(Helm Chart、OPA 等) 支持(Helm、Chart 等) 支持(全类型 OCI) 支持(Helm Chart)
私有网络访问 VPC Endpoint(Gateway/Interface) Private Endpoint + Service Endpoint Private Service Connect VPC 私网连接
身份集成 IAM Role + Policy Azure AD + RBAC Cloud IAM RAM + OAuth
选型建议: 如果团队已深度绑定某朵云,优先选择同云厂商的仓库以降低网络延迟与数据传输成本。若需多云分发或严格合规审计,自建 Harbor 是更灵活的选择。

3.2 Harbor 部署实践

Harbor 是目前最成熟的企业级开源镜像仓库,支持漏洞扫描、镜像签名、RBAC 和复制策略。以下为基于 Docker Compose 的快速部署步骤(生产环境建议使用 Helm 部署在 Kubernetes 集群中)。

3.2.1 部署架构

下图展示了 Harbor 的核心组件与数据流向:

Harbor 核心组件架构 用户 / Docker CLI Nginx (反向代理) Harbor Core (API) Job Service (复制/GC) Registry (Docker V2) PostgreSQL Redis (缓存) 存储后端 (S3/NFS) 说明:Harbor Core 处理认证与 API 请求;Job Service 负责镜像复制与垃圾回收;Registry 存储镜像层数据。

3.2.2 快速部署步骤

  1. 下载离线安装包:从 GitHub Releases 获取 harbor-offline-installer-<version>.tgz。
  2. 配置 harbor.yml:设置 hostname、证书路径、数据库密码、存储后端(推荐 S3 兼容对象存储)。
  3. 执行安装脚本:
# 解压并进入目录
tar xzf harbor-offline-installer-v2.10.0.tgz
cd harbor

# 复制配置模板并修改
cp harbor.yml.tmpl harbor.yml
vi harbor.yml

# 执行安装(自动启动 Docker Compose)
sudo ./install.sh --with-trivy --with-chartmuseum
  1. 验证部署:浏览器访问 https://<hostname>,默认管理员账号 admin / Harbor12345。
生产注意事项: 务必使用 HTTPS 证书(Let's Encrypt 或自建 CA);开启 Trivy 漏洞扫描器;配置存储后端为对象存储(如 MinIO、AWS S3)以避免本地磁盘单点故障;定期执行垃圾回收(GC)清理未引用的镜像层。

3.3 AWS ECR 配置

AWS ECR 是 Serverless 集群(如 EKS Fargate、Lambda 容器镜像)最常用的镜像仓库。以下展示从仓库创建到安全扫描的完整配置流程。

3.3.1 创建私有仓库与生命周期策略

# 使用 AWS CLI 创建仓库(启用标签可变性)
aws ecr create-repository \
    --repository-name serverless-app \
    --image-tag-mutability MUTABLE \
    --image-scanning-configuration scanOnPush=true \
    --region us-east-1

# 设置生命周期策略:保留最近 30 个镜像,其余过期删除
aws ecr put-lifecycle-policy \
    --repository-name serverless-app \
    --lifecycle-policy-text file://lifecycle-policy.json

lifecycle-policy.json 示例:

{
  "rules": [
    {
      "rulePriority": 1,
      "description": "保留最近 30 个镜像",
      "selection": {
        "tagStatus": "any",
        "countType": "imageCountMoreThan",
        "countNumber": 30
      },
      "action": {
        "type": "expire"
      }
    }
  ]
}

3.3.2 配置 IAM 权限与私有网络访问

Serverless 集群拉取镜像时需通过 IAM 角色授权。以下为 EKS Fargate 配置 IRSA(IAM Roles for Service Accounts):

# 创建 IAM 策略(允许 ECR 拉取)
aws iam create-policy \
    --policy-name ECRPullOnly \
    --policy-document '{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ecr:GetDownloadUrlForLayer",
        "ecr:BatchGetImage",
        "ecr:BatchCheckLayerAvailability"
      ],
      "Resource": "arn:aws:ecr:us-east-1:123456789012:repository/serverless-app"
    },
    {
      "Effect": "Allow",
      "Action": "ecr:GetAuthorizationToken",
      "Resource": "*"
    }
  ]
}'

# 关联 IAM 角色到 Service Account
eksctl create iamserviceaccount \
    --name ecr-reader \
    --namespace default \
    --cluster my-cluster \
    --attach-policy-arn arn:aws:iam::123456789012:policy/ECRPullOnly \
    --approve

3.3.3 配置 VPC Endpoint 避免公网流量

为降低延迟与数据传输成本,建议为 ECR 配置 VPC Endpoint:

  • Gateway Endpoint:用于 S3(ECR 镜像层实际存储在 S3)。
  • Interface Endpoint:用于 ECR API(Docker Login、ListImages 等)。
# 创建 ECR API Interface Endpoint
aws ec2 create-vpc-endpoint \
    --vpc-id vpc-xxxxx \
    --service-name com.amazonaws.us-east-1.ecr.api \
    --vpc-endpoint-type Interface \
    --subnet-ids subnet-xxxxx subnet-yyyyy \
    --security-group-ids sg-zzzzz

# 创建 S3 Gateway Endpoint
aws ec2 create-vpc-endpoint \
    --vpc-id vpc-xxxxx \
    --service-name com.amazonaws.us-east-1.s3 \
    --vpc-endpoint-type Gateway \
    --route-table-ids rtb-aaaaa

3.3.4 启用增强型扫描(Amazon Inspector)

ECR 基础扫描仅检测常见 CVE,增强型扫描(Inspector)可提供更深入的漏洞分析与修复建议:

# 启用 ECR 增强型扫描(需先启用 Inspector)
aws inspector2 enable --resource-types ECR

# 验证扫描状态
aws ecr describe-image-scan-findings \
    --repository-name serverless-app \
    --image-id imageTag=v1.0.0
最佳实践: 在 CI/CD 管线中集成 ecr:PutImage 时设置 --image-scanning-configuration scanOnPush=true,确保每次推送自动触发扫描。结合 EventBridge 规则,将高危漏洞事件发送到 SNS 或 Slack 通知。

3.4 选型决策流程

以下 SVG 图总结了镜像仓库选型的核心决策路径:

镜像仓库选型决策流程 开始选型 是否多云/混合云? 自建 Harbor 是 使用云厂商托管仓库 否 ✓ 统一管理多集群 ✓ 镜像签名 + 合规审计 ✓ 零运维,自动扩缩 ✓ 原生 IAM 集成
决策要点: 若团队具备 Kubernetes 运维能力且需要跨云分发,Harbor 是首选;若仅使用单一云厂商的 Serverless 服务(如 EKS Fargate + ECR),托管仓库可大幅降低运维成本。无论哪种选择,务必开启漏洞扫描与生命周期策略。