Harbor搭建
一、Harbor简介
1.Harbor介绍
Harbor是一个用于存储Docker镜像的企业级镜像服务器,通过添加一些企业必需的功能特性,如安全、标识和管理等,大大扩展其功能。作为一个企业级私有镜像服务器,Harbor提供了更好的性能和安全。提升用户使用镜像构建和运行环境传输镜像的效率。Harbor支持安装在多个镜像 节点的镜像资源复制,镜像全部保存在私有镜像中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。
2.Harbor特性
基于角色的访问控制 :用户与Docker镜像仓库通过“项目”进行组织管理,同一用户可以对多个镜像仓库在同一命名空间(project)里有不同的权限。
镜像复制 : 镜像可以在多个Registry实例中复制(同步)。尤其适合于负载均衡,高可用,混合云和多云的场景。
图形化用户界面 : 用户可以通过浏览器来浏览,检索当前Docker镜像仓库,管理项目和命名空间。
AD/LDAP 支持 : Harbor可以集成企业内部已有的AD/LDAP,用于鉴权认证管理。
审计管理 : 所有针对镜像仓库的操作都可以被记录追溯,用于审计管理。
国际化 : 已拥有英文、中文、德文、日文和俄文的本地化版本。更多的语言将会添加进来。
RESTful API : RESTful API 提供给管理员对于Harbor更多的操控, 使得与其它管理软件集成变得更容易。
部署简单 : 提供在线和离线两种安装工具, 也可以安装到vSphere平台(OVA方式)虚拟设备。
3.Harbor组件
Harbor在架构上主要由6个组件构成:
Proxy:Harbor的registry, UI, token等服务,通过一个前置的反向代理统一接收浏览器、Docker客户端的请求,并将请求转发给后端不同的服务。
Registry: 负责储存Docker镜像,并处理docker push/pull 命令。由于我们要对用户进行访问控制,即不同用户对Docker image有不同的读写权限,Registry会指向一个token服务,强制用户的每次docker pull/push请求都要携带一个合法的token, Registry会通过公钥对token 进行解密验证。
Core services: 这是Harbor的核心功能,主要提供以下服务:
UI:提供图形化界面,帮助用户管理registry上的镜像(image), 并对用户进行授权。
webhook:为了及时获取registry 上image状态变化的情况, 在Registry上配置webhook,把状态变化传递给UI模块。
token 服务:负责根据用户权限给每个docker push/pull命令签发token. Docker 客户端向Regiøstry服务发起的请求,如果不包含token,会被重定向到这里,获得token后再重新向Registry进行请求。
Database:为core services提供数据库服务,负责储存用户权限、审计日志、Docker image分组信息等数据。
Job Services:提供镜像远程复制功能,可以把本地镜像同步到其他Harbor实例中。
Log collector:为了帮助监控Harbor运行,负责收集其他组件的log,供日后进行分析。
各个组件之间的关系如下图所示:
4.Harbor实现
Harbor的每个组件都是以Docker容器的形式运行的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的,大致介绍每个容器的作用,后面具体查看 。
nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和存储镜像的docker registry。
harbor-jobservice:harbor-jobservice 是harbor的job管理模块,job在harbor里面主要是为了镜像仓库之前同步使用的;
harbor-ui:harbor-ui是web管理页面,主要是前端的页面和后端CURD的接口;
registry:registry就是docker原生的仓库,负责保存镜像。
harbor-adminserver:harbor-adminserver是harbor系统管理接口,可以修改系统配置以及获取系统信息。
这几个容器通过Docker link的形式连接在一起,在容器之间通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。
harbor-db:harbor-db是harbor的数据库,这里保存了系统的job以及项目、人员权限管理。由于本harbor的认证也是通过数据,在生产环节可以对接到企业的ldap中;
harbor-log:harbor-log是harbor的日志服务,统一管理harbor的日志。通过inspect可以看出容器统一将日志输出的syslog。
这几个容器通过Docker link的形式连接在一起,这样,在容器之间可以通过容器名字互相访问。对终端用户而言,只需要暴露proxy (即Nginx)的服务端口。
5.harbor和registry的区别
Registry是Dcoker官方的一个私有仓库镜像,可以将本地的镜像打标签进行标记然后push到以Registry起的容器的私有仓库中。企业可以根据自己的需求,使用Dokcerfile生成自己的镜像,并推到私有仓库中,这样可以大大提高拉取镜像的效率。
区别:
1)提供分层传输机制,优化网络传输
Docker镜像是是分层的,而如果每次传输都使用全量文件,显然太浪费资源。必须提供识别分层传输的机制,以层的UUID为标识,确定传输的对象。
2)提供WEB界面,优化用户体验
用户可以通过web界面对镜像镜像管理,特别是对不太熟悉命令行的人非常友好。
3)支持水平扩展集群
当有用户对镜像的上传下载操作集中在某台服务器时,压力可能会比较大,有时候需要需要对访问分散
4)良好的安全机制
企业中有很多不同的职位,对于不同的职位人员,分配不同的权限,对服务具有更好的安全性。
5)Harbor提供了基于角色的访问控制机制,并通过项目对镜像进行组织和访问权限的控制。
二、安装和配置Harbor
1.环境说明
系统版本:CentOS Linux release 7.6.1810 (Core)
docker:19.03
docker-compose:1.18.0
Harbor:v2.8.1
官方参考(里面有说明环境要求啥的,更多harbor版本可自行选择):https://github.com/goharbor/harbor/tree/v2.8.1
2.首先安装docker和docker-compose(略)
3.下载Harbor安装包
安装方式分为在线安装和离线安装两种方式,我这里选择的是在线安装。区别,离线安装压缩包有所需镜像,而在线安装包里面的镜像需要临时拉取。
在线安装:
wget -P /usr/loca/src/ https://github.com/goharbor/harbor/releases/download/v2.8.1/harbor-online-installer-v2.8.1.tgz (包很小,容易直接下载下来)
内网环境也可以选择离线安装:
wget -P /usr/loca/src/ https://github.com/goharbor/harbor/releases/download/v2.8.1/harbor-offline-installer-v2.8.1.tgz
不过这个文件比较大,不容易下载成功
[root@k8s-m1 src]wget -P /usr/local/src/ https://github.com/goharbor/harbor/releases/download/v2.8.1/harbor-online-installer-v2.8.1.tgz
[root@k8s-m1 src]cd /usr/local/src/
[root@k8s-m1 src]# tar -xvf harbor-online-installer-v2.8.1.tgz -C /usr/local/
[root@k8s-m1 src]cd /usr/local/harbor/
4、修改配置文件
先拷贝一份初始配置文件
cp harbor.yml.tmpl harbor.yml
修改配置文件:
1)hostname:访问地址,配置成IP或者域名都可以,域名需要配置DNS
2)先注释https的相关配置,先使用http的方式
5、运行
第一次需要在线安装需要拉取相应的镜像,稍作等待。
[root@k8s-m1 harbor]sh /usr/local/harbor/install.sh
Creating nginx … done
Creating redis …
Creating registry …
Creating registryctl …
Creating harbor-db …
Creating harbor-portal …
Creating harbor-core …
Creating harbor-jobservice …
Creating nginx …
✔ ----Harbor has been installed and started successfully.
6、Harbor启动和停止
Harbor 的日常运维管理是通过docker-compose来完成的,Harbor本身有多个服务进程,都放在docker容器之中运行,我们可以通过docker ps命令查看或者docker-compose的相关命令来查看。
[root@k8s-m1 harbor]# docker ps
[root@k8s-m1 harbor]# docker-compose ps
[root@k8s-m1 harbor]# docker-compose start
[root@k8s-m1 harbor]# docker-compose stop
[root@k8s-m1 harbor]# docker-compose restart
7、访问测试
配置好本地hosts,就可以通过web界面访问管理自己的私有仓库啦。
默认账号密码: admin / Harbor12345 登录后可修改密码
三、Harbor的使用
1、配置基本信息
登陆到harbor的web界面后,可以添加一些新项目和用户。其他看自己需要,或者慢慢研究其深入使用。
2、发布镜像到Harbor
1)修改docker配置
对于发布到harbor的镜像有名称的要求,必须满足: harbor地址/项目名/镜像名:版本
对于非安全的端口的镜像库,要使用需要在相应的服务器修改insecure-registry,然后才能登陆,因为默认都会转到https的端口,如下:
修改daemon.json
该文件中配置支持的Docker仓库,然后重启Docker:
[root@k8s-m1 ~]# vim /etc/docker/daemon.json
{
"insecure-registries":["docker.harbor.com"] # harbor仓库
}
[root@k8s-m1 ~]#systemctl restart docker
2)、登录harbor
然后需要在服务器上登录到harbor,这样才能进行推送镜像的操作:
复制代码
[root@k8s-m1 ~]# vim /etc/hosts
[root@k8s-m1 ~]# docker login docker.margu.com #注意要先配置本地hosts
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
3)、可以进行镜像的推送拉取(略)
四、带证书的Harbor安装
上面对Harbor的配置都是使用的http协议访问,但是我们工作中一般都不会去单独配置insecure-registry且重启docker服务,所以我们需要配置https访问。所以下面我们进行对Harbor进行https的相关配置。
1、创建 CA 私钥
[root@k8s-m1 ~]# openssl genrsa -out "root-ca.key" 2048
Generating RSA private key, 2048 bit long modulus
2、利用私钥创建 CA 根证书请求文件
[root@k8s-m1 ~]# openssl req -new -key "root-ca.key" -out "root-ca.csr" -sha256 -subj '/C=CN/ST=sichuang/L=chengdu/O=margu/CN=docker.margu.com'
[root@k8s-m1 ~]# ll root-ca.csr
-rw-r--r-- 1 root root 989 May 22 21:54 root-ca.csr
以上命令中 -subj 参数里的 /C 表示国家,如 CN;/ST 表示省;/L 表示城市或者地区;/O 表示组织名;/CN 通用名称。
3、配置 CA 根证书,新建 root-ca.cnf
[root@k8s-m1 ~]#vim root-ca.cnf
[root_ca]
basicConstraints = critical,CA:TRUE,pathlen:1
keyUsage = critical, nonRepudiation, cRLSign, keyCertSign
subjectKeyIdentifier=hash
4、签发根证书
[root@k8s-m1 ~]# openssl x509 -req -days 3650 -in "root-ca.csr" -signkey "root-ca.key" -sha256 -out "root-ca.crt" -extfile "root-ca.cnf" -extensions root_ca
Signature ok
subject=/C=CN/ST=sichuang/L=chengdu/O=margu/CN=docker.margu.com
Getting Private key
5、生成站点 SSL 私钥
[root@k8s-m1 ~]# openssl genrsa -out "docker.margu.com.key" 2048
Generating RSA private key, 2048 bit long modulus
.....................................................................................................................+++
.........................................................+++
e is 65537 (0x10001)
6、使用私钥生成证书请求文件
[root@k8s-m1 ~]# openssl req -new -key "docker.margu.com.key" -out "site.csr" -sha256 -subj '/C=CN/ST=sichuan/L=chengdu/O=margu/CN=docker.margu.com'
7、配置证书,新建 site.cnf 文件
[root@k8s-m1 ~]#vim site.cnf
[server]
authorityKeyIdentifier=keyid,issuer
basicConstraints = critical,CA:FALSE
extendedKeyUsage=serverAuth
keyUsage = critical, digitalSignature, keyEncipherment
subjectAltName = DNS:docker.domain.com, IP:192.168.2.140
subjectKeyIdentifier=hash
8、签署站点 SSL 证书
[root@k8s-m1 ~]# openssl x509 -req -days 750 -in "site.csr" -sha256 -CA "root-ca.crt" -CAkey "root-ca.key" -CAcreateserial -out "docker.margu.com.crt" -extfile "site.cnf" -extensions server
Signature ok
subject=/C=CN/ST=sichuan/L=chengdu/O=margu/CN=docker.margu.com
Getting CA Private Key
这样已经拥有了 docker.domain.com 的网站 SSL 私钥 docker.domain.com.key 和 SSL 证书 docker.domain.com.crt 及 CA 根证书 root-ca.crt。
新建/usr/local/harbor/certs文件夹并将 docker.domain.com.key docker.domain.com.crt root-ca.crt 这三个文件移入,其他文件也可以移进去。
[root@k8s-m1 ~]# mkdir -p /usr/local/harbor/certs
[root@k8s-m1 ~]# mv docker.margu.com.key docker.margu.com.crt root-ca.crt /usr/local/harbor/certs
9、修改Harbor配置文件
因为Harbor默认使用http协议访问,所以我们这里在配置文件中,配置好域名,开启https配置;
10、开始安装Harbor
[root@k8s-m1 harbor]# sh install.sh
由于自行签发的 CA 根证书不被系统信任,所以我们还是需要将 CA 根证书 root-ca.crt 移入 /etc/docker/certs.d/docker.margu.com 文件夹中,其他服务器也需要该文件(很麻烦),所以通用证书就很方便, 可以不用自己制作证书。
[root@k8s-m1 ~]# mkdir -p /etc/docker/certs.d/docker.margu.com
[root@k8s-m1 ~]#cp /root/registry/ssl/root-ca.crt /etc/docker/certs.d/docker.margu.com/ca.crt
[root@k8s-m1 harbor]# docker login docker.margu.com #不用加insecure-registry的相关配置了
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
PS:如果过程不通,请指正