<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          搭建一套高可用的Harbor容器鏡像倉庫

          共 8052字,需瀏覽 17分鐘

           ·

          2020-09-30 08:47


          來源:https://blog.51cto.com/zero01/2530940

          Harbor簡(jiǎn)介

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

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

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

          Harbor的GitHub倉庫地址如下:

          • https://github.com/goharbor/harbor

          • Wiki:https://github.com/goharbor/harbor/wiki


          Harbor高可用部署

          官方的安裝文檔:

          • https://goharbor.io/docs/2.0.0/install-config/

          本文采用的高可用方案是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)。

          示意圖如下:

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

          準(zhǔn)備工作

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

          系統(tǒng)版本IP地址節(jié)點(diǎn)角色CPUMemoryHostname
          CentOS-7.7192.168.243.138master\>=2\>=2Gm1
          CentOS-7.7192.168.243.139worker\>=2\>=2Gs1
          CentOS-7.7192.168.243.140worker\>=2\>=2Gs2

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

          • https://docs.docker.com/engine/install/centos/

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

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

          下載安裝包

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

          • https://github.com/goharbor/harbor/releases

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

          下載完成后,將壓縮包上傳到兩個(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文件,按照如下說明修改幾處配置項(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)入登錄界面:


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


          安裝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的登錄頁:


          測(cè)試Harbor

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


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

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

          回到命令行上測(cè)試一下pushpull。由于我們自己搭建的私有倉庫默認(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倉庫:

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

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

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

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

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


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

          - END -

          ?推薦閱讀?
          Service Mesh:Istio 的前世今生
          Docker容器網(wǎng)絡(luò)必知必會(huì)
          Linux服務(wù)器高并發(fā)調(diào)優(yōu)實(shí)戰(zhàn)
          Shell文本處理三劍客:grep、sed、awk
          Python 自動(dòng)創(chuàng)建 Grafana 儀表板
          小團(tuán)隊(duì)如何從零搭建一個(gè)自動(dòng)化運(yùn)維體系?



          點(diǎn)亮,服務(wù)器三年不宕機(jī)

          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月丁香五月婷婷 | 操操逼逼 | 天天操天天摸天天撸 | 欧美精品一级二级A片 | 老女人综合网 |