企业级docker镜像仓库----Harbor高可用部署

一、Habor简介

1、harbor介绍

github地址:https://github.com/goharbor/harbor

Harbor is an an open source trusted cloud native registry project that stores, signs, and scans content. Harbor extends the open source Docker Distribution by adding the functionalities usually required by users such as security, identity and management. Having a registry closer to the build and run environment can improve the image transfer efficiency. Harbor supports replication of images between registries, and also offers advanced security features such as user management, access control and activity auditing.

Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,通过添加一些企业必需的功能特性,例如安全、标识和管理等,扩展了开源Docker Distribution。作为一个企业级私有Registry服务器,Harbor提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制,镜像全部保存在私有Registry中, 确保数据和知识产权在公司内部网络中管控。另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等。

2、架构图和组件

 

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,供日后进行分析。

3、Harbor实现

Harbor的每个组件都是以Docker容器的形式构建的,官方也是使用Docker Compose来对它进行部署。用于部署Harbor的Docker Compose模板位于 harbor/docker-compose.yml,打开这个模板文件,发现Harbor是由7个容器组成的;

# docker-compose ps
       Name                     Command               State                                Ports                              
------------------------------------------------------------------------------------------------------------------------------
harbor-adminserver   /harbor/harbor_adminserver       Up                                                                      
harbor-db            docker-entrypoint.sh mysqld      Up      3306/tcp                                                        
harbor-jobservice    /harbor/harbor_jobservice        Up                                                                      
harbor-log           /bin/sh -c crond && rm -f  ...   Up      127.0.0.1:1514->514/tcp                                         
harbor-ui            /harbor/harbor_ui                Up                                                                      
nginx                nginx -g daemon off;             Up      0.0.0.0:443->443/tcp, 0.0.0.0:4443->4443/tcp, 0.0.0.0:80->80/tcp
registry             /entrypoint.sh serve /etc/ ...   Up      5000/tcp 
  • nginx:nginx负责流量转发和安全验证,对外提供的流量都是从nginx中转,所以开放https的443端口,它将流量分发到后端的ui和正在docker镜像存储的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)的服务端口。

二、安装和配置Harbor的高可用架构

1、环境说明

环境名称 版本
系统版本 CentOS Linux release 7.6.1810 (Core)
docker-ce 18.09.7-CE
docker-compose  v1.18.0
Harbor  v1.8.0
安装方式 离线安装
安装位置  

服务器信息说明

主机名 IP地址 角色 CPU memory
master 192.168.100.156 master >=2 >=2G
node01 192.168.100.157 worker >=2 >=2G
node02 192.168.100.158 worker >=2 >=2G

2、安装docker

请参考之前博客安装https://www.cnblogs.com/liangyuntao-ts/p/10657009.html

3、安装docker-compose v1.18.0

$ yum install -y docker-compose

$ docker-compose --verison

docker-compose version 1.18.0, build 8dd22a9

4、离线安装harbor v1.8.0

下载地址https://github.com/goharbor/harbor/releases
大家也可以到我的网盘下载:https://pan.baidu.com/s/1qazfH-9DPeMe-ofIxlEhLw
提取码:l540

$ tar -xvf harbor-offline-installer-v1.8.0.tgz

$ cd harbor

$ vim harbor.yml
hostname: 192.168.100.156       //改成本机的IP,由于是做高可用,通过IP来负载均衡

$ cd /home/harbor

$ sh install.sh

输出的部分信息:

✔ ----Harbor has been installed and started successfully.----

Now you should be able to visit the admin portal at http://192.168.100.156.
For more details, please visit https://github.com/goharbor/harbor .

5、浏览器登陆 http://192.168.100.156

用户名:admin 密码:Harbor12345

6、在master部署nginx  

$ mkdir nginx && cd nginx

$ docker pull nginx:1.13.12

故障解决方案,拉取镜像的时候报错
[root@master nginx]# docker pull nginx:1.13.12
Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

解决方案:
1)创建daemon.json文件

vim /etc/docker/daemon.json

2) 写入:

{
    "registry-mirrors":["https://docker.mirrors.ustc.edu.cn"]
}
3)重启:

[root@km docker]# systemctl daemon-reload 
[root@km docker]# systemctl restart docker
4)完美解决。
--------------------- 
作者:那记忆微凉 
来源:CSDN 
原文:https://blog.csdn.net/BigData_Mining/article/details/86769696 
版权声明:本文为博主原创文章,转载请附上博文链接!

7、编写nginx的配置文件nginx.conf  

$ vim nginx.conf

user nginx;
worker_processes 1;

error_log /var/log/nginx/error.log warn;

pid /var/run/nginx.pid;

events {

   worker_connections 1024;
}

stream {

   upstream hub {
        server 192.168.100.156:80;
 
   }
   server {
        listen 80;
        proxy_pass hub;
        proxy_timeout 300s;
        proxy_connect_timeout 5s;
}
}

8、编写Nginx重启脚本 

$ vim restart.sh

#!/bin/bash

docker stop harbor nginx

docker rm harbor nginx

docker run -idt --net=host --name harbornginx -v /home/nginx/nginx.conf:/etc/nginx/nginx.conf nginx:1.13.12

sh restart.sh

9、在本地电脑绑定HOST,以便进行域名访问

192.168.100.150 harbor.test.com

三、设置Harbor双主复制  

 

 

 

 

 四、进行测试  

 创建一个kubernetes的项目,在创建其他用户,如test,将这个用户以开发人员的身份加入项目中,让其有推送镜像的权限

$ docker tag nginx:1.13.12 hub.test.com/kubernetes/nginx:1.13.12    //把镜像打上自己的标签

$ vim /etc/host

192.168.100.150 harbor.test.com

遇到一个故障,无法解除
[root@master nginx]# docker login harbor.test.com
Username: test
Password: 
Error response from daemon: Get https://harbor.test.com/v2/: dial tcp 192.168.100.150:443: connect: connection refused

解决方法
$ vim /usr/lib/systemd/system/docker.service  添加如下内容

ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry=192.168.100.156

  

posted @ 2019-07-17 11:58  北方莜蓝  阅读(1685)  评论(0编辑  收藏  举报