一、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