­

Kubernetes容器集群 – harbor倉庫高可用集群部署說明

  • 2019 年 10 月 8 日
  • 筆記

之前介紹Harbor私有倉庫的安裝和使用,這裡重點說下Harbor高可用集群方案的部署,目前主要有兩種主流的Harbor高可用集群方案:1)雙主複製;2)多harbor實例共享後端存儲

一、Harbor雙主複製高可用集群

1)主從同步 harbor官方默認提供主從複製的方案來解決鏡像同步問題,通過複製的方式,我們可以實時將測試環境harbor倉庫的鏡像同步到生產環境harbor,類似於如下流程:

在實際生產運維的中,往往需要把鏡像發布到幾十或上百台集群節點上。這時,單個Registry已經無法滿足大量節點的下載需求,因此要配置多個Registry實例做負載均衡。手工維護多個Registry實例上的鏡像,將是十分繁瑣的事情。Harbor可以支援一主多從的鏡像發布模式,可以解決大規模鏡像發布的難題:

只要往一台Harbor上發布,鏡像就會像"仙女散花"般地同步到多個Registry中,高效可靠。

如果是地域分布較廣的集群,還可以採用層次型發布方式,比如從集團總部機房同步到分公司1機房,再從分公司1機房同步到分公司2機房:

然而單靠主從同步,仍然解決不了harbor主節點的單點問題。

2)雙主複製說明 所謂的雙主複製其實就是復用主從同步實現兩個harbor節點之間的雙向同步,來保證數據的一致性,然後在兩台harbor前端頂一個負載均衡器將進來的請求分流到不同的實例中去,只要有一個實例中有了新的鏡像,就是自動的同步複製到另外的的實例中去,這樣實現了負載均衡,也避免了單點故障,在一定程度上實現了Harbor的高可用性:

這個方案有一個問題就是有可能兩個Harbor實例中的數據不一致。假設如果一個實例A掛掉了,這個時候有新的鏡像進來,那麼新的鏡像就會在另外一個實例B中,後面即使恢復了掛掉的A實例,Harbor實例B也不會自動去同步鏡像,這樣只能手動的先關掉Harbor實例B的複製策略,然後再開啟複製策略,才能讓實例B數據同步,讓兩個實例的數據一致。另外,這裡還需要多吐槽一句:在實際生產使用中,主從複製十分的不靠譜!!所以這裡推薦使用下面要說的這種方案

二、多harbor實例共享後端存儲的高可用集群(推薦方案)

方案說明 共享後端存儲算是一種比較標準的方案,就是多個Harbor實例共享同一個後端存儲,任何一個實例持久化到存儲的鏡像,都可被其他實例中讀取。通過前置LB進來的請求,可以分流到不同的實例中去處理,這樣就實現了負載均衡,也避免了單點故障:

這個方案在實際生產環境中部署需要考慮三個問題: 1. 共享存儲的選取,Harbor的後端存儲目前支援AWS S3、Openstack Swift, Ceph等,在下面的實驗環境里,暫且直接使用nfs。 2. Session在不同的實例上共享,這個現在其實已經不是問題了,在最新的harbor中,默認session會存放在redis中,只需要將redis獨立出來即可。可以通過redis sentinel或者redis cluster等方式來保證redis的可用性。在下面的實驗環境里,暫且使用單台redis。 3. Harbor多實例資料庫問題,這個也只需要將harbor中的資料庫拆出來獨立部署即可。讓多實例共用一個外部資料庫,資料庫的高可用也可以通過資料庫的高可用方案保證。

部署記錄

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. 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    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 * * * * *)  "同步管理"規則里的"源資源過濾器"(如果沒有過濾需求,就不要配置這一項)    4. LB配置  =======================================================================================  在兩個harbor節點的前面部署LB負載均衡層,通過VIP提供統一入口 (如域名),實現harbor訪問的負載均衡和高可用。  可以通過綁定hosts到不同的節點來驗證兩個節點的負載均衡效果。    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版本配置)