搭建高可用的Harbor

Harbor簡介

Docker容器應用的開發和運行離不開可靠的鏡像管理,Docker官方提供了原生的Registry,但其功能比較簡單,並且沒有可視化界面,天然沒法知足企業級的需求。雖然Docker官方也提供了公共的鏡像倉庫,可是從安全和效率等方面考慮,部署私有環境內的Registry也是很是必要的。nginx

爲了解決以上需求,VMware公司推出了Harbor,Harbor 是爲企業用戶設計的容器鏡像倉庫開源項目,包括了權限管理(RBAC)、LDAP、審計、安全漏洞掃描、鏡像驗真、管理界面、自我註冊、HA 等企業必需的功能,同時針對中國用戶的特色,設計鏡像複製和中文支持等功能。 git

Harbor的架構示意圖:
搭建高可用的Harborgithub

Harbor的GitHub倉庫地址以下:redis


Harbor高可用部署

官方的安裝文檔:docker

本文采用的高可用方案是Harbor的雙主複製,該方案比較簡單,須要搭建至少兩個Harbor節點,而且節點之間可以互相複製,而後經過nginx代理Harbor節點提供外部訪問。這裏採用的高可用方案級別沒那麼高,由於主要是經過Nginx代理其中一個節點,該節點掛掉後須要手動修改Nginx配置文件去代理另外一個可用節點。json

示意圖以下:
搭建高可用的Harborvim

因此此方案比較適合中小型公司,並且Harbor主要是給公司內部的開發人員使用的,一般只須要保證分鐘級的高可用性就能夠了。另外還有一點就是,雲環境基本沒法使用keepalived,由於雲服務商通常不支持自定義外網可訪問的虛擬IP,要麼就是使用起來很是麻煩。這也是爲何沒有采用keepalived的緣由之一,固然,若是是部署在內網服務器上也是能夠採用keepalived的。centos

準備工做

我這裏使用了三臺CentOS-7.7的虛擬機,具體信息以下表:瀏覽器

系統版本 IP地址 節點角色 CPU Memory Hostname
CentOS-7.7 192.168.243.138 master \>=2 \>=2G m1
CentOS-7.7 192.168.243.139 worker \>=2 \>=2G s1
CentOS-7.7 192.168.243.140 worker \>=2 \>=2G s2

這三臺機器均需事先安裝好Docker,因爲安裝過程比較簡單這裏不進行介紹,能夠參考官方文檔:安全

安裝Harbor(worker節點)

在兩臺worker節點上分別安裝Harbor,因爲官方提供了安裝腳本,安裝過程仍是比較簡單的。具體步驟以下:

下載安裝包

首先下載官方的離線安裝包,固然你能科學上網的話使用在線安裝包也能夠:

我這裏下載的是2.0.2版本的離線安裝包:
搭建高可用的Harbor

下載完成後,將壓縮包上傳到兩個worker節點:

[root@s1 /usr/local/src]# ls
harbor-offline-installer-v2.0.2.tgz

[root@s2 /usr/local/src]# ls
harbor-offline-installer-v2.0.2.tgz

而後對其進行解壓:

$ tar -zxvf harbor-offline-installer-v2.0.2.tgz

解壓後的目錄文件以下:

[root@s1 /usr/local/src]# cd harbor
[root@s1 /usr/local/src/harbor]# ls
common.sh  harbor.v2.0.2.tar.gz  harbor.yml.tmpl  install.sh  LICENSE  prepare
[root@s1 /usr/local/src/harbor]#

配置harbor

將配置文件模板拷貝一份,並命名爲harbor.yml,這是默認的配置文件名稱:

[root@s1 /usr/local/src/harbor]# cp harbor.yml.tmpl harbor.yml

編輯harbor.yml文件,按照以下說明修改幾處配置項:

[root@s1 /usr/local/src/harbor]# vim harbor.yml
# 修改成當前所在節點的ip
hostname: 192.168.243.139
# 登陸界面的密碼
harbor_admin_password: Harbor12345
# 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

執行安裝腳本

準備好配置文件以後,安裝docker-compose,由於Harbor的安裝腳本是基於docker-compose去安裝的。下載docker-compose而後放到/usr/local/bin/目錄下,再更改一下權限便可:

[root@s1 ~]# 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@s1 ~]# chmod 755 /usr/local/bin/docker-compose

而後就能夠運行Harbor的安裝腳本了:

[root@s1 /usr/local/src/harbor]# ./install.sh

[Step 0]: checking if docker is installed ...

Note: docker version: 19.03.12

[Step 1]: checking docker-compose is installed ...

Note: docker-compose version: 1.26.2

[Step 2]: loading Harbor images ...
Loaded image: goharbor/prepare:v2.0.2
Loaded image: goharbor/harbor-jobservice:v2.0.2
Loaded image: goharbor/harbor-registryctl:v2.0.2
Loaded image: goharbor/registry-photon:v2.0.2
Loaded image: goharbor/harbor-core:v2.0.2
Loaded image: goharbor/notary-signer-photon:v2.0.2
Loaded image: goharbor/clair-photon:v2.0.2
Loaded image: goharbor/trivy-adapter-photon:v2.0.2
Loaded image: goharbor/harbor-log:v2.0.2
Loaded image: goharbor/nginx-photon:v2.0.2
Loaded image: goharbor/clair-adapter-photon:v2.0.2
Loaded image: goharbor/chartmuseum-photon:v2.0.2
Loaded image: goharbor/harbor-portal:v2.0.2
Loaded image: goharbor/harbor-db:v2.0.2
Loaded image: goharbor/redis-photon:v2.0.2
Loaded image: goharbor/notary-server-photon:v2.0.2

[Step 3]: preparing environment ...

[Step 4]: preparing harbor configs ...
prepare base dir is set to /usr/local/src/harbor
WARNING:root:WARNING: HTTP protocol is insecure. Harbor will deprecate http protocol in the future. Please make sure to upgrade to https
Generated configuration file: /config/log/logrotate.conf
Generated configuration file: /config/log/rsyslog_docker.conf
Generated configuration file: /config/nginx/nginx.conf
Generated configuration file: /config/core/env
Generated configuration file: /config/core/app.conf
Generated configuration file: /config/registry/config.yml
Generated configuration file: /config/registryctl/env
Generated configuration file: /config/registryctl/config.yml
Generated configuration file: /config/db/env
Generated configuration file: /config/jobservice/env
Generated configuration file: /config/jobservice/config.yml
Generated and saved secret to file: /data/secret/keys/secretkey
Successfully called func: create_root_cert
Generated configuration file: /compose_location/docker-compose.yml
Clean up the input dir

[Step 5]: starting Harbor ...
Creating network "harbor_harbor" with the default driver
Creating harbor-log ... done
Creating harbor-db     ... done
Creating harbor-portal ... done
Creating redis         ... done
Creating registryctl   ... done
Creating registry      ... done
Creating harbor-core   ... done
Creating harbor-jobservice ... done
Creating nginx             ... done
✔ ----Harbor has been installed and started successfully.----
[root@s1 /usr/local/src/harbor]#

安裝完成,使用瀏覽器訪問Harbor,正常狀況下應能進入登陸界面:
搭建高可用的Harbor

默認用戶名爲admin,密碼則爲配置文件中定義的密碼。登陸成功後頁面以下:
搭建高可用的Harbor


安裝nginx(master)

在兩臺worker節點上安裝好Harbor後,接着咱們到master節點上使用docker搭建一個nginx。拉取nginx的鏡像:

[root@m1 ~]# docker pull nginx:1.13.12

建立一個nginx配置文件,定義一些簡單的配置:

[root@m1 ~]# mkdir nginx
[root@m1 ~]# cd nginx
[root@m1 nginx]# 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.243.139:80;
    }
    server {
        listen 80;
        proxy_pass hub;
        proxy_timeout 300s;
        proxy_connect_timeout 5s;
    }
}
  • Tips:這裏只因此只代理其中一個Harbor節點是由於Harbor節點之間的同步存在延遲,並且一般鏡像都比較大,因此這個延遲也會比較明顯。通常鏡像推送完立刻就會調度拉取,因此這個延遲時間通常是不可接受的。若是讓nginx代理兩個節點就會出現一會請求A一會請求B的問題,形成鏡像pull/push不成功。只代理一個節點也成爲了這個方案的缺點,當nginx代理的那個節點宕掉,咱們得手動修改nginx的配置代理另外一個節點。但因爲Harbor是給公司內部的開發人員使用,一般能夠容許分鐘級別的不可用。

