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 的核心组件与数据流向:
3.2.2 快速部署步骤
- 下载离线安装包:从 GitHub Releases 获取 harbor-offline-installer-<version>.tgz。
- 配置 harbor.yml:设置 hostname、证书路径、数据库密码、存储后端(推荐 S3 兼容对象存储)。
- 执行安装脚本:
# 解压并进入目录
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
- 验证部署:浏览器访问 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 图总结了镜像仓库选型的核心决策路径:
决策要点: 若团队具备 Kubernetes 运维能力且需要跨云分发,Harbor 是首选;若仅使用单一云厂商的 Serverless 服务(如 EKS Fargate + ECR),托管仓库可大幅降低运维成本。无论哪种选择,务必开启漏洞扫描与生命周期策略。