Harbor容器镜像仓库高可用方案
- 1 Harbor简介
- 2 Harbor架构图
- 3 Harbor必要组件
- 4 Harbor虚机配置
- 5 系统优化
- 6 环境准备
- 7 部署Harbor
- 8 Harbor高可用方案
- 9 Harbor高可用部署
- 10 验证
- 11 Harbor权限管理
- 12 Harbor镜像漏洞扫描
- 13 参考文献
1 Harbor简介
Docker容器应用的开发和运行离不开可靠的镜像管理,Docker官方提供了原生的Registry,但其功能比较简单,而且没有可视化界面,自然无法满足企业级的需求。虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。
为了解决以上需求,VMware公司推出了Harbor,Harbor 是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、LDAP、安全漏洞扫描、镜像验真、管理界面、自我注册、HA 等企业必需的功能。
2 Harbor架构图
3 Harbor必要组件
- Proxy:用于转发用户的请求到后端的反向代理,通过Nginx官方镜像实现
- Registry:原生的Docker镜像仓库,负责存储镜像文件,实现Pull/Push等功能
- Database:保存项目/用户/角色/复制策略等信息到数据中,这里使用的镜像是Postgres数据库,而不是传统的Mariadb/Mysql
- Core Service:提供图形化操作界面,帮助用户管理Registry上的镜像,并对用户进行授权
- Job Services:镜像复制,用户可以配置在Harbor实例之间进行镜像的复制和同步等操作
- Log Collector:日志收集,负责收集各个镜像的日志进行统一管理
4 Harbor虚机配置
主机 | 系统 | IP地址 | 节点角色 |
Harbor-1 | Centos7.6 | 192.168.4.200 | Master |
Harbor-2 | Centos7.6 | 192.168.4.201 | Worker |
服务器具体配置要求如下:
- 至少2G内存
- 至少2核CPU
- 磁盘至少100G
5 系统优化
主机的优化不单纯只是软硬件的优化,基于操作系统的性能优化也是多方面的,可以从几个方面进行衡量,以更好的提高主机的性能。
5.1 关闭SELinux(Master、Worker)
SELinux不关闭的情况下无法实现,会限制ssh免密码登录。
[root@harbor ~]# setenforce 0
[root@harbor ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/sysconfig/selinux
5.2 关闭防火墙(Master、Worker)
防止安装时出现各个组件的端口不能访问的问题。
[root@harbor ~]# systemctl stop firewalld && systemctl disable firewalld
5.3 时间同步(Master、Worker)
同步时间可以有效解决因时间不同而造成的不同步。
[root@harbor ~]# yum -y install ntp
[root@harbor ~]# ntpdate ntp1.aliyun.com
[root@harbor ~]# timedatectl set-timezone Asia/Shanghai
5.4 修改系统打开文件最大数量(Master、Worker)
放开系统打开文件最大数量,防止因达到上限值而导致的进程终止。
[root@harbor ~]# vi /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
6 环境准备
两台机器需要事先安装好Docker、Docker-compose,并且将Harbor安装脚本下载到本地。
6.1 安装Docker(Master、Worker)
添加Docker Yum源,安装Docker组件。
[root@harbor ~]# yum install -y yum-utils
[root@harbor ~]# yum-config-manager --add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
[root@harbor ~]# yum -y install docker-ce docker-ce-cli containerd.io
[root@harbor ~]# systemctl start docker
[root@harbor ~]# systemctl enable docker
6.2 下载Harbor离线安装包(Master、Worker)
在Github下载离线安装包:https://github.com/goharbor/harbor/releases(推荐使用迅雷下载)
7 部署Harbor
7.1 配置Harbor(Master、Worker)
将下载的Harbor压缩包上传到Master和Woker节点,修改Harbor配置文件。
[root@harbor ~]# tar -zxvf harbor-offline-installer-v2.0.2.tgz
[root@harbor ~]# cd harbor
[root@harbor harbor]# cp harbor.yml.tmpl harbor.tml
[root@harbor harbor]# vi harbor.yml
# 修改为当前所在节点的ip
hostname: 192.168.4.200
# 登录界面的密码
harbor_admin_password: tera123
# harbor的版本号
_version: 2.0.2
# 将https相关的配置给注释掉,这里为了简单只使用http,而且也可以在nginx那一层去做https
#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
7.2 安装Harbor(Master、Worker)
准备好配置文件后,安装docker-compose,因为Harbor的安装脚本基于docker-compose去安装的。
[root@harbor harbor]# curl -L \
"https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
[root@harbor harbor]# chmod 755 /usr/local/bin/docker-compose
[root@harbor harbor]# ./install.sh
7.3 访问Harbor
安装完成之后,使用浏览器访问Harbor,可以进入登录页面。默认账户admin。
8 Harbor高可用方案
本次采用的高可用方案是Harbor的主备复制,需要两个Harbor节点。Master和Worker之间能够互相复制,然后通过Nginx代理Harbor Master节点提供外部访问。这里采用的高可用方案是分钟级的,主要是通过Nginx代理Master节点,当Master节点挂掉后手动的修改Nginx配置文件去代理另一个可用节点。
高可用方案一般选用开源的Keepalived+Nginx,而本次方案并没有采用Keepalived的原因主要有两个:
- 我们的虚机是部署在OpenStack上的,云环境基本无法使用Keepalived,云服务商一般也不支持自定义外网可访问的虚拟IP,当然部署在内网物理服务器上是可以使用Keepalived的。
- 两个Harbor节点之间的同步是存在延时的,而且镜像通常都比较大,所以这个延迟会非常的明显。一般镜像推送完马上就会调度拉取,所以这个延迟时间一般是不可接受的。如果让Nginx代理两个节点就会出现一会请求A一会请求B的问题,造成镜像Pull/Push不成功。但由于Harbor是给公司内部的开发人员使用,通常可以允许分钟级别的不可用。
9 Harbor高可用部署
Harbor在部署好之后组件中包含了Nginx并且占用了宿主机的80端口,我们通过修改Harbor安装脚本的YAML文件来修改Nginx占用宿主机端口,并且拉取新的Nginx容器反向代理Master节点。Master节点和Worker节点之间配置主从复制,以达到Harbor分钟级高可用的目的。
9.1 删除Harbor容器(Master)
强制删除Master节点创建的所有Harbor容器,容器在创建之前已经做了文件夹的映射,数据不会丢失。
[root@harbor harbor]# docker rm -f `docker ps |awk '{print $1}' |grep -v CON`
9.2 修改部署文件(Master)
修改YAML文件中Proxy组件Nginx服务的端口映射。
[root@harbor harbor]# vi docker-compose.yml
proxy:
image: goharbor/nginx-photon:v2.0.2
container_name: nginx
restart: always
cap_drop:
- ALL
cap_add:
- CHOWN
- SETGID
- SETUID
- NET_BIND_SERVICE
volumes:
- ./common/config/nginx:/etc/nginx:z
- type: bind
source: ./common/config/shared/trust-certificates
target: /harbor_cust_cert
networks:
- harbor
dns_search: .
ports:
- 8888:8080
depends_on:
- registry
- core
- portal
- log
logging:
driver: "syslog"
options:
syslog-address: "tcp://127.0.0.1:1514"
tag: "proxy"
9.3 重新部署Harbor容器(Master)
手动使用docker-compose重新部署Harbor容器,不能使用安装脚本部署。
[root@harbor harbor]# docker-compose up -d
9.4 部署Nginx反向代理(Master)
[root@harbor ~]# mkdir nginx
[root@harbor ~]# cd nginx
[root@harbor nginx]# vi nginx.conf
user nginx;
worker_processes 2;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream hub{
server 192.168.4.200:8888;
}
server {
listen 80;
proxy_pass hub;
proxy_timeout 300s;
proxy_connect_timeout 5s;
}
}
[root@harbor nginx]# docker run -itd --net=host --name harbor-nginx \
-v /root/nginx/nginx.conf:/etc/nginx/nginx.conf nginx
9.5 配置Harbor节点主从复制
浏览器登录Harbor,配置Harbor节点之间的复制功能,使两个节点能够同步镜像数据。
首先到Master节点的”仓库管理”界面中创建一个新的目标,目标是Worker节点。
然后到”复制管理”界面中新建复制规则。
10 验证
搭建好Harbor之后,测试能否正常使用。将默认的Library项目删除掉,然后创建新的项目。
10.1 创建项目
填写项目名称、访问级别以及项目仓库的存储容量。
10.2 Pull/Push镜像(Master、Worker)
在服务器上测试镜像的Pull和Push。由于搭建的私有仓库默认是不受Docker信任的,所以需要修改配置文件让Docker信任该Registry。
[root@harbor ~]# vi /etc/docker/daemon.json
{
"insecure-registries": ["192.168.4.200"]
}
[root@harbor ~]# systemctl restart docker
[root@harbor ~]# docker login 192.168.4.200
Username: admin
Password:
Login Succeeded
[root@harbor ~]# docker tag nginx:latest 192.168.4.200/asterfusion/nginx:latest
[root@harbor ~]# docker push nginx:latest 192.168.4.200/asterfusion/nginx:latest
11 Harbor权限管理
11.1 创建用户
在Harbor管理页面创建用户,并且填写相关信息。创建完成之后可以选择设置用户为管理员,之后就可以通过登录此用户来配置管理Harbor。
11.2 登录用户拉取镜像
使用刚创建的用户登录,拉取镜像会失败。因为Harbor的权限管理机制,没有经过授权无法随意拉取镜像,我们需要将创建的用户添加到镜像仓库中去,才可以拉取镜像。
[root@harbor ~]# docker login 192.168.4.200
Username: asterfusion
Password:
Login Succeeded
[root@harbor ~]# docker pull \
192.168.4.200/asterfusion/redis@sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa
Trying to pull repository 192.168.4.200/asterfusion/redis ...
unauthorized: unauthorized to access repository: asterfusion/redis, action: pull: unauthorized to access repository: asterfusion/redis, action: pull
11.3 镜像仓库添加用户
在镜像仓库中添加新用户,并且选择用户的角色,在这里我们需要对镜像作Push和Pull操作。
11.4 验证
[root@harbor ~]# docker login 192.168.4.200
Username: asterfusion
Password:
Login Succeeded
[root@harbor ~]# docker pull\
192.168.4.200/asterfusion/redis@sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa
Trying to pull repository 192.168.4.200/asterfusion/redis ...
sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa: Pulling from 192.168.4.200/asterfusion/redis
07cd1d2c25e7: Pull complete
4319f9523628: Pull complete
286473b88c0c: Pull complete
d42081d9071a: Pull complete
f945dcaa9608: Pull complete
Digest: sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa
Status: Downloaded newer image for
192.168.4.200/asterfusion/redis@sha256:2510920e4faef376509a41bbfe58ea62f3e3e1c0dbcfca579581909b279ebaaa
12 Harbor镜像漏洞扫描
镜像安全是容器化建设中一个很重要的环节,在Harbor中集成了开源项目Clair的扫描功能,可以帮助用户发现容器镜像中的安全漏洞,及时采取防范措施。
12.1 添加扫描模块(Master)
[root@harbor harbor]# ./prepare –with-clair
[root@harbor harbor]# docker-compose -f docker-compose.yml up -d
12.2 新建扫描器
在审查服务中新建扫描器。
12.3 测试扫描
编辑好定时规则之后,我们可以手动进行漏洞扫描
12.4 查看扫描结果
可以看到我们的测试镜像中有一个发现了漏洞,通过日志可以看到具体的ERROR信息。
13 参考文献
Harbor官方文档:https://goharbor.io/docs/2.0.0/install-config/
Docker官方文档:https://docs.docker.com/engine/install/centos/
GitHub仓库地址:https://github.com/goharbor/harbor/wiki
更多内容请参考:A-Lab