harbor高可用簡介
harbor目前有兩種主流的高可用方案:
- 雙主復制,harbor自帶的鏡像復制功能
- 多harbor實體共享后端存盤

雙主復制架構在遇到大鏡像時有同步延遲,并且一個實體故障后需要手動重新開啟復制策略才能再次同步,下面以阿里云環境為例,使用兩臺ECS實體+NFS后端共享存盤方式部署高可用harbor,整體架構圖如下:

該方案需要注意以下幾點:
- 共享存盤的選取,Harbor的后端存盤目前支持本地檔案系統、NFS、CephFS、azure、gcs、AWS s3,、swift 以及阿里云oss,
- Session在不同的實體上共享,在最新的harbor中,默認session會存放在redis中,只需要將redis獨立出來即可,可以通過
redis sentinel或者redis cluster等方式來保證redis的可用性, - 由于PostgreSQL多個實體無法共享一份資料檔案,需要將harbor中的資料庫拆出來獨立部署,讓多實體共用一個外部資料庫,并將Harbor中默認創建在PostgreSQL的所有表的結構、初始資料等匯入進單獨部署的PostgreSQL服務中,PostgreSQL資料的冗余可以使用PostgreSQL的同步策略來實作,
harbor高可用部署
在阿里云申請以下資源:
| 資源型別 | 數量 | 地域 |
|---|---|---|
| ECS實體 | 2 | 華南1(深圳)-可用區D |
| NAS實體 | 1 | 華南1(深圳)-可用區D |
| RDS實體 | 1 | 華南1(深圳)-可用區D |
| Redis實體 | 1 | 華南1(深圳)-可用區D |
| SLB實體 | 1 | 華南1(深圳)-可用區D |
兩臺ECS實體資訊:
| ECS主機名 | 私網IP | 公網IP | OS | 地域 |
|---|---|---|---|---|
| harbor001 | 172.18.8.242 | 120.79.96.163 | CentOS8.4 | 華南1(深圳)-可用區D |
| harbor002 | 172.18.8.243 | 120.79.96.169 | CentOS8.4 | 華南1(深圳)-可用區D |
備注:如果在私有云環境部署,可自建PostgreSQL集群、Redis集群、NFS server,并使用nginx/haproxy/lvs+keepalived代替公網SLB負載均衡,如果使用物件存盤作為后端,可選用minio代替s3,
配置SLB實體
創建1個SLB實體(代替上圖nginx)及兩組監聽,用于四層轉發,訪問443埠轉發到后端兩臺harbor ECS實體的443埠,訪問80埠harbor默認會重定向到443埠,未啟動后端harbor時當前監聽應該處于例外狀態:

自行準備域名,決議到SLB實體的公網IP:
registry.cloudcele.com ---> 120.25.165.246
以阿里云域名為例:

配置RDS實體
創建PostgreSQL型別RDS實體,創建一個資料庫用戶,以超級管理員postgres為例:

然后手動創建三個空資料庫,系結到postgres用戶下:
參考:https://goharbor.io/docs/master/install-config/harbor-ha-helm
notaryserver
notarysigner
registry
阿里云示例:

