介绍

Harbor 是一个开源的容器镜像仓库,旨在通过为用户提供高效、安全和可扩展的镜像管理功能,帮助企业更好地管理容器镜像。

访问控制:提供基于角色的访问控制(RBAC),可以限制用户对镜像的操作权限。多种身份认证支持: LDAP、OAuth 等外部认证系统。

特性

Harbor

Docker Registry

镜像管理

提供高级镜像管理功能(分层结构、项目隔离)。

仅提供基础的镜像存储和分发功能。

安全扫描

集成了漏洞扫描(如 Trivy)功能,识别镜像中的安全问题。

不提供安全扫描功能,需自行整合其他工具。

用户管理

提供基于角色的访问控制(RBAC),支持用户和团队权限分配。

不支持用户管理或权限控制,需通过反向代理解决。

身份认证

支持 LDAP、OIDC 等多种认证方式。

不提供身份认证功能,需自行配置。

日志与审计

内置日志和审计功能,便于记录操作行为和追踪问题。

无日志和审计功能,需外部工具支持。

镜像复制与同步

支持多实例之间的镜像同步,适合分布式或多数据中心环境。

无原生镜像同步功能。

镜像签名与验证

集成 Notary,支持镜像签名和验证。

无签名功能,需外部工具支持。

多租户支持

支持项目隔离,便于多租户或团队协作。

不支持多租户功能。

Web 界面

提供易用的 Web UI,可视化管理镜像、用户和权限。

无 Web UI,仅提供 API 接口。

方面

Harbor

Docker Registry

性能

在功能完整性上牺牲了一些性能,适合中大型企业级场景。

极简设计,性能表现优异,适合对功能要求低的小型项目。

企业场景

更适合企业内部的容器镜像管理,特别是需要安全性、权限管理和分布式环境支持时。

适合对功能需求较少、只需简单镜像存储的小型项目或临时部署。

分布式环境支持

支持镜像复制、同步和多实例管理,适合跨数据中心的分布式部署场景。

无原生支持,需自行实现同步逻辑。

ps: Docker reigstry与 Distribution:

Docker Registry 使用了 Distribution 的核心库,用于处理镜像的上传、下载和存储。

Distribution 是一个开源的底层实现,Registry 在其之上扩展了用户认证、访问控制等功能。

部署

以下是使用 Helm 部署 Harbor 的完整步骤。Harbor 是一个开源的镜像仓库,支持多种镜像格式,适合在 Kubernetes 环境中使用。我们将利用官方的 Harbor Helm Chart 来部署。


1. 环境准备

确保以下工具已安装:

  • Kubernetes 集群(可以使用 Minikube、Kubeadm 或云服务提供的 Kubernetes 集群)

  • kubectl(Kubernetes 命令行工具)

  • Helm(版本建议 v3 或以上)

准备必要的资源:

  • 域名(用于访问 Harbor 的 Web UI)

  • 配置证书(可选,推荐使用自签名证书或 Let's Encrypt)


2. 添加 Harbor Helm Chart 仓库

helm repo add harbor https://helm.goharbor.io
helm repo update

3. 创建命名空间

为 Harbor 创建一个单独的命名空间(非必须,但推荐)。

kubectl create namespace harbor

4. 获取默认 values.yaml

运行以下命令下载 Harbor Helm Chart 的 values.yaml 文件,并根据实际需求修改配置。

helm show values harbor/harbor > values.yaml

打开 values.yaml,需要关注以下关键配置:

1. 域名配置

配置 Harbor 的访问地址(用于 Web UI 和 API 访问)。

expose:
  type: ingress
  ingress:
    hosts:
      core: "harbor.example.com" # 将此替换为你的域名

2. HTTPS 配置

如果有证书,可以配置 TLS:

expose:
  ingress:
    annotations: {}
    tls:
      - secretName: harbor-tls
        hosts:
          - harbor.example.com

如果没有证书,先使用 http 访问,将 type 修改为 clusterIP,稍后可以配置 HTTPS:

expose:
  type: clusterIP

3. 持久化存储配置

为持久化 Harbor 数据,需设置存储卷:

persistence:
  enabled: true
  persistentVolumeClaim:
    registry:
      size: 100Gi # 镜像存储大小
    jobservice:
      size: 1Gi
    database:
      size: 5Gi
    redis:
      size: 2Gi
    trivy:
      size: 5Gi

4. 数据库配置

默认会使用 Chart 自带的 PostgreSQL 和 Redis,但也可以配置外部数据库。

5. 其他配置

设置管理员密码:

harborAdminPassword: "YourStrongPassword"

5. 部署 Harbor

在配置完成的 values.yaml 文件基础上,执行以下命令开始部署:

helm install harbor harbor/harbor -n harbor -f values.yaml

6. 验证部署

运行以下命令,确认 Harbor 的 Pod 和服务正常运行:

kubectl get pods -n harbor
kubectl get svc -n harbor

如果配置了 Ingress,还需要验证 Ingress 是否生效:

kubectl get ingress -n harbor

7. 访问 Harbor

通过浏览器访问 http://harbor.example.comhttps://harbor.example.com(取决于是否配置了 TLS)。

默认管理员账号为 admin,密码为配置文件中的 harborAdminPassword


8. 自签名证书(可选)

如果没有正式的域名和证书,可以生成自签名证书并挂载到 Harbor:

生成证书

openssl req -newkey rsa:4096 -nodes -keyout harbor.key -x509 -days 365 -out harbor.crt

创建 Kubernetes Secret

kubectl create secret tls harbor-tls --cert=harbor.crt --key=harbor.key -n harbor

修改 values.yaml 文件

确保 tls 配置指向创建的 Secret:

expose:
  ingress:
    tls:
      - secretName: harbor-tls
        hosts:
          - harbor.example.com

重新应用:

helm upgrade harbor harbor/harbor -n harbor -f values.yaml

9. 配置 Docker 客户端(信任自签名证书)

编辑 Docker 客户端的配置文件(/etc/docker/daemon.json):

{
  "insecure-registries": ["harbor.example.com"],
  "debug": true,
  "experimental": false
}

重启 Docker:

sudo systemctl restart docker

10. 管理和使用 Harbor

  • 通过 Web UI 管理项目、用户和镜像。

  • 在 Kubernetes 集群中使用时,可配置 Harbor 为镜像仓库,直接拉取镜像。