Harbor新手村

简介

Harbor是云原生的开源的通用artifact registry,CNCF毕业项目。它主要支持docker images和OCI-compatible artifacts相关的镜像管理,以及针对K8s构件的Helm chart管理。其特色为面向生产的artifact治理、安全保障和审计管理。

功能介绍

Harbor官方总结的系统特性有五个方面:

  1. 私有化便捷部署
  2. 多租户
  3. 镜像治理
  4. 安全与合规
  5. 可扩展性

其中镜像治理安全合规是重中之重,覆盖了镜像一致性、磁盘占用增长、镜像部署策略等镜像管理相关的重要问题。

有几项具体功能比较有意思,简单展开一下。

磁盘占用配额 (project quotas)

磁盘空间是镜像管理中不得不考虑的问题,quota通过硬性阈值的方式对镜像的磁盘占用进行管理。

Harbor通过“项目” (project)来对镜像进行分组隔离,对每个项目都可以配给一个磁盘占用的最大额度,一旦超过这个额度,项目将拒绝镜像的推入。

镜像滞留策略 (tag retention rules)

随着时间推移,打入仓库的镜像越来越多,磁盘占用自然越来越高。企业不可能通过无休止地扩容,而且大多数旧镜像经过版本更替后可能再也用不到,没有必要一直留存在仓库中。

Harbor提供了一套制定镜像留存规则的机制,可以通过project、name和tag匹配需要管理的镜像,再通过pull-/push-based的规则来管理镜像留存期限,例如:仅近n天被拉取/推入的镜像。

镜像副本 (pull-/push-based replication)

在Harbor中,可以配置外部registry,并通过镜像副本功能 (image replication) 向外部推送或从外部拉取镜像。用户可以制定一系列的策略来管理镜像副本的执行,例如:某项目下的某镜像的某些tag通过副本推送到DockerHub的某账户名下。

特别地,Harbor支持对外部Harbor做镜像副本。其他支持的外部源也种类繁多,如DockerHub、Aliyun ACS、Artifactory等等。

这个功能可以为构建联邦镜像仓库提供支撑。可以是类似DNS propagation的方式建设镜像仓库网;或是完全去中心化的仓库群,其中的每个Harbor与附近的几个Harbor进行连接,最终形成全局连通的群落。

部署

官方首推的Harbor部署方式是单节点脚本化部署,但从个人和工作需求出发,更需要一种便捷的方式将Harbor部署在K8s上,因此通过官方维护的Helm chart来部署Harbor(官方文档)。

注:官方为Helm这种部署方式的定位是高可用部署,即便捷地为Harbor的核心组件在K8s上做多副本部署,这里用不到,就按等同于单节点部署的方式走。

Helm的安装过程这里略过,详见Helm安装文档

首先在集群内的某宿主机中加上Harbor的Helm chart:

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

在这之后,官方文档指引我们将chart仓库拉取到本地,其用意是在本地维护一份可编辑可解释的安装配置文件。尝试基于宿主机某目录下拉取仓库,可以获得如下的文件结构:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
.
|-- Chart.yaml
|-- LICENSE
|-- README.md
|-- cert
| |-- tls.crt
| `-- tls.key
|-- conf
| |-- notary-server.json
| `-- notary-signer.json
|-- templates
| |-- NOTES.txt
| |-- _helpers.tpl
| |-- chartmuseum
| |-- core
| |-- database
| |-- exporter
| |-- ingress
| |-- internal
| |-- jobservice
| |-- nginx
| |-- notary
| |-- portal
| |-- redis
| |-- registry
| `-- trivy
`-- values.yaml

其中,values.yaml就是Harbor的安装配置文件。

官方教程对配置给出了基础的指导,初次上手可以根据这些指导对配置文件的结构和内容有一个大概的认知,但是这份教程主要面向高可用部署,其中的某些说明和建议并不适合新手以及试验环境比较简陋的情况,比如要求每一个Harbor核心组件的负载数要在2个以上,再比如TLS的一些配置。

配置文件本身的注释其实非常详实,在跟着教程了解了大概以后,可以尝试理解配置文件中的各个配置项的具体含义,再根据自身的需求合理修改配置。对于初期试玩来说,比较重要的配置项包括:

  • Harbor前端的暴露方式,这里选择最简单的NodePort;
  • 如果不满足TLS/SSL的相关要求(外部TLS需域名及证书,内部TLS需在集群中部署cert-manager),关闭所有TLS相关配置;
  • 如果无需镜像签名功能,关闭notary服务;
  • 如果无需管理Helm chart这类artifact,关闭chartmuseum服务;
  • 正确设置Harbor的链接 (externalURL),应为带schema、带域名/IP、带端口的完整URL;
  • 正确配置所有的持久化文件存储,初期推荐使用rancher的local-path-provisioner,可以省去手动配PV/PVC的麻烦;
  • 正确配置持久化数据存储,包括作为CMDB数据库的PG和K-V存储的Redis两部分,Harbor部署时可以自动安装专属的一个PG一个Redis,相应配置database.type=internalredis.type=internal
  • 管理员密码。

除了通过文件进行安装配置以外,我们还可以在执行helm install命令时通过--set选项来进行动态配置,在形成了稳定的配置模式以后,这种方法更便于部署。这里给出试玩所用的命令供参考,配置中关闭了TLS,未启用notary、chartmuseum和trivy服务,数据存储使用Harbor自带的PG和Redis:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
helm install try-harbor harbor/harbor\
--set chartmuseum.enabled=false \
--set trivy.enabled=false \
--set notary.enabled=false \
--set expose.type=nodePort \
--set expose.tls.enabled=false \
--set externalURL=http://yhuang.pro:30002 \
--set internalTLS.enabled=false \
--set persistence.enabled=true \
--set persistence.resourcePolicy="" \
--set persistence.persistentVolumeClaim.registry.storageClass=local-path \
--set persistence.persistentVolumeClaim.jobservice.storageClass=local-path \
--set persistence.persistentVolumeClaim.database.storageClass=local-path \
--set persistence.persistentVolumeClaim.redis.storageClass=local-path \
--set persistence.imageChartStorage.disableredirect=true \
--set harborAdminPassword=Demo123456! \
--set database.type=internal \
--set database.internal.password=Demo123456! \
--set redis.type=internal

等待Harbor的所有组件都启动后,即可通过externalURL中配置的地址来访问Harbor的前端了。