第 6/60 天
引言
在 DevOps 三件套中,Harbor 扮演着「制品仓库」的核心角色——它是连接 CI(Tekton 构建)和 CD(Argo CD 部署)的桥梁。没有可靠的制品仓库,镜像无法安全存储、无法高效分发、无法保证供应链安全。
Harbor 是一个开源的云原生制品仓库,由 VMware 开源并捐赠给 CNCF。它不仅是 Docker Registry 的替代品,更提供了镜像管理、安全扫描、多租户隔离、复制同步、RBAC 权限控制等企业级能力。今天的文章将深入 Harbor 的三大核心概念:Registry(仓库引擎)、Project(项目隔离)、Robot Account(自动化凭证),为后续集成 Tekton 和 Argo CD 打下坚实基础。
核心概念
1. Registry——仓库引擎
Harbor 底层基于 Docker Distribution,遵循 OCI Distribution Spec。可以存储多种 OCI 制品:
| 制品类型 | 说明 | 用途 |
|---|---|---|
| 容器镜像 | Docker/OCI 镜像 | 应用容器化部署 |
| Helm Chart | Kubernetes 包管理 | 应用分发的 Chart 包 |
| OCI Artifact | 通用 OCI 制品 | SBOM、签名、CNAB |
| 自定义制品 | 扩展 OCI 规范 | 策略引擎、插件等 |
2. Project——项目隔离单元
Harbor 中的 Project 是权限和资源隔离的最小单元。有 公开(Public) 和 私有(Private) 两种类型:
| 特性 | 公开项目 | 私有项目 |
|---|---|---|
| 镜像拉取 | 无需认证 | 需要认证 |
| 镜像推送 | 需要认证 | 需要认证 |
| 适用场景 | 基础镜像、公共库 | 业务镜像、敏感数据 |
| 安全扫描 | 可选 | 推荐开启 |
3. Robot Account——自动化凭证
Robot Account 是 Harbor 专为 CI/CD 自动化设计的凭证机制。相比普通用户账号,Robot Account 有五大优势:
- 权限精细化:精确到 Project 级别的 pull/push 权限
- 自动过期:可设置 TTL,避免凭证泄露风险
- 不可登录 UI:仅通过 API 使用,安全合规
- 可审计:所有操作记录归属到 Robot Account
- 免密轮换:支持密钥旋转,适合 CI 流水线
实战步骤
步骤 1:Harbor 部署(已有环境可跳过)
使用 Docker Compose 快速部署 Harbor(离线安装包模式):
# 下载 Harbor 离线安装包
wget https://github.com/goharbor/harbor/releases/download/v2.12.0/harbor-offline-installer-v2.12.0.tgz
tar xzf harbor-offline-installer-v2.12.0.tgz
cd harbor
# 复制并修改配置
cp harbor.yml.tmpl harbor.yml
# 编辑 harbor.yml 配置域名、HTTPS 证书等
# harbor.yml 核心配置
hostname: harbor.stellardata.top
http:
port: 80
https:
port: 443
certificate: /data/cert/harbor.pem
private_key: /data/cert/harbor-key.pem
harbor_admin_password: Chang3MeN0w!
database:
type: postgresql
max_idle_conns: 50
max_open_conns: 100
# 执行安装
sudo ./install.sh --with-trivy --with-chartmuseum
步骤 2:创建项目与机器人账户
安装完成后,通过 Harbor Web UI 或 API 创建项目和 Robot Account。
# 使用 Harbor API 创建项目
curl -k -X POST "https://harbor.stellardata.top/api/v2.0/projects"
-H "Authorization: Bearer $(curl -sk -u admin:Chang3MeN0w! https://harbor.stellardata.top/api/v2.0/users/login | jq -r '.token')"
-H "Content-Type: application/json"
-d '{
"project_name": "devops-demo",
"public": false,
"metadata": {
"auto_scan": "true",
"enable_content_trust": "false",
"prevent_vul": "true",
"public": "false",
"severity": "critical",
"reuse_sys_cve_allowlist": "true"
}
}'
步骤 3:创建 Robot Account
为 Tekton CI 创建专用的 Robot Account:
# 创建 robot account
curl -k -X POST "https://harbor.stellardata.top/api/v2.0/robots"
-H "Authorization: Bearer $(curl -sk -u admin:Chang3MeN0w! https://harbor.stellardata.top/api/v2.0/users/login)"
-H "Content-Type: application/json"
-d '{
"name": "tekton-builder",
"duration": -1,
"description": "Tekton CI pipeline robot account",
"level": "project",
"permissions": [{
"kind": "project",
"namespace": "devops-demo",
"access": [
{"resource": "repository", "action": "push"},
{"resource": "repository", "action": "pull"},
{"resource": "artifact", "action": "push"},
{"resource": "artifact", "action": "pull"},
{"resource": "tag", "action": "create"},
{"resource": "tag", "action": "delete"}
]
}]
}'
步骤 4:在 Tekton 中配置 Robot Account 认证
将 Robot Account 的凭证以 Kubernetes Secret 形式注入 Tekton Pipeline:
# docker-registry-credentials.yaml
apiVersion: v1
kind: Secret
metadata:
name: harbor-robot-secret
annotations:
tekton.dev/docker-0: https://harbor.stellardata.top
type: kubernetes.io/basic-auth
stringData:
username: "robot$tekton-builder"
password: "********" # 替换为 robot account 实际密钥
---
apiVersion: v1
kind: ServiceAccount
metadata:
name: tekton-builder-sa
secrets:
- name: harbor-robot-secret
步骤 5:验证 Robot Account 功能
直接测试 Robot Account 的推拉权限:
# 登录 Harbor
echo "robot-token" | docker login harbor.stellardata.top
-u "robot$tekton-builder" --password-stdin
# 拉取基础镜像
docker pull alpine:3.20
docker tag alpine:3.20 harbor.stellardata.top/devops-demo/alpine:3.20
# 推送镜像
docker push harbor.stellardata.top/devops-demo/alpine:3.20
# 验证推送结果
curl -sk -u "robot$tekton-builder:robot-token"
"https://harbor.stellardata.top/api/v2.0/projects/devops-demo/repositories/alpine/artifacts"
| jq '.[] | {digest: .digest, tags: .tags[].name}'
步骤 6:配置镜像复制规则(跨集群同步)
# 复制规则配置示例(API 方式)
POST /api/v2.0/replication/policies
{
"name": "sync-to-dr",
"description": "跨机房同步到灾备集群",
"src_registry": {
"type": "harbor",
"name": "primary-harbor",
"endpoint": "https://harbor-primary.stellardata.top"
},
"dest_registry": {
"type": "harbor",
"name": "dr-harbor",
"endpoint": "https://harbor-dr.stellardata.top"
},
"dest_namespace": "devops-demo",
"filters": [
{"type": "name", "value": "devops-demo/**"},
{"type": "tag", "value": "v*"}
],
"trigger": {
"type": "event_based",
"settings": {}
},
"replicate_deletion": true
}
常见问题
Q1: Harbor 和 Docker Hub 有什么区别?
Harbor 是私有部署的企业级制品仓库,提供安全扫描、多租户、复制同步等企业功能;Docker Hub 是公有云服务,免费版有拉取限速和镜像数量限制。生产环境建议自建 Harbor,保证拉取速度和数据安全。
Q2: Robot Account 的用户名为什么要用 robot$ 前缀?
Harbor 用 robot$ 前缀区分 Robot Account 和普通用户,这是 Harbor 的内部约定。完整的用户名格式为 robot$<name>,例如 robot$tekton-builder。在 API 和 Docker CLI 中必须包含这个前缀。
Q3: Robot Account 的密钥丢失了怎么办?
可以在 Harbor UI 中重新生成密钥。进入「系统管理 → 机器人账户」,找到对应账户,点击「刷新密钥」即可。刷新后需同步更新所有使用该密钥的 CI 流水线配置。
Q4: 公开项目和私有项目在存储上有什么区别?
存储没有区别,所有的镜像都存储在 Harbor 的后端存储(文件系统/S3/Azure Blob 等)中。区别仅在于访问控制层面——公开项目无需认证即可拉取,适合基础镜像、公共工具;私有项目任何操作都需要认证,适合业务敏感镜像。
Q5: Harbor 支持哪些后端存储?
Harbor 支持多种存储后端:本地文件系统、S3 兼容对象存储(MinIO/Ceph RGW)、Azure Blob Storage、Google Cloud Storage、OpenStack Swift 等。生产环境推荐 S3 兼容对象存储,便于扩展和灾备。
总结
Harbor 作为云原生制品仓库,通过 Registry、Project、Robot Account 三大核心概念为企业级 DevOps 提供了坚实的基础:
- Registry 引擎基于 OCI 标准,支持容器镜像、Helm Chart、OCI Artifact 等多种制品类型,是 CI/CD 管线的制品核心
- Project 隔离机制通过公开/私有项目实现多租户隔离,结合 RBAC 权限模型,满足多团队协作场景
- Robot Account 自动化凭证为 CI/CD 提供了安全、可审计的免密认证方案,是 Tekton 和 Argo CD 集成中的关键环节
下一篇文章将进入「三件套集成总览」,从全局视角梳理 Tekton 构建 → Harbor 存储 → Argo CD 部署的端到端流程,敬请期待!















暂无评论内容