搭建高可用的Harbor

Harbor簡(jiǎn)介

Docker容器應(yīng)用的開發(fā)和運(yùn)行離不開可靠的鏡像管理拾因,Docker官方提供了原生的Registry旺罢,但其功能比較簡(jiǎn)單,而且沒有可視化界面绢记,自然無(wú)法滿足企業(yè)級(jí)的需求扁达。雖然Docker官方也提供了公共的鏡像倉(cāng)庫(kù),但是從安全和效率等方面考慮蠢熄,部署私有環(huán)境內(nèi)的Registry也是非常必要的跪解。

為了解決以上需求,VMware公司推出了Harbor签孔,Harbor 是為企業(yè)用戶設(shè)計(jì)的容器鏡像倉(cāng)庫(kù)開源項(xiàng)目叉讥,包括了權(quán)限管理(RBAC)窘行、LDAP、審計(jì)图仓、安全漏洞掃描罐盔、鏡像驗(yàn)真、管理界面救崔、自我注冊(cè)惶看、HA 等企業(yè)必需的功能,同時(shí)針對(duì)中國(guó)用戶的特點(diǎn)六孵,設(shè)計(jì)鏡像復(fù)制和中文支持等功能纬黎。

Harbor的架構(gòu)示意圖:


image.png

Harbor的GitHub倉(cāng)庫(kù)地址如下:


Harbor高可用部署

官方的安裝文檔:

本文采用的高可用方案是Harbor的雙主復(fù)制,該方案比較簡(jiǎn)單劫窒,需要搭建至少兩個(gè)Harbor節(jié)點(diǎn)本今,并且節(jié)點(diǎn)之間能夠互相復(fù)制,然后通過nginx代理Harbor節(jié)點(diǎn)提供外部訪問主巍。這里采用的高可用方案級(jí)別沒那么高诈泼,因?yàn)橹饕峭ㄟ^Nginx代理其中一個(gè)節(jié)點(diǎn),該節(jié)點(diǎn)掛掉后需要手動(dòng)修改Nginx配置文件去代理另一個(gè)可用節(jié)點(diǎn)煤禽。

示意圖如下:


image.png

所以此方案比較適合中小型公司铐达,而且Harbor主要是給公司內(nèi)部的開發(fā)人員使用的,通常只需要保證分鐘級(jí)的高可用性就可以了檬果。另外還有一點(diǎn)就是瓮孙,云環(huán)境基本無(wú)法使用keepalived,因?yàn)樵品?wù)商一般不支持自定義外網(wǎng)可訪問的虛擬IP选脊,要么就是使用起來(lái)非常麻煩杭抠。這也是為什么沒有采用keepalived的原因之一,當(dāng)然恳啥,如果是部署在內(nèi)網(wǎng)服務(wù)器上也是可以采用keepalived的偏灿。

準(zhǔn)備工作

我這里使用了三臺(tái)CentOS-7.7的虛擬機(jī),具體信息如下表:

系統(tǒng)版本 IP地址 節(jié)點(diǎn)角色 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

這三臺(tái)機(jī)器均需事先安裝好Docker钝的,由于安裝過程比較簡(jiǎn)單這里不進(jìn)行介紹翁垂,可以參考官方文檔:

安裝Harbor(worker節(jié)點(diǎn))

在兩臺(tái)worker節(jié)點(diǎn)上分別安裝Harbor,由于官方提供了安裝腳本硝桩,安裝過程還是比較簡(jiǎn)單的沿猜。具體步驟如下:

下載安裝包

首先下載官方的離線安裝包,當(dāng)然你能科學(xué)上網(wǎng)的話使用在線安裝包也可以:

我這里下載的是2.0.2版本的離線安裝包:

image.png

下載完成后碗脊,將壓縮包上傳到兩個(gè)worker節(jié)點(diǎn):

[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

然后對(duì)其進(jìn)行解壓:

$ 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,這是默認(rèn)的配置文件名稱:

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

編輯harbor.yml文件,按照如下說(shuō)明修改幾處配置項(xiàng):

[root@s1 /usr/local/src/harbor]# vim harbor.yml
# 修改為當(dāng)前所在節(jié)點(diǎn)的ip
hostname: 192.168.243.139
# 登錄界面的密碼
harbor_admin_password: Harbor12345
# harbor的版本號(hào)
_version: 2.0.2

# 將https相關(guān)的配置給注釋掉祈坠,這里為了簡(jiǎn)單只使用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

執(zhí)行安裝腳本

準(zhǔn)備好配置文件之后,安裝docker-compose赦拘,因?yàn)镠arbor的安裝腳本是基于docker-compose去安裝的蛮原。下載docker-compose然后放到/usr/local/bin/目錄下,再更改一下權(quán)限即可:

[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

然后就可以運(yùn)行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,正常情況下應(yīng)能進(jìn)入登錄界面:


image.png

默認(rèn)用戶名為admin花嘶,密碼則為配置文件中定義的密碼笋籽。登錄成功后頁(yè)面如下:


image.png

安裝nginx(master)

在兩臺(tái)worker節(jié)點(diǎn)上安裝好Harbor后,接著我們到master節(jié)點(diǎn)上使用docker搭建一個(gè)nginx椭员。拉取nginx的鏡像:

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

創(chuàng)建一個(gè)nginx配置文件车海,定義一些簡(jiǎn)單的配置:

[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:這里只所以只代理其中一個(gè)Harbor節(jié)點(diǎn)是因?yàn)镠arbor節(jié)點(diǎn)之間的同步存在延遲,而且通常鏡像都比較大隘击,所以這個(gè)延遲也會(huì)比較明顯侍芝。一般鏡像推送完馬上就會(huì)調(diào)度拉取,所以這個(gè)延遲時(shí)間一般是不可接受的埋同。如果讓nginx代理兩個(gè)節(jié)點(diǎn)就會(huì)出現(xiàn)一會(huì)請(qǐng)求A一會(huì)請(qǐng)求B的問題州叠,造成鏡像pull/push不成功。只代理一個(gè)節(jié)點(diǎn)也成為了這個(gè)方案的缺點(diǎn)凶赁,當(dāng)nginx代理的那個(gè)節(jié)點(diǎn)宕掉咧栗,我們得手動(dòng)修改nginx的配置代理另一個(gè)節(jié)點(diǎn)。但由于Harbor是給公司內(nèi)部的開發(fā)人員使用虱肄,通持掳澹可以允許分鐘級(jí)別的不可用。

然后為了方便操作咏窿,我們寫一個(gè)簡(jiǎn)單的啟動(dòng)腳本:

[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

執(zhí)行該腳本:

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

使用瀏覽器訪問master節(jié)點(diǎn)的ip看看能否正常進(jìn)入到Harbor的登錄頁(yè):

image.png


測(cè)試Harbor

搭建好Harbor之后斟或,我們測(cè)試下能否正常使用。將默認(rèn)的library項(xiàng)目刪除掉集嵌,然后創(chuàng)建一個(gè)新項(xiàng)目:


image.png

接著到“用戶管理”新建一個(gè)用戶:


image.png

將該用戶添加到新建的項(xiàng)目中:


image.png

回到命令行上測(cè)試一下pushpull萝挤。由于我們自己搭建的私有倉(cāng)庫(kù)默認(rèn)是不受Docker信任的,所以需要先在配置文件中增加如下配置項(xiàng)讓Docker信任該registry:

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

登錄到我們的Harbor倉(cāng)庫(kù):

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

然后嘗試使用命令行push一個(gè)鏡像到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 ~]# 

接著測(cè)試pull根欧,到另一臺(tái)機(jī)器上用同樣方式配置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節(jié)點(diǎn)互相復(fù)制

測(cè)試完Harbor的基本功能后,我們接下來(lái)配置一下Harbor節(jié)點(diǎn)之間的互相復(fù)制功能咽块,讓兩個(gè)節(jié)點(diǎn)能夠同步鏡像數(shù)據(jù)绘面。首先到第一個(gè)節(jié)點(diǎn)上的“倉(cāng)庫(kù)管理”界面中新建一個(gè)目標(biāo),這個(gè)目標(biāo)就是另一臺(tái)Harbor節(jié)點(diǎn):


image.png

然后到“復(fù)制管理”界面中新建復(fù)制規(guī)則,如下:


image.png
  • 資源過濾器是用于定義只復(fù)制哪些鏡像的揭璃,過濾維度有名稱晚凿、tag和label。不配置默認(rèn)復(fù)制全部

定義了復(fù)制規(guī)則后瘦馍,我們可以在界面上手動(dòng)觸發(fā)復(fù)制:


image.png

復(fù)制成功后歼秽,到另一個(gè)節(jié)點(diǎn)上可以看到kubernetes這個(gè)項(xiàng)目及項(xiàng)目下的鏡像都被復(fù)制過去了:

image.png

image.png

同樣的,這個(gè)節(jié)點(diǎn)也需要使用同樣的方式配置對(duì)另一個(gè)節(jié)點(diǎn)的復(fù)制情组,由于是一樣的步驟燥筷,這里就不重復(fù)演示了。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末院崇,一起剝皮案震驚了整個(gè)濱河市肆氓,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌底瓣,老刑警劉巖谢揪,帶你破解...
    沈念sama閱讀 218,036評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異捐凭,居然都是意外死亡拨扶,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門茁肠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)患民,“玉大人,你說(shuō)我怎么就攤上這事垦梆【颇蹋” “怎么了?”我有些...
    開封第一講書人閱讀 164,411評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵奶赔,是天一觀的道長(zhǎng)惋嚎。 經(jīng)常有香客問我,道長(zhǎng)站刑,這世上最難降的妖魔是什么另伍? 我笑而不...
    開封第一講書人閱讀 58,622評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮绞旅,結(jié)果婚禮上摆尝,老公的妹妹穿的比我還像新娘。我一直安慰自己因悲,他們只是感情好堕汞,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晃琳,像睡著了一般讯检。 火紅的嫁衣襯著肌膚如雪琐鲁。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,521評(píng)論 1 304
  • 那天人灼,我揣著相機(jī)與錄音围段,去河邊找鬼。 笑死投放,一個(gè)胖子當(dāng)著我的面吹牛奈泪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播灸芳,決...
    沈念sama閱讀 40,288評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼涝桅,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了烙样?” 一聲冷哼從身側(cè)響起冯遂,我...
    開封第一講書人閱讀 39,200評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎误阻,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體晴埂,經(jīng)...
    沈念sama閱讀 45,644評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡究反,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了儒洛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片精耐。...
    茶點(diǎn)故事閱讀 39,953評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖琅锻,靈堂內(nèi)的尸體忽然破棺而出卦停,到底是詐尸還是另有隱情,我是刑警寧澤恼蓬,帶...
    沈念sama閱讀 35,673評(píng)論 5 346
  • 正文 年R本政府宣布惊完,位于F島的核電站,受9級(jí)特大地震影響处硬,放射性物質(zhì)發(fā)生泄漏小槐。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評(píng)論 3 329
  • 文/蒙蒙 一荷辕、第九天 我趴在偏房一處隱蔽的房頂上張望凿跳。 院中可真熱鬧,春花似錦疮方、人聲如沸控嗜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)疆栏。三九已至曾掂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間承边,已是汗流浹背遭殉。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留博助,地道東北人险污。 一個(gè)月前我還...
    沈念sama閱讀 48,119評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像富岳,于是被迫代替她去往敵國(guó)和親蛔糯。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評(píng)論 2 355