Harbor 是VMware公司开源的企业级Docker Registry项目,其目标是帮助用户迅速搭建一个企业级的Docker Registry服务。

作为一个企业级私有的Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。

Harbor特性

  • 基于角色的访问控制—用户与Docker镜像仓库通过“项目”进行组织管理,一个用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
  • 镜像复制—镜像可以在多个Registry实例中复制(同步)。尤其适合与负载均衡,高可用,混合云和多云的场景。
  • AD/LDAP支持—Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
  • 审计管理—所有针对镜像仓库的操作都可以被追溯,用于审计管理。
  • 国际化—已拥有中文、英文、德文、日文和俄文的本地化版本。更多的语言会添加进来。
  • RESTful API—RESTful API提供给管理员对于Harbor更多的操控,使得与其他管理软件集成变得更容易
  • 部署简单—Docker-compose和离线安装

概念

Harbor是企业级docker镜像仓库,而registry是私有仓库

Registry的缺点

1、安全性能不足

2、纯命令行操作,没有图形化界面

harbor组件

Proxy代理:主要实现对请求的识别和转发,是一个内置的nginx

Registry:实现对docker pull / docker push命令的响应,也负责对token的验证

log collector:收集日志

Core service:核心服务器

​ UI:提供图形化界面,帮助用户管理镜像,并授权

​ token:验证权限

​ webhook:把镜像状态及时传递给UI

Database:负责存储用户权限,审计日志、Docker image等数据

Job service:负责镜像在harbor仓库之间的同步和传输(多实例同步)

Log collector:为了帮助监控 Harbor 运行,负责收集其他组件的 log,供日后进行分析。

运行容器 log:运行着 rsyslogd 的容器,通过 log-driver 的形式收集其他容器的日志。

harbor原理

harbor

从客户端到代理的请求,Proxy来查看请求的目的是查看数据,然后将请求转发到Core services,而ui界面的数据来自Database;如果请求的目的是上传镜像,将转发到Registry,而上传镜像同样需要权限,进行token验证,经过Core services,然后将要上传的镜像传输到Database,Job services会拿取Database的数据用来与其他Harbor仓库进行同步传输

搭建域名服务

因为要使用域名来访问harbor,所以要做自建的域名服务

安装bind软件包以及工具包

yum -y install bind bind-utils bind-libs bind-chroot epel-release vim

修改主配置文件

