「Docker Registry」- 搭建 Harbor 镜像仓库(Harbor v2.1.5、HTTPS)

  CREATED BY JENKINSBOT

问题描述

Harbor —— 高级版的 Registry 服务。Harboar 是一种开源、可信、云原生的 Registry 项目,用于存储、签名、扫描内容。通过添加用户通常需要的功能(如安全性,身份,管理)来扩展开源 Docker Distribution 。”拥有靠近构建和运行环境的 Registry“可以提高镜像传输效率。Harbor,支持在 Registry 之间复制映像,还提供高级安全功能(如用户管理,访问控制,活动审计)。

该笔记将记录:在 Linux 中,如何搭建 Harbor 镜像仓库,以及相关问题的处理方法。

解决方案

第一步、检查系统要求

On a Linux host,2 CPU 4 GB 40 GB(4 CPU,8 GB,160 GB)
docker 17.06.0-ce+:参考 Installing Docker 笔记
docker-compose 1.18.0+:参考 Docker Compose 笔记;
Openssl Latest is preferred:我们不使用自签名,因此不依赖该工具。

网络端口:
1)443 HTTPS,80 HTTP,服务接口用于接收请求;
2)4443 HTTPS,在启用 Notary 时需要该端口,而我们无需使用;

第二步、下载安装包

我们使用在线安装包:

wget https://github.com/goharbor/harbor/releases/download/v2.1.5/harbor-online-installer-v2.1.5.tgz

tar xvf harbor-online-installer-v2.1.5.tgz

cd harbor

cp -v harbor.yml.tmpl harbor.yml # 后续步骤,多以修改 harbor.yml 为主

注意事项,我们这里未使用 .asc 进行安装校验。

第三步、申请 HTTPS 证书

证书申请方法,参考 Certbot/DNS Chanllenge 笔记;

然后,配置 Harboar 使用 HTTPS 证书:

# vim harbor.yml 
...
# https related config
https:
  # https port for harbor, default is 443
  port: 443
  # The path of cert and key files for nginx
  certificate: /your/certificate/path
  private_key: /your/private/key/path
...

第四步、安装 Harboar 服务

修改其他必要配置:

...
hostname: reg.mydomain.com
...
harbor_admin_password: Harbor12345
...
data_volume: /data
...

启动服务:

./install.sh --with-notary --with-clair --with-chartmuseum

# 如果无需 notary clair Chart 服务,仅作为 Registry 服务,则:
./install.sh

# 补充说明:
# chartmuseum 是支持作为 Helm 仓库;
# clair 是容器的漏洞静态分析工具;
# notray 是镜像的签名工具,用来保证镜像在 pull,push 和传输过程中的一致性和完整性。避免中间人攻击,避免非法的镜像更新和运行。

第五步、访问验证

打开浏览器,访问验证 Harbor 服务正常运行。

关于 Nginx 反向代理

默认情况,Harbor 占用 80 443 端口。如果修改为其他端口,并使用 Nginx 方向代理,有以下两种配置方法:

方法一、通过 proxy_pass http 代理

类似以往 proxy_pass 反向代理:nginx1 (https, letsencrypt) ⇒ harbor proxy (nginx, http) ⇒ harbor ui/registry

但是,在 Harbor 中,这种拓扑需要进行如下配置:
1)Running Harbor with HTTP behind a HTTPS Reverse Proxy (nginx) · Issue #3114 · goharbor/harbor
2)Harbor docs / Using nginx or Load Balancing

但是,这种部署方案会给日后的维护带来困难,并且需要在文档中清楚明了的记录(我们未采用该方案)。

此外,如果使用 Harbor 的 Notary 特性,则 Harbor 必须以开启 HTTPS 监听。

如果 Harboar 继续监听 HTTPS 协议,反向代理到 HTTPS 端口,则需要维护两套 TLS 证书:1)Harbor 使用的 TLS 证书;2)前端 Nginx 使用的 TLS 证书。当证书续期时,需要同时重启 Harbor 与 Nginx 服务。

方法二、通过 steam 负载均衡

修改 /etc/nginx/nginx.conf 文件,添加如下配置:

stream {
    upstream harbor_registry {
        server 127.0.0.1:29443;
    }
    server {
        listen 0.0.0.0:443;
        proxy_pass harbor_registry;
    }
}

// 注意事项:
// 指令 steam 在 main 中,即直接写入 /etc/nginx/nginx.conf 文件。不要写入 http {} 中

这种方法会丢失客户端的真实 IP 地址。

使用 Harbor 作为 Registry Mirror 服务(WIP)

根据 harbor/Configure_mirror.md at v2.1.5 文档,虽然 Harobr 支持作为 Registry Mirror 服务,但是我们实在是没有找到 Deploy/templates/registry/config.yml 配置文件的目录。此外作为 Registry Mirror 的 Harobr 服务,无法接收镜像推送请求。

根据 Configure Proxy Cache 文档,但是 Harbor 支持创建“Cache Project”,该 Project 用于第三方缓存镜像。如果某个镜像不存在,将自动访问 DockerHub 拉取镜像(或其他镜像仓库)。该方案并不能替代 Registry Mirror 服务。

因此,我们未使用 Harbor 作为 Registry Mirror 服务,而选择自行搭建(参考 2.Registry Mirror (Official) 笔记)。

补充说明:
1)我们对 Cache Project 的理解还有欠缺,比如 Project Name 是否需要和 DockerHub 名称匹配;
2)但是它绝对不像我们理解的那种 Registry Mirror 服务,而是作为中间曾并需要进行配置;

常见错误汇总

the protocol must be https when Harbor is deployed with Notary

[Step 2]: preparing environment ...

[Step 3]: preparing harbor configs ...
prepare base dir is set to /data/harbor/application/registry
ERROR:root:Error: the protocol must be https when Harbor is deployed with Notary
Clearing the configuration file: /config/portal/nginx.conf

如果启用 Notary 服务,则必须使用 HTTPS 服务。

参考文献

GitHub/goharbor/harbor
Installation and Configuration Guide
Use vmware Harbor to build Mirror Registry – Programmer Sought
harbor/README.md at master · goharbor/harbor
Harbor docs | Configure HTTPS Access to Harbor