Kubernetes容器集群 - harbor仓库高可用集群部署说明
?
之前介紹Harbor私有倉庫的安裝和使用,這里重點說下Harbor高可用集群方案的部署,目前主要有兩種主流的Harbor高可用集群方案:1)雙主復(fù)制;2)多harbor實例共享后端存儲。
一、Harbor雙主復(fù)制高可用集群
1)主從同步
harbor官方默認(rèn)提供主從復(fù)制的方案來解決鏡像同步問題,通過復(fù)制的方式,我們可以實時將測試環(huán)境harbor倉庫的鏡像同步到生產(chǎn)環(huán)境harbor,類似于如下流程:
在實際生產(chǎn)運維的中,往往需要把鏡像發(fā)布到幾十或上百臺集群節(jié)點上。這時,單個Registry已經(jīng)無法滿足大量節(jié)點的下載需求,因此要配置多個Registry實例做負(fù)載均衡。手工維護多個Registry實例上的鏡像,將是十分繁瑣的事情。Harbor可以支持一主多從的鏡像發(fā)布模式,可以解決大規(guī)模鏡像發(fā)布的難題:
只要往一臺Harbor上發(fā)布,鏡像就會像"仙女散花"般地同步到多個Registry中,高效可靠。
如果是地域分布較廣的集群,還可以采用層次型發(fā)布方式,比如從集團總部機房同步到分公司1機房,再從分公司1機房同步到分公司2機房:
然而單靠主從同步,仍然解決不了harbor主節(jié)點的單點問題。
2)雙主復(fù)制說明
所謂的雙主復(fù)制其實就是復(fù)用主從同步實現(xiàn)兩個harbor節(jié)點之間的雙向同步,來保證數(shù)據(jù)的一致性,然后在兩臺harbor前端頂一個負(fù)載均衡器將進來的請求分流到不同的實例中去,只要有一個實例中有了新的鏡像,就是自動的同步復(fù)制到另外的的實例中去,這樣實現(xiàn)了負(fù)載均衡,也避免了單點故障,在一定程度上實現(xiàn)了Harbor的高可用性:
這個方案有一個問題就是有可能兩個Harbor實例中的數(shù)據(jù)不一致。假設(shè)如果一個實例A掛掉了,這個時候有新的鏡像進來,那么新的鏡像就會在另外一個實例B中,后面即使恢復(fù)了掛掉的A實例,Harbor實例B也不會自動去同步鏡像,這樣只能手動的先關(guān)掉Harbor實例B的復(fù)制策略,然后再開啟復(fù)制策略,才能讓實例B數(shù)據(jù)同步,讓兩個實例的數(shù)據(jù)一致。另外,這里還需要多吐槽一句:在實際生產(chǎn)使用中,主從復(fù)制十分的不靠譜!!所以這里推薦使用下面要說的這種方案。
二、多harbor實例共享后端存儲的高可用集群(推薦方案)
方案說明
共享后端存儲算是一種比較標(biāo)準(zhǔn)的方案,就是多個Harbor實例共享同一個后端存儲,任何一個實例持久化到存儲的鏡像,都可被其他實例中讀取。通過前置LB進來的請求,可以分流到不同的實例中去處理,這樣就實現(xiàn)了負(fù)載均衡,也避免了單點故障:
這個方案在實際生產(chǎn)環(huán)境中部署需要考慮三個問題:
1. 共享存儲的選取,Harbor的后端存儲目前支持AWS S3、Openstack Swift, Ceph等,在下面的實驗環(huán)境里,暫且直接使用nfs。
2. Session在不同的實例上共享,這個現(xiàn)在其實已經(jīng)不是問題了,在最新的harbor中,默認(rèn)session會存放在redis中,只需要將redis獨立出來即可。可以通過redis sentinel或者redis cluster等方式來保證redis的可用性。在下面的實驗環(huán)境里,暫且使用單臺redis。
3. Harbor多實例數(shù)據(jù)庫問題,這個也只需要將harbor中的數(shù)據(jù)庫拆出來獨立部署即可。讓多實例共用一個外部數(shù)據(jù)庫,數(shù)據(jù)庫的高可用也可以通過數(shù)據(jù)庫的高可用方案保證。
部署記錄
1. 環(huán)境說明 ======================================================================================== ip hostname role 172.16.60.240 host-240 harbor 172.16.60.244 host-244 harbor 172.16.60.245 host-245 nfs需要注意: 這里的環(huán)境中,不包括LB負(fù)載均衡器的配置,兩臺harbor前面需要架設(shè)一個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=disabled2. 172.16.60.245節(jié)點機操作 ======================================================================================= 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服務(wù)和查看rpcbind服務(wù)端口 [root@host-245 ~]# systemctl start rpcbind [root@host-245 ~]# systemctl enable rpcbind開啟nfs服務(wù) [root@host-245 ~]# systemctl start nfs [root@host-245 ~]# systemctl enable nfs3. 172.16.60.240/244兩臺harbor節(jié)點機操作 ======================================================================================= 1)在兩個harbor節(jié)點上掛載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 mightneed a /sbin/mount.<type> helper program)In some cases useful info is found in syslog - trydmesg | tail or so.[root@host-240 harbor]# yum install nfs-utils [root@host-240 harbor]# mount -t nfs 172.16.60.245:/kevin /data2)安裝harbor 可以參考:https://www.cnblogs.com/kevingrace/p/6547616.html 兩個節(jié)點harbor相互配置同步,實現(xiàn)harbor主主復(fù)制 安裝harbor后,可以在host-240和host-245節(jié)點上查看harbor容器情況: [root@host-240 harbor]# docker-compose psName 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主主復(fù)制(兩個harbor節(jié)點相互配置到對方的同步策略)時,注意: "同步管理"規(guī)則里的"同步模式"(建議使用push推送模式。push模式是推到目標(biāo)倉庫,pull模式是從源倉庫拉取過來) "同步管理"規(guī)則里的"觸發(fā)模式" (建議采用定時模式,比如每10秒鐘同步一次:*/10 * * * * *) "同步管理"規(guī)則里的"源資源過濾器"(如果沒有過濾需求,就不要配置這一項)4. LB配置 ======================================================================================= 在兩個harbor節(jié)點的前面部署LB負(fù)載均衡層,通過VIP提供統(tǒng)一入口 (如域名),實現(xiàn)harbor訪問的負(fù)載均衡和高可用。 可以通過綁定hosts到不同的節(jié)點來驗證兩個節(jié)點的負(fù)載均衡效果。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文件內(nèi)容如下: [root@host-245 ~]# vim docker-compose.yml version: '3' services:mysql-server:hostname: mysql-servercontainer_name: mysql-serverimage: mysql:5.7network_mode: hostvolumes:- /mysql57/kevin:/var/lib/mysqlcommand: --character-set-server=utf8environment:MYSQL_ROOT_PASSWORD: 123456redis:hostname: redis-servercontainer_name: redis-serverimage: redis:3network_mode: host啟動docker-compose [root@host-245 ~]# docker-compose up -d啟動后查看 [root@host-245 ~]# docker-compose psName Command State Ports ------------------------------------------------------------- mysql-server docker-entrypoint.sh --cha ... Up redis-server docker-entrypoint.sh redis ... Up可以嘗試登錄mysql容器數(shù)據(jù)庫中 [root@host-245 ~]# docker-compose exec mysql-server bash root@mysql-server:/# mysql -p123456或者直接登錄 [root@host-245 ~]# docker-compose exec mysql-server mysql -p1234562)接著需要往172.16.60.245上部署的mysql數(shù)據(jù)庫中導(dǎo)入harbor節(jié)點的registry數(shù)據(jù)庫在兩臺harbor節(jié)點上導(dǎo)出數(shù)據(jù)庫,并將registry.dump復(fù)制出來 # docker exec -it harbor_db /bin/bash登陸harbor_db容器后執(zhí)行:mysqldump -uroot -p --databases registry > registry.dump # docker cp harbor_db:/registry.dump ./ 再將registry.dump復(fù)制到245節(jié)點的mysql容器中 # scp ./registry.dump root@172.16.60.245:/root在245節(jié)點上,將registry數(shù)據(jù)庫導(dǎo)入到mysql容器中 # docker cp /root/registry.dump mysql-server:/registry.dump # docker exec -it mysql-server /bin/bash登陸到mysql容器后執(zhí)行:mysql -uroot -p123456mysql> source /registry.dump3) 在兩個harbor節(jié)點上,修改harbor.yml文件,需要修改成使用外部數(shù)據(jù)庫及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集群已使用外部的數(shù)據(jù)庫和redis解決session問題,故需要將docker-compose.yml文件里關(guān)于數(shù)據(jù)庫和redis的配置去掉。==================================================================================== 由于Harbor新版本里增加了對PostgreSQL數(shù)據(jù)庫的支持, 不使用mysql數(shù)據(jù)庫。 可以在docker-compose.yml文件里將對應(yīng)的postgresql容器改為mysql容器(參考之前的harbor版本配置)轉(zhuǎn)載于:https://www.cnblogs.com/kevingrace/p/11422710.html
總結(jié)
以上是生活随笔為你收集整理的Kubernetes容器集群 - harbor仓库高可用集群部署说明的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Segment Tree
- 下一篇: VMware Workstation P