而後爲了方便操做,咱們寫一個簡單的啓動腳本:

[root@m1 nginx]# vim restart.sh
#!/bin/bash

docker stop harbor-nginx
docker rm harbor-nginx
docker run -itd --net=host --name harbor-nginx -v /root/nginx/nginx.conf:/etc/nginx/nginx.conf nginx:1.13.12

執行該腳本:

[root@m1 ~/nginx]# sh restart.sh

使用瀏覽器訪問master節點的ip看看可否正常進入到Harbor的登陸頁:
搭建高可用的Harbor


測試Harbor

搭建好Harbor以後,咱們測試下可否正常使用。將默認的library項目刪除掉,而後建立一個新項目:
搭建高可用的Harbor

接着到「用戶管理」新建一個用戶:
搭建高可用的Harbor

將該用戶添加到新建的項目中:
搭建高可用的Harbor

回到命令行上測試一下pushpull。因爲咱們本身搭建的私有倉庫默認是不受Docker信任的,因此須要先在配置文件中增長以下配置項讓Docker信任該registry:

[root@m1 ~]# vim /etc/docker/daemon.json
{
  "insecure-registries": ["192.168.243.138"]
}
[root@m1 ~]# systemctl restart docker

登陸到咱們的Harbor倉庫:

[root@m1 ~]# docker login 192.168.243.138
Username: pusher
Password: 
Login Succeeded
[root@m1 ~]#

而後嘗試使用命令行push一個鏡像到Harbor上:

[root@m1 ~]# docker tag nginx:1.13.12 192.168.243.138/kubernetes/nginx:1.13.12
[root@m1 ~]# docker push 192.168.243.138/kubernetes/nginx:1.13.12
The push refers to repository [192.168.243.138/kubernetes/nginx]
7ab428981537: Pushed 
82b81d779f83: Pushed 
d626a8ad97a1: Pushed 
1.13.12: digest: sha256:e4f0474a75c510f40b37b6b7dc2516241ffa8bde5a442bde3d372c9519c84d90 size: 948
[root@m1 ~]#

接着測試pull,到另外一臺機器上用一樣方式配置daemon.jsondocker login到Harbor,而後使用docker pull從Harbor上拉取鏡像:

[root@s1 ~]# docker pull 192.168.243.138/kubernetes/nginx:1.13.12
1.13.12: Pulling from kubernetes/nginx
f2aa67a397c4: Pull complete 
3c091c23e29d: Pull complete 
4a99993b8636: Pull complete 
Digest: sha256:e4f0474a75c510f40b37b6b7dc2516241ffa8bde5a442bde3d372c9519c84d90
Status: Downloaded newer image for 192.168.243.138/kubernetes/nginx:1.13.12
192.168.243.138/kubernetes/nginx:1.13.12
[root@s1 ~]#

配置Harbor節點互相複製

測試完Harbor的基本功能後,咱們接下來配置一下Harbor節點之間的互相複製功能,讓兩個節點可以同步鏡像數據。首先到第一個節點上的「倉庫管理」界面中新建一個目標,這個目標就是另外一臺Harbor節點:
搭建高可用的Harbor

而後到「複製管理」界面中新建複製規則,以下:
搭建高可用的Harbor

  • 資源過濾器是用於定義只複製哪些鏡像的,過濾維度有名稱、tag和label。不配置默認複製所有

定義了複製規則後,咱們能夠在界面上手動觸發複製:
搭建高可用的Harbor

複製成功後,到另外一個節點上能夠看到kubernetes這個項目及項目下的鏡像都被複制過去了:
搭建高可用的Harbor
搭建高可用的Harbor

一樣的,這個節點也須要使用一樣的方式配置對另外一個節點的複製,因爲是同樣的步驟,這裏就不重複演示了。


個人博客即將同步至騰訊雲+社區,邀請你們一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=3kbjczewtog0g