Harbor 与 Registry
Harbor 是一个英文单词,意思是港湾,港湾是干什么的呢?就是停放货物的,而货物呢,是装在集装箱中的,说到集装箱,就不得不提到 Docker 容器,因为 Docker 容器的技术正是借鉴了集装箱的原理。所以,Harbor 正是一个用于存储 Docker 镜像的企业级 Registry。
Registry 是 Docker 官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记,然后 push 到以 registry 镜像起的容器的私有仓库中。企业可以根据自己的需求,使用 Dockerfile 生成自己的镜像,并推到私有仓库中,这样可以大大提高拉取镜像的效率。
Harbor 核心组件解释
- Proxy: 它是一个 nginx 的前端代理,代理 Harbor 的 registry,UI,token 等服务;
- db: 负责存储用户权限,审计日志,Docker imange 分组信息等数据;
- UI: 提供图形化界面,帮助用户管理 registry 上的镜像,并对用户进行授权;
- jobservice: jobService 是负责镜像复制工作的,它和 registry 通信,从一个 registry pull 镜像然后 push 到另一个 registry,并记录 job_log;
- Adminserver: 是系统的配置管理中心附带检查存储用户量,ui 和 jobserver 启动时后需要加载 adminserver 的配置;
- Registry: 镜像仓库,负责存储镜像文件;
- Log: 为了帮助监控 Harbor 运行,负责收集其他组件的 log,供日后进行分析。
Harbor 和 Registry 的比较
Harbor 和 Registry 都是 Docker 的镜像仓库,但是 Harbor 作为更多企业的选择,是因为相较于 Registry 来说,它具有更多的优势。如下:
- 提供分层传输机制,优化网络传输;
Docker 镜像时分层的,而如果每次传输都使用全量文件(所以用 FTP 的方式并不适合),显然不经济。必须提供识别分层传输的机制,以层的 UUID 为标识,确定传输的对象。 - 提供 WEB 界面,优化用户体验;
只用镜像的名字来进行上传下载显然很不方便,需要有一个用户界面可以支持登录,搜索功能,包括区分共有,私有镜像; - 支持水平扩展集群;
当有用户对镜像的上传下载操作集中在某服务器,需要对相应的访问压力作分解; - 良好的安全机制
企业中的开发团队有很多不同的职位,对于不同的职位人员,分配不同的权限,具有更好的安全性; - Harbor 提供了基于角色的访问控制机制,并通过项目来对镜像进行组织和访问权限的控制。Kubernetes 中通过 namespace 来对资源进行隔离,在企业级应用场景中,通过将两者进行结合可以有效将 Kubernetes 使用的镜像资源进行管理和访问控制,增强镜像使用的安全性。尤其是在多租户场景下,可以通过租户,namespace 和项目相结合的方式来实现对多租户镜像资源的管理和访问控制。
Harbor 安装部署
Harbor 被部署为多个 Docker 容器。因此,你可以将其部署在任何支持 Docker 的 Linux 发行版上。目标主机需要安装好 Docker 和 Docker Compose 后才能安装 Harbor。
安装 docker-compose
安装 docker-compose 可以使用 pip 安装。也可以使用 yum 安装
1 | yum install -y python-pip;pip install docker-compose |
下载并解压 Harbor 安装包
前往 Harbor releases page 下载要安装的 Harbor 二进制包,此处下载的是最新的 v2.1.2 版本;
下载相应的
*.asc
文件,验证该软件是正版(可选)。
*.asc
文件是 OpenPGP 秘钥文件,执行下面的步骤来验证下载的安装包是正版的1
2
3
4
5# 联网安装
gpg -v –keyserver hkps://keyserver.ubuntu.com –verify harbor-online-installer-version.tgz.asc
# 离线安装
gpg -v –keyserver hkps://keyserver.ubuntu.com –verify harbor-offline-installer-version.tgz.ascgpg命令验证软件包的签名是否与* .asc密钥文件的签名匹配。您应该看到确认签名正确的确认。
解压安装包
1
tar xvf harbor-offline-installer-v2.1.2.tgz
配置 HTTPS 访问 Harbor
默认,Harbor 不附带任何证书。在 1.9.x 及以下版本中,在默认情况下,harbor 使用 HTTP 服务注册表请求。这仅在测试或开发环境中可以接受。在生产环境中,请始终使用 HTTPS。如果启用 Content Trust with Notary
来正确签名所有 Images,则必须使用 HTTPS。你可使用由受信任的第三方 CA 签名的证书,也可以使用自签名证书。
生成自签名证书
在生产环境中,您应该从CA获得证书。在测试或开发环境中,您可以生成自己的CA。要生成CA证书,请运行以下命令。
生成 CA 私钥证书
1
2mkdir certs && cd certs
openssl genrsa -out ca.key 4096生成 CA 证书,这里使用域名
harbor.59izt.com
1
2
3
4openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.59izt.com" \
-key ca.key \
-out ca.crt
生成服务器证书
证书通常包含一个 .crt
文件和一个 .key
文件。如:harbor.59izt.com.crt
和 harbor.59izt.com.key
生成私钥
1
openssl genrsa -out harbor.59izt.com.key 4096
生成证书签名请求(CSR),注意
Subj
参数中的CN
的值。必须为域名1
2
3
4openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=harbor.59izt.com" \
-key harbor.59izt.com.key \
-out harbor.59izt.com.csr生成一个 x509 v3 扩展文件,无论你是使用域名还是IP地址连接到 Harbor 主机,都必须创建此文件,以便可以为你的 harbor 主机生成符合主题备用名称(SAM)和 x509 v3 的证书扩展要求。替换下面的 DNS 为你的域
1
2
3
4
5
6
7
8
9
10
11
12cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=harbor.59izt.com
DNS.2=harbor.59izt
DNS.3=harbor
EOF使用 v3.ext 文件为 Harbor 主机生成证书
1
2
3
4
5openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in harbor.59izt.com.csr \
-out harbor.59izt.com.crt
给 Harbor 和 Docker 配置证书
在生成 ca.crt,harbor.59izt.com.crt 和 harbor.59izt.com.key 文件后,必须将它们提供给 Harbor 和 Docker,然后重新配置 Harbor 以使用它们。
将服务器证书和秘钥复制到 harbor 主机上的 certificates 文件夹中
1
2cp harbor.59izt.com.crt /data/certs/
cp harbor.59izt.com.key /data/certs/转换 harbor.59izt.com.crt 为 harbor.59izt.com.cert 文件给 Docker 使用, Docker 守护程序将 .crt 文件解释为 CA 证书,将 .cert 文件解释为客户端证书
1
openssl x509 -inform PEM -in harbor.59izt.com.crt -out harbor.59izt.com.cert
复制服务器证书,秘钥和 CA 文件到 Harbor 主机上的 Docker 证书文件夹中。你必须先创建文件夹
1
2
3
4mkdir -p /etc/docker/certs.d/harbor.59izt.com/
cp harbor.59izt.com.cert \
harbor.59izt.com.key \
ca.crt /etc/docker/certs.d/harbor.59izt.com/如果不是使用默认的 443 端口,那么证书存放的文件夹名称为:
1
2
3/etc/docker/certs.d/harbor.59izt.com:port/
or
/etc/docker/certs.d/harbor_IP:port/重启 Docker 服务
1
systemctl restart docker
安装 Harbor
一旦配置了从 harbor.yml.tmpl 复制的 harbor.yml 并有选择地设置了存储后端,就可以使用 install.sh 脚本简单安装并启动 Harbor。
可以以不同的配置安装Harbor:
- 只是 harbor,没有 Notary,Trivy,Clair 或 chart Repository Sevice
- habor 和 Notary
- harbor 和 Trivy
- Habor 和 Clair
- Harbor 和 Chart Repository Service
- 包含两个或三个 Notary,Trivy,Clair 和 Chart Repository 的 Harbor
最简化安装
创建 harbor.yml 配置文件
1
cp harbor.yml.tmpl harbor.yml
修改配置文件中的几个配置,如下:
1
2
3
4
5
6hostname: harbor.59izt.com
https:
port: 443
certificate: /data/certs/harbor.59izt.com.crt
private_key: /data/certs/harbor.59izt.com.key
data_volume: /data/harbor默认的 Harbor 安装不包括 Notary 或 Trivy,Clair 服务。运行以下命令
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15# 创建 Harbor 数据目录,日志存放目录
mkdir -p /data/harbor /var/log/harbor
# 执行安装
sudo ./install.sh
[Step 0]: checking if docker is installed ...
Note: docker version: 20.10.1
[Step 1]: checking docker-compose is installed ...
Note: docker-compose version: 1.18.0
....
Creating harbor-core ...
Creating harbor-jobservice ...
Creating nginx ...
✔ ----Harbor has been installed and started successfully.----如上,如果安装成功,则可以打开浏览器以访问位于
http://harbor.59izt.com
的 Harbor 界面,将 harbor.59izt.com 更改为在 harbor.yml 中配置的主机名。如果未在 harbor.yml 中进行更改,则默认的管理员用户名和密码为 admin 和 Harbor12345。登录到管理门户并创建一个新项目,例如 myproject。然后,您可以使用 Docker 命令登录到 Harbor,标记 image 并将其推送到Harbor。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23# docker login harbor.59izt.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /home/wanwu/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# docker tag goharbor/harbor-core:v2.1.2 harbor.59izt.com/myproject/harbor-core:v2.1.2
# docker push harbor.59izt.com/myproject/harbor-core:v2.1.2
The push refers to repository [harbor.59izt.com/myproject/harbor-core]
c224ac6b2bbd: Pushed
d84c44c9e421: Pushed
d9762d29a79e: Pushed
9ce8bd7c9cc2: Pushed
f73ff896d59e: Pushed
dabb8c8d8330: Pushed
1015a890d0ff: Pushed
45759140eb84: Pushed
f4813c3208bf: Pushed
52ba3ba61de4: Pushed
v2.1.2: digest: sha256:7d48a344c20c864dc823b023d09bb8fe8f59e8d1ee8a9673dac9d71cae7b6b3a size: 2410如果安装的 Harbor 使用 HTTPS,则必须向 Docker 客户端提供 Harbor 证书。有关信息,请参阅 配置对Harbor 的 HTTPS 访问。
如果安装的 Harbor 使用HTTP,则必须在客户端的 Docker 守护程序中添加 –insecure-registry 选项,然后重新启动 Docker 服务。有关更多信息,请参见 通过 HTTP 连接到Harbor。
Installation with Notary
要使用公证服务安装 Harbor,请在运行 install.sh 时添加 –with-notary 参数:
1 | sudo ./install.sh --with-notary |
要使用 Notary 进行安装,必须将 Harbor 配置为使用HTTPS。
Installation with Trivy
要使用 Trivy 服务安装 Harbor,请在运行 install.sh 时添加 –with-trivy 参数:
1 | sudo ./install.sh --with-notary |
Installation with Clair
1 | sudo ./install.sh --with-clair |
默认情况下,Harbour 将 Clair 容器的CPU使用率限制为 150000,以避免耗尽所有CPU资源。这是在 docker-compose.clair.yml 文件中定义的。您可以根据硬件配置修改此文件。
Installation with Chart Repository Service
1 | sudo ./install.sh --with-chartmuseum |
安装所有模块
1 | sudo ./install.sh --with-notary --with-trivy --with-clair --with-chartmuseum |