$ vim /etc/named.conf 
options {
        listen-on port 53 { any; }; # 改为any,监听地址
        ...
        allow-query     { any; }; # 改为any,谁可以对当前DNS服务器提出解析请求,any是任何人

修改区域配置文件

$ vim /etc/named.rfc1912.zones
# 末尾添加
zone "yanjiang.chai" IN {   # 引号内修改为自己申请或者定义的二级域,内网自己定义即可
        type master;
        file "yanjiang.chai.zone";  # 指向/var/named目录的正向解析文件
        allow-update { none; };
};

zone "1.168.192.in-addr.arpa" IN {  # 引号内修改为网络位地址的倒序
        type master;
        file "192.168.1.arpa";  # 指向/var/named目录的反向解析文件
        allow-update { none; };
};

创建正向和反向解析配置文件

cd /var/named
#  文件名与区域配置文件中的文件名一致
cp -p named.localhost yanjiang.chai.zone    # 正向解析
cp -p named.localhost 192.168.1.arpa        # 反向解析

修改正向解析

$TTL 1D
$ORIGIN yanjiang.chai.   # 表示以下记录的域来自yanjiang.chai.,如master1来自master1.yanjiang.chai.
@       IN SOA  harbor1.yanjiang.chai. root (  # harbor1.yanjiang.chai.为当前主机域名,root可以改为管理员邮箱,不写管理员邮箱会报错
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@    IN NS    harbor1.yanjiang.chai.  # @表示当前主机,当前主机的域名为harbor1.yanjiang.chai.
# 以下为正向解析记录
harbor1    IN A    192.168.1.12

修改反向解析

$TTL 1D
@       IN SOA  harbor1.yanjiang.chai. root (
                                        0       ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
# 以下为解析记录
    IN NS    harbor1.yanjiang.chai.
12    IN PTR    harbor1.yanjiang.chai.

启动域名服务

systemctl --now enable named

修改三台服务器的nameserver为192.168.1.12

$ vim /etc/resolv.conf
# 第一行添加
echo "nameserver 192.168.1.12" >> /etc/resolv.conf

验证解析

$ nslookup harbor1.yanjiang.chai
Server:        192.168.1.12
Address:    192.168.1.12#53

Name:    harbor1.yanjiang.chai
Address: 192.168.1.12

$ nslookup 192.168.1.12
12.1.168.192.in-addr.arpa    name = harbor1.yanjiang.chai.

准备Harbor环境

环境如下:

HOSTNAME IP OS Hard
harbor1 192.168.1.2 Centos 7.6 4c4g

修改主机名

hostnamectl set-hostname harbor1

安装docker

yum -y install yum-utils device-mapper-persistent-data lvm2 vim epel-release
yum-config-manager --add-repo=http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
yum -y install docker-ce-20.10.6
systemctl --now enable docker

修改国内镜像站请参考 部署Docker

下载docker-compose

curl -L "https://github.com/docker/compose/releases/download/1.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose

下载harbor安装包

wget -P /usr/local https://github.com/goharbor/harbor/releases/download/v2.1.5/harbor-offline-installer-v2.1.5.tgz
tar zxf /usr/local/harbor-offline-installer-v2.1.5.tgz -C /usr/local

HTTPS自签证书

生成CA证书

用来颁发证书

mkdir /usr/local/harbor/pki && cd $_
# 生成CA证书私钥
openssl genrsa -out ca.key 4096
# 生成CA证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
 -subj "/C=CN/ST=Beijing/L=Beijing/O=harbor/OU=Docker/CN=harbor1.yanjiang.chai" \
 -key ca.key \
 -out ca.crt

生成服务器证书

# 生成私钥
openssl genrsa -out harbor1.yanjiang.chai.key 4096
# 生成证书签名请求
openssl req -sha512 -new \
    -subj "/C=CN/ST=Beijing/L=Beijing/O=harbor/OU=Docker/CN=harbor1.yanjiang.chai" \
    -key harbor1.yanjiang.chai.key \
    -out harbor1.yanjiang.chai.csr

生成一个x509 v3扩展文件

无论使用域名还是IP地址连接到Harbor主机,都必须创建此文件,以便可以为Harbor主机生成符合主题备用名称(SAN)和x509 v3的证书扩展要求。

# 使用时为了避免不必要的错误,请将文件中注释删除
cat > v3.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=harbor1.yanjiang.chai    # FQDN完整域名
DNS.2=yanjiang                 # 二级域
DNS.3=harbor1                  # hostname
EOF

生成harbor证书

openssl x509 -req -sha512 -days 3650 \
    -extfile v3.ext \
    -CA ca.crt -CAkey ca.key -CAcreateserial \
    -in harbor1.yanjiang.chai.csr \
    -out harbor1.yanjiang.chai.crt

将服务器证书(harborx.yanjiang.chai.crt)和密钥(harborx.yanjiang.chai.key)复制到 harbor 要指定的路径中,当然也可以不复制,我这里就不复制了,因为我都是在 harbor 所在主机的 harbor 路径做的。

转换harbor证书->docker

部署 harbor 本身就是给 docker 准备的,所以 docker 在使用 harbor 时,也会用到证书。docker 的守护进程将 .crt 文件解释为 CA 证书,.cert 文件为客户端证书

openssl x509 -inform PEM -in harbor1.yanjiang.chai.crt -out harbor1.yanjiang.chai.cert

复制到docker的证书目录

mkdir /etc/docker/certs.d/harbor1.yanjiang.chai -p
cp harbor1.yanjiang.chai.cert /etc/docker/certs.d/harbor1.yanjiang.chai
cp harbor1.yanjiang.chai.key /etc/docker/certs.d/harbor1.yanjiang.chai
cp ca.crt /etc/docker/certs.d/harbor1.yanjiang.chai

重启docker即可

systemctl restart docker

系统级别信任证书

cp harbor1.yanjiang.chai.crt /etc/pki/ca-trust/source/anchors
update-ca-trust

如果想要环境中所有的docker主机都可以识别的话,在每个docker主机都创建对应域名的证书目录。

修改 harbor.yml 配置文件

$ cd /usr/local/harbor/
$ cp harbor.yml.tmpl harbor.yml
$ vim harbor.yml
hostname: harbor1.yanjiang.chai   # 修改为自己ip或者域名
https:
  port: 443
  # 证书文件路径
  certificate: /usr/local/harbor/pki/harbor1.yanjiang.chai.crt
  private_key: /usr/local/harbor/pki/harbor1.yanjiang.chai.key
harbor_admin_password: Harbor12345  # harbor登录密码

部署harbor

$ ./prepare
...
Successfully called func: create_root_cert
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir

$ ./install.sh
...
[Step 5]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating registryctl   ... done
Creating registry      ... done
Creating harbor-db     ... done
Creating harbor-portal ... done
Creating redis         ... done
Creating harbor-core   ... done
Creating harbor-jobservice ... done
Creating nginx             ... done
✔ ----Harbor has been installed and started successfully.----

访问 https://harbor1.yanjiang.chai,若无法访问,则关闭防火墙或者放行443和80端口

默认用户名:admin

默认密码:Harbor12345

Harbor_login

登录后

login_jiemian

可以通过创建项目来,添加一个新项目

create_xiangmu

docker login

在本地使用 docker pulldocker push 操作仓库时,需要登录

# 交互式登录
$ docker login https://harbor1.yanjiang.chai
Username: admin
Password: 
...
Login Succeeded

# 非交互式登录
$ docker login -u admin -p Harbor12345 https://harbor1.yanjiang.chai

测试

部署完harbor后,docker本地会有关于harbor的一些镜像,现在将这些镜像传到harbor仓库当做验证。镜像略多,写脚本上传

先用命令行创建一个项目,该文件用来创建项目

cat << EOF >> createproject.json
{
  "project_name": "goharbor",
  "metadata": {
    "public": "true"
  }
}
EOF

命令行创建harbor仓库项目

curl -u "admin:Harbor12345" -X POST -H "Content-Type: application/json" \
"https://harbor1.yanjiang.chai/api/v2.0/projects" \
-d @createproject.json \
--cacert /usr/local/harbor/pki/ca.crt

查看页面

createproject

上传测试请参考 harbor双主复制

OK!!!

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0