生产环境 DevOps 实战 | 第 6 天:Harbor 核心概念入门——Registry、Project、Robot Account 详解

第 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 提供了坚实的基础:

  1. Registry 引擎基于 OCI 标准,支持容器镜像、Helm Chart、OCI Artifact 等多种制品类型,是 CI/CD 管线的制品核心
  2. Project 隔离机制通过公开/私有项目实现多租户隔离,结合 RBAC 权限模型,满足多团队协作场景
  3. Robot Account 自动化凭证为 CI/CD 提供了安全、可审计的免密认证方案,是 Tekton 和 Argo CD 集成中的关键环节

下一篇文章将进入「三件套集成总览」,从全局视角梳理 Tekton 构建 → Harbor 存储 → Argo CD 部署的端到端流程,敬请期待!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容