本文重點說下 Harbor 高可用集群方案的部署,目前主要有兩種主流的 Harbor 高可用集群方案:1)雙主復制;2)多 harbor 實例共享后端存儲。
一、Harbor 雙主復制高可用集群
1.1 主從同步
harbor 官方默認提供主從復制的方案來解決鏡像同步問題,通過復制的方式,我們可以實時將測試環境 harbor 倉庫的鏡像同步到生產環境 harbor,類似於如下流程:
在實際生產運維的中,往往需要把鏡像發布到幾十或上百台集群節點上。這時,單個 Registry 已經無法滿足大量節點的下載需求,因此要配置多個 Registry 實例做負載均衡。手工維護多個 Registry 實例上的鏡像,將是十分繁瑣的事情。Harbor 可以支持一主多從的鏡像發布模式,可以解決大規模鏡像發布的難題:
只要往一台 Harbor 上發布,鏡像就會像"仙女散花"般地同步到多個 Registry 中,高效可靠。
如果是地域分布較廣的集群,還可以采用層次型發布方式,比如從集團總部機房同步到分公司1機房,再從分公司1機房同步到分公司2機房:
然而單靠主從同步,仍然解決不了 harbor 主節點的單點問題。
1.2 雙主復制說明
所謂的雙主復制其實就是復用主從同步實現兩個 harbor 節點之間的雙向同步,來保證數據的一致性,然后在兩台 harbor 前端頂一個負載均衡器將進來的請求分流到不同的實例中去,只要有一個實例中有了新的鏡像,就是自動的同步復制到另外的的實例中去,這樣實現了負載均衡,也避免了單點故障,在一定程度上實現了Harbor 的高可用性:
這個方案有一個問題就是有可能兩個 Harbor 實例中的數據不一致。假設如果一個實例 A 掛掉了,這個時候有新的鏡像進來,那么新的鏡像就會在另外一個實例B中,后面即使恢復了掛掉的A實例,Harbor 實例 B 也不會自動去同步鏡像,這樣只能手動的先關掉 Harbor 實例 B 的復制策略,然后再開啟復制策略,才能讓實例B數據同步,讓兩個實例的數據一致。另外,這里還需要多吐槽一句:在實際生產使用中,主從復制十分的不靠譜!!所以這里推薦使用下面要說的這種方案。
二、多 harbor 實例共享后端存儲的高可用集群(推薦方案)
2.1 方案說明
共享后端存儲算是一種比較標准的方案,就是多個 Harbor 實例共享同一個后端存儲,任何一個實例持久化到存儲的鏡像,都可被其他實例中讀取。通過前置 LB 進來的請求,可以分流到不同的實例中去處理,這樣就實現了負載均衡,也避免了單點故障:
這個方案在實際生產環境中部署需要考慮三個問題:
-
共享存儲的選取,Harbor 的后端存儲目前支持 AWS S3、Openstack Swift, Ceph 等,在下面的實驗環境里,暫且直接使用 nfs。
-
Session 在不同的實例上共享,這個現在其實已經不是問題了,在最新的 harbor 中,默認 session 會存放在 redis 中,只需要將 redis 獨立出來即可。可以通過 redis sentinel 或者 redis cluster 等方式來保證 redis 的可用性。在下面的實驗環境里,暫且使用單台 redis。
-
Harbor 多實例數據庫問題,這個也只需要將 harbor 中的數據庫拆出來獨立部署即可。讓多實例共用一個外部數據庫,數據庫的高可用也可以通過數據庫的高可用方案保證。
2.2 部署記錄
2.2.1 環境說明
ip hostname role 172.16.60.240 host-240 harbor 172.16.60.244 host-244 harbor 172.16.60.245 host-245 nfs
需要注意:
這里的環境中,不包括 LB 負載均衡器的配置,兩台 harbor 前面需要架設一個 LB 層(比如 Nginx+Keepalived),配置這里省略~
[root@host-240 ~]# cat /etc/redhat-release CentOS Linux release 7.5.1804 (Core) [root@host-240 ~]# systemctl stop firewalld [root@host-240 ~]# systemctl disable firewalld [root@host-240 ~]# firewall-cmd --state not running [root@host-240 ~]# setenforce 0 [root@host-240 ~]# cat /etc/sysconfig/selinux SELINUX=disabled
2.2.2 172.16.60.245 節點機操作
1) 安裝配置 nfs
[root@host-245 ~]# yum install -y rpcbind nfs-utils
編輯 /etc/exports 文件
[root@host-245 ~]# vim /etc/exports /kevin *(rw,no_root_squash) [root@host-245 ~]# mkdir /kevin [root@host-245 ~]# chmod -R 777 /kevin
開啟 nfs 的 RCP 服務和查看 rpcbind 服務端口
[root@host-245 ~]# systemctl start rpcbind [root@host-245 ~]# systemctl enable rpcbind
開啟 nfs 服務
[root@host-245 ~]# systemctl start nfs [root@host-245 ~]# systemctl enable nfs
2.2.3 172.16.60.240/244 兩台 harbor 節點機操作
1)在兩個 harbor 節點上掛載 nfs 目錄
[root@host-240 harbor]# mount -t nfs 172.16.60.245:/kevin /data mount: wrong fs type, bad option, bad superblock on 172.16.60.245:/kevin, missing codepage or helper program, or other error (for several filesystems (e.g. nfs, cifs) you might need a /sbin/mount.<type> helper program) In some cases useful info is found in syslog - try dmesg | tail or so. [root@host-240 harbor]# yum install nfs-utils [root@host-240 harbor]# mount -t nfs 172.16.60.245:/kevin /data
2)安裝 harbor
可以參考:https://www.cnblogs.com/kevingrace/p/6547616.html
兩個節點 harbor 相互配置同步,實現 harbor 主主復制
安裝 harbor 后,可以在 host-240 和 host-245 節點上查看harbor 容器情況:
[root@host-240 harbor]# docker-compose ps Name Command State Ports --------------------------------------------------------------------------------------------- harbor-core /harbor/start.sh Up (healthy) harbor-db /entrypoint.sh postgres Up (healthy) 5432/tcp harbor-jobservice /harbor/start.sh Up harbor-log /bin/sh -c /usr/local/bin/ ... Up (healthy) 127.0.0.1:1514->10514/tcp harbor-portal nginx -g daemon off; Up (healthy) 80/tcp nginx nginx -g daemon off; Up (healthy) 0.0.0.0:80->80/tcp redis docker-entrypoint.sh redis ... Up 6379/tcp registry /entrypoint.sh /etc/regist ... Up (healthy) 5000/tcp registryctl /harbor/start.sh Up (healthy)
可以嘗試登錄容器
[root@host-240 harbor]# docker ps|grep harbor-db 680bd1ed9e48 goharbor/harbor-db:v1.8.0 "/entrypoint.sh post…" 6 days ago Up 6 days (healthy) 5432/tcp harbor-db [root@host-240 harbor]# docker exec -ti harbor-db bash root [ / ]#
這里需要注意:
harbor 同步配置可以參考:https://www.cnblogs.com/kevingrace/p/10995648.html
harbor 主主復制(兩個 harbor 節點相互配置到對方的同步策略)時,注意:
"同步管理"規則里的"同步模式"(建議使用 push 推送模式。push 模式是推到目標倉庫,pull 模式是從源倉庫拉取過來)
"同步管理"規則里的"觸發模式" (建議采用定時模式,比如每10秒鍾同步一次:*/10 * * * * *)
"同步管理"規則里的"源資源過濾器"(如果沒有過濾需求,就不要配置這一項)
2.2.4 LB 配置
在兩個 harbor 節點的前面部署 LB 負載均衡層,通過 VIP 提供統一入口 (如域名),實現 harbor 訪問的負載均衡和高可用。
可以通過綁定 hosts 到不同的節點來驗證兩個節點的負載均衡效果。
2.2.5 額外需要注意
這里使用 nfs 作為 harbor 的后端,還可以使用 ceph 作為后端存儲(ceph 部署可參考:https://www.cnblogs.com/kevingrace/p/9141432.html)
這里沒有考慮到 harbor 高可用時的 session 問題,如果要解決 session 問題,可以使用外部的 mysql 和 redis!!
1)比如在172.16.60.245 機器上再部署 mysql 和 redis(需提前安全 docker 和 docker 和 docker-compose)
docker-compose.yml文件內容如下: [root@host-245 ~]# vim docker-compose.yml version: '3' services: mysql-server: hostname: mysql-server container_name: mysql-server image: mysql:5.7 network_mode: host volumes: - /mysql57/kevin:/var/lib/mysql command: --character-set-server=utf8 environment: MYSQL_ROOT_PASSWORD: 123456 redis: hostname: redis-server container_name: redis-server image: redis:3 network_mode: host
啟動 docker-compose
[root@host-245 ~]# docker-compose up -d
啟動后查看
[root@host-245 ~]# docker-compose ps Name Command State Ports ------------------------------------------------------------- mysql-server docker-entrypoint.sh --cha ... Up redis-server docker-entrypoint.sh redis ... Up
可以嘗試登錄 mysql 容器數據庫中
[root@host-245 ~]# docker-compose exec mysql-server bash root@mysql-server:/# mysql -p123456
或者直接登錄
[root@host-245 ~]# docker-compose exec mysql-server mysql -p123456
2)接着需要往172.16.60.245上部署的 mysql 數據庫中導入harbor 節點的 registry 數據庫
在兩台 harbor 節點上導出數據庫,並將 registry.dump 復制出來
# docker exec -it harbor_db /bin/bash
登陸 harbor_db 容器后執行:
mysqldump -uroot -p --databases registry > registry.dump # docker cp harbor_db:/registry.dump ./
再將 registry.dump 復制到 245 節點的 mysql 容器中
# scp ./registry.dump root@172.16.60.245:/root
在 245 節點上,將 registry 數據庫導入到 mysql 容器中
# docker cp /root/registry.dump mysql-server:/registry.dump # docker exec -it mysql-server /bin/bash
登陸到 mysql 容器后執行:
mysql -uroot -p123456
mysql> source /registry.dump
3) 在兩個 harbor 節點上,修改 harbor.yml 文件,需要修改成使用外部數據庫及 redis
db_host = 172.16.60.245 db_password = 123456 db_port = 3306 db_user = root redis_url = 172.16.60.245:6379
修改 docker-compose.yml 配置
由於 harbor 集群已使用外部的數據庫和 redis 解決 session 問題,故需要將 docker-compose.yml 文件里關於數據庫和 redis 的配置去掉。
由於 Harbor 新版本里增加了對 PostgreSQL 數據庫的支持, 不使用 mysql 數據庫。
可以在 docker-compose.yml 文件里將對應的 postgresql 容器改為 mysql 容器(參考之前的 harbor 版本配置)
出處:http://1t.click/aH2z