配置NAS實體
創建NAS實體后,在兩臺ECS實體上都執行掛載,安裝NFS客戶端:
sudo yum install nfs-utils
執行以下命令,提高同時發起的NFS請求數量:
sudo echo "options sunrpc tcp_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
sudo echo "options sunrpc tcp_max_slot_table_entries=128" >> /etc/modprobe.d/sunrpc.conf
掛載NFS檔案系統,這里掛載到/data目錄下
cat >> /etc/fstab <<EOF
217d3488b8-mtr10.cn-shenzhen.nas.aliyuncs.com:/ /data nfs vers=4,minorversion=0,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2,_netdev,noresvport 0 0
EOF
mkdir /data
mount -a
驗證掛載是否成功
[root@harbor001 ~]# df -h | grep aliyun
217d3488b8-mtr10.cn-shenzhen.nas.aliyuncs.com:/ 10P 0 10P 0% /data
生成域名證書
參考:
https://github.com/acmesh-official/acme.sh
https://goharbor.io/docs/2.3.0/install-config/configure-https/
域名證書可以手動自簽證書,但自簽發的證書不會被 Chrome 等瀏覽器信任,這里采用 Let’s Encrypt 生成免費的、可被瀏覽器信任的證書,常用的 Let’s Encrypt 生成工具主要有 acme.sh 及 certbot 兩種,本次使用 acme.sh 自動從 letsencrypt 生成證書,
使用acme.sh時有http及dns兩種驗證方式,dns驗證又分為手動和自動,這里使用阿里云域名決議,支持使用dns方式自動連接到阿里云API申請證書:
curl https://get.acme.sh | sh
yum install -y socat
export Ali_Key=xxxxxxxxxxxxxxx
export Ali_Secret=xxxxxxxxxxxxxxx
acme.sh --issue --dns dns_ali -d registry.cloudcele.com
查看生成的證書
# ls -1 /root/.acme.sh/registry.cloudcele.com/
ca.cer
fullchain.cer
registry.cloudcele.com.cer
registry.cloudcele.com.conf
registry.cloudcele.com.csr
registry.cloudcele.com.csr.conf
registry.cloudcele.com.key
安裝證書到harbor目錄下
mkdir -p /data/harbor/cert
acme.sh --installcert -d registry.cloudcele.com \
--key-file /data/harbor/cert/registry.cloudcele.com.key \
--fullchain-file /data/harbor/cert/registry.cloudcele.com.crt
查看安裝到harbor路徑下的證書
[root@harbor001 ~]# ls -1 /data/harbor/cert/
registry.cloudcele.com.crt
registry.cloudcele.com.key
acme.sh申請的證書有效期90天,acme.sh安裝的時候已經自動添加了一個計劃任務每天自動更新證書,更新后重啟使用證書的服務, acme.sh自動添加的計劃任務
[root@harbor001 ~]# crontab -l | grep acme
55 0 * * * "/root/.acme.sh"/acme.sh --cron --home "/root/.acme.sh" > /dev/null
該計劃任務也會自動執行證書上一次的安裝命令,為確保nginx使用最新的證書,重新執行一次安裝證書命令讓acme.ch將證書檔案安裝到正確的位置及重啟nginx服務,
acme.sh --installcert -d registry.cloudcele.com \
--key-file /data/harbor/cert/registry.cloudcele.com.key \
--fullchain-file /data/harbor/cert/registry.cloudcele.com.crt \
--reloadcmd "docker restart nginx"
開始安裝harbor
前提:兩臺ECS實體已完成docker及docker-compose安裝,以下所有操作在第一個harbor節點執行:
下載harbor
wget https://mirrors.tuna.tsinghua.edu.cn/github-release/goharbor/harbor/v2.3.1/harbor-offline-installer-v2.3.1.tgz
tar -zxvf harbor-offline-installer-v2.3.1.tgz -C /opt --strip=1
切換到harbor安裝目錄
cd /opt/harbor
cp harbor.yml.tmpl harbor.yml
修改harbor組態檔,注意獲取VPC實體內網連接地址、埠及密碼資訊,有變動的內容如下:
[root@harbor001 harbor]# vim harbor.yml
hostname: registry.cloudcele.com
http:
port: 80
https:
port: 443
certificate: /data/harbor/cert/registry.cloudcele.com.crt
private_key: /data/harbor/cert/registry.cloudcele.com.key
data_volume: /data/harbor
external_database:
harbor:
host: pgm-wz9541r7evq0auo6168200.pg.rds.aliyuncs.com
port: 1921
db_name: registry
username: postgres
password: Postgres@2021
ssl_mode: disable
max_idle_conns: 2
max_open_conns: 0
notary_signer:
host: pgm-wz9541r7evq0auo6168200.pg.rds.aliyuncs.com
port: 1921
db_name: notarysigner
username: postgres
password: Postgres@2021
ssl_mode: disable
notary_server:
host: pgm-wz9541r7evq0auo6168200.pg.rds.aliyuncs.com
port: 1921
db_name: notaryserver
username: postgres
password: Postgres@2021
ssl_mode: disable
external_redis:
host: r-wz9fpfgjon0p4kci80.redis.rds.aliyuncs.com:6379
password: Redis123
registry_db_index: 1
jobservice_db_index: 2
chartmuseum_db_index: 3
trivy_db_index: 5
idle_timeout_seconds: 30
執行harbor安裝
./install.sh
復制harbor安裝目錄到harbor002節點:
[root@harbor001 ~]# scp -r /opt/harbor/ 172.18.8.243:/opt
同樣,連接到harbor002節點直接安裝即可,無需其他操作:
[root@harbor002 ~]# cd /opt/harbor/
[root@harbor002 ~]# ./install.sh
訪問harbor驗證
瀏覽器訪問harbor域名:https://registry.cloudcele.com

停掉第一個節點harbor實體,驗證依然能夠正常訪問:
[root@harbor001 ~]# cd /opt/harbor/
[root@harbor001 harbor]# docker-compose down
harbor上傳鏡像
首先為docker客戶端準備證書,從acme.sh目錄下獲取證書
[root@harbor001 ~]# cd /root/.acme.sh/registry.cloudcele.com/
復制以下三個檔案到docker客戶端目錄/etc/docker/certs.d/registry.cloudcele.com/下
ca.cer
registry.cloudcele.com.cer
registry.cloudcele.com.key
客戶端創建目錄,查看復制過來的證書檔案:
# mkdir -p /etc/docker/certs.d/registry.cloudcele.com/
# ls -1 /etc/docker/certs.d/registry.cloudcele.com/
ca.crt
registry.cloudcele.com.cert
registry.cloudcele.com.key
重啟docker行程
systemctl restart docker
登錄harbor倉庫
# docker login registry.cloudcele.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
上傳docker鏡像
[root@master ~]# docker push registry.cloudcele.com/library/nginx
Using default tag: latest
The push refers to repository [registry.cloudcele.com/library/nginx]
d9eb91d66e2a: Pushed
ae1f545e4c08: Pushed
c20672db3628: Pushed
4cbb728cd302: Pushing [=> ] 1.609MB/63.74MB
4cbb728cd302: Pushed
9eb82f04c782: Pushed
latest: digest: sha256:1a53eb723d17523512bd25c27299046cfa034cce309f4ed330c943a304513f59 size: 1362
拉取docker鏡像
[root@master ~]# docker pull registry.cloudcele.com/library/nginx
Using default tag: latest
latest: Pulling from library/nginx
Digest: sha256:1a53eb723d17523512bd25c27299046cfa034cce309f4ed330c943a304513f59
Status: Image is up to date for registry.cloudcele.com/library/nginx:latest
registry.cloudcele.com/library/nginx:latest
參考:https://cloud.tencent.com/developer/article/1838838
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/294180.html
標籤:其他
