Skip to main content
开放网络的先行者与推动者—星融元
加入我们技术支持(Support)  TEL:(+86)4000989811
Harbor

Harbor容器镜像仓库高可用方案

1 Harbor简介

Docker容器应用的开发和运行离不开可靠的镜像管理,Docker官方提供了原生的Registry,但其功能比较简单,而且没有可视化界面,自然无法满足企业级的需求。虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署私有环境内的Registry也是非常必要的。

为了解决以上需求,VMware公司推出了Harbor,Harbor 是为企业用户设计的容器镜像仓库开源项目,包括了权限管理(RBAC)、LDAP、安全漏洞扫描、镜像验真、管理界面、自我注册、HA 等企业必需的功能。

2 Harbor架构图

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-1Centos7.6192.168.4.200Master
Harbor-2Centos7.6192.168.4.201Worker

服务器具体配置要求如下:

  • 至少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

A-lab-云网络, A-lab-部署验证

对星融元产品感兴趣?

立即联系!

返回顶部

© 星融元数据技术(苏州)有限公司 苏ICP备17070048号-2