企業級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

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM