生產級harbor可用的搭建

生產級harbor可用的搭建

Harbor簡介

Harbor是一個用於存儲和分發Docker鏡像的企業級Registry服務器,通過添加一些企業必需的功能特性,例如安全、標識和管理等,擴展了開源Docker Distribution。

生產級harbor可用的搭建

作爲一個企業級私有Registry服務器,Harbor提供了更好的性能和安全。

提升用戶使用Registry構建和運行環境傳輸鏡像的效率。

Harbor支持安裝在多個Registry節點的鏡像資源複製,鏡像全部保存在私有Registry中, 確保數據和知識產權在公司內部網絡中管控。

另外,Harbor也提供了高級的安全特性,諸如用戶管理,訪問控制和活動審計等。

高可用架構:雙主複製

主從同步

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

img

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

生產級harbor可用的搭建

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

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

生產級harbor可用的搭建

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

雙主複製說明

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

生產級harbor可用的搭建

這個方案有一個問題就是有可能兩個Harbor實例中的數據不一致。假設如果一個實例A掛掉了,這個時候有新的鏡像進來,那麼新的鏡像就會在另外一個實例B中,後面即使恢復了掛掉的A實例,Harbor實例B也不會自動去同步鏡像,這樣只能手動的先關掉Harbor實例B的複製策略,然後再開啓複製策略,才能讓實例B數據同步,讓兩個實例的數據一致。

另外,這裏還需要多吐槽一句:在實際生產使用中,主從複製十分的不靠譜!!所以這裏推薦使用下面要說的這種方案

高可用架構:多實例共享後端存儲

方案說明

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

本次搭建以NFS作爲共享存儲存放Harbor相關data,並分離PostgreSQL與Redis爲多個Harbor共同連接使用,使用Nginx做負載均衡。

img

如果最終生產環境集羣中服務器較多,依賴做完LB的Harbor也無法完全達到需求時,可以使用如下架構,部署下級Harbor節點從主節點同步鏡像,然後再分發給生產服務器。

生產級harbor可用的搭建

這個方案在實際生產環境中部署需要考慮三個問題:

1. 共享存儲的選取,Harbor的後端存儲目前支持AWS S3、Openstack Swift, Ceph等,在下面的實驗環境裏,暫且直接使用nfs。

2. Session在不同的實例上共享,這個現在其實已經不是問題了,在最新的harbor中,默認session會存放在redis中,只需要將redis獨立出來即可。可以通過redis sentinel或者redis cluster等方式來保證redis的可用性。在下面的實驗環境裏,暫且使用單臺redis。

3. Harbor多實例數據庫問題,這個也只需要將harbor中的數據庫拆出來獨立部署即可。讓多實例共用一個外部數據庫,數據庫的高可用也可以通過數據庫的高可用方案保證。

環境說明

  • 操作系統:CentOS 7.6
  • 演示環境軟件版本
軟件 版本
Docker 19.03.8
docker-compose 1.25.5
Harbor 1.10.2
Nginx 1.14.0
PostgreSQL 9.6.17
Redis 3.2.12
  • 演示環境網絡

這裏主要做Harbor高可用演示,真實生產環境請按需分離NFS與DB單獨部署。

IP 主機名
192.168.16.141 Nginx
192.168.166.122 NFS
192.168.166.203 postgresql
192.168.166.245 Redis
192.168.166.81 Harbor-01
192.168.166.212 Harbor-02

多實例共享後端存儲部署

Docker

1)安裝依賴包:

yum install -y yum-utils \
  device-mapper-persistent-data \
  lvm2

2)官方一鍵腳本安裝

curl -fsSL get.docker.com -o get-docker.sh
sh get-docker.sh --mirror Aliyun

3)添加內核參數

tee -a /etc/sysctl.conf <<-EOF
net.bridge.bridge-nf-call-ip6tables = 1
net.bridge.bridge-nf-call-iptables = 1
EOF

net.ipv4.ip_forward賦值爲1

然後刷新內核參數

sysctl -p

4)修改Docker倉庫爲國內鏡像站

curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://pclhthp0.mirror.aliyuncs.com

5)啓動Docker

systemctl enable docker && systemctl start docker

Compose

compose是Docker提供的一個命令行工具,用來定義和運行由多個容器組成的應用。使用compose,我們可以通過YAML文件聲明式的定義應用程序的各個服務,並由單個命令完成應用的創建和啓動。

由於國內政策原因,可能在海外網站上下載文件速度較慢,建議下載本地後上傳至服務器

1)下載docker-compose並賦予可執行權限

# curl -L https://github.com/docker/compose/releases/download/1.24.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
cd /usr/local/bin
scp 192.168.166.96:/usr/local/bin/docker-compose .

注意:由於我其他服務器已經存在,所以我直接拷貝了

2)安裝bash補全命令

# curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose
scp 192.168.166.96:/etc/bash_completion.d/docker-compose /etc/bash_completion.d/

重新連接終端即生效

注意:由於我其他服務器已經存在,所以我直接拷貝了

NFS

服務端

1)安裝必需的RPM包

yum -y install nfs-utils rpcbind   

2)創建NFS共享目錄

mkdir -p /data/harbor_data
chown nobody:nobody /data/harbor_data/ 

3)修改NFS服務配置文件

echo "/data/harbor_data 192.168.166.0/24(rw,sync,no_root_squash)"  >> /etc/exports

4)啓動NFS服務器

systemctl enable rpcbind && systemctl restart rpcbind
systemctl enable nfs && systemctl restart nfs

客戶端

1)安裝nfs-utils

yum -y install nfs-utils

2)在NFS客戶端上查看NFS的連通性

# showmount -e 192.168.166.122
Export list for 192.168.166.122:
/data/harbor_data 192.168.166.0/24

3)掛載NFS共享存儲

創建掛載目錄

mkdir /data

修改/etc/fstab配置文件加入以下內容

192.168.166.122:/data/harbor_data  /data  nfs defaults 0 0

mount掛載

mount -a

PostgreSQL

1)下載PostgreSQL官方YUM源配置文件包並安裝

wget https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
rpm -ivh pgdg-redhat-repo-latest.noarch.rpm 

2)安裝PostgreSQL

yum  -y install postgresql96-server postgresql96-contrib 

3)初始化數據庫

/usr/pgsql-9.6/bin/postgresql96-setup initdb  

4)啓動數據庫

systemctl enable postgresql-9.6 && systemctl restart postgresql-9.6

5)PostgreSQL數據庫配置

  1. 修改密碼
# su - postgres
-bash-4.2$ psql
psql (9.6.17)
Type "help" for help.
postgres=# ALTER USER postgres WITH PASSWORD 'postgres';
ALTER ROLE
  1. 開啓遠程訪問
vi /var/lib/pgsql/9.6/data/postgresql.conf

# listen_addresses = 'localhost' 改爲 listen_addresses='*'
  1. 信任遠程連接

vim /var/lib/pgsql/9.6/data/pg_hba.conf

加入:

host    all  all  192.168.166.203/32 trust
host    all  all  192.168.166.81/32 trust
host    all  all  192.168.166.212/32 trust

6)重啓PostgreSQL服務

systemctl restart postgresql-9.6

7)驗證服務

psql -h 192.168.166.203 -p 5432 -U postgres

8)遷移數據庫

  1. 在postgresql所在服務器,先啓動一套harbor環境

簡要步驟如下:

# yum install -y yum-utils   device-mapper-persistent-data   lvm2
# curl -fsSL get.docker.com -o get-docker.sh
# sh get-docker.sh --mirror Aliyun
#curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s https://pclhthp0.mirror.aliyuncs.com
# systemctl enable docker && systemctl start docker
# cd /usr/local/bin
# scp 192.168.166.96:/usr/local/bin/docker-compose .
# scp 192.168.166.96:/etc/bash_completion.d/docker-compose /etc/bash_completion.d/
# cd ~
# scp 192.168.166.96:/root/harbor-offline-installer-v1.10.2.tgz .
# tar -xvf harbor-offline-installer-v1.10.2.tgz -C /usr/local/
# cd /usr/local/harbor/
# vim harbor.yml ###修改hostname: 192.168.166.203  ####註釋掉https段即可
# ./prepare 
# ./install.sh 
# docker-compose up -d
  1. 進入harbor-db容器導出相關表及數據
# docker container exec -it harbor-db /bin/bash
pg_dump -U postgres registry > /tmp/registry.sql 
pg_dump -U postgres notarysigner > /tmp/notarysigner.sql  
pg_dump -U postgres notaryserver > /tmp/notaryserver.sql
  1. 導出數據庫
docker container cp harbor-db:/tmp/registry.sql /tmp
docker container cp harbor-db:/tmp/notarysigner.sql /tmp
docker container cp harbor-db:/tmp/notaryserver.sql /tmp
  1. 將數據導入至外部PostgreSQL數據庫
# psql -h 192.168.166.203 -U postgres
postgres=# create database registry;
CREATE DATABASE
postgres=# create database notarysigner;
CREATE DATABASE
postgres=# create database notaryserver;
CREATE DATABASE
psql -h 192.168.166.203 -U postgres registry < /tmp/registry.sql
psql -h 192.168.166.203 -U postgres notarysigner  < /tmp/notarysigner.sql
psql -h 192.168.166.203 -U postgres notaryserver < /tmp/notaryserver.sql

Redis

1)安裝redis

yum -y install redis

2) 修改配置參數

sed -i 's/bind 127.0.0.1/bind 0.0.0.0/g' /etc/redis.conf   
sed -i 's/daemonize no/daemonize yes/g' /etc/redis.conf   

3)啓動並測試redis連接

systemctl enable redis && systemctl restart redis
redis-cli 

Harbor

下載Harbor離線安裝包,離線安裝包文件較大(約爲:590M),建議在本地使用多線程工具下載後上傳服務器使用。

1)下載

cd ~
scp 192.168.166.96:/root/harbor-offline-installer-v1.10.2.tgz .

2)解壓

tar -xvf harbor-offline-installer-v1.10.2.tgz -C /usr/local/

3)修改配置文件

# cd /usr/local/harbor/
# vim harbor.yml 

修改的內容有

  • hostname修改爲本機ip
  • 註釋掉https
  • 修改harbor默認的admin賬號密碼
  • 數據存儲位置,改爲nfs掛載目錄,因爲我們本來就掛載到了/data目錄下,所以不用動
  • 註釋掉database
  • 註釋掉clair
  • 打開external_databaseexternal_redis塊的註釋,並改爲剛剛部署的地址

修改完的樣例文件,如下

hostname: 192.168.166.81
http:
  port: 80
harbor_admin_password: Harbor12345
data_volume: /data
jobservice:
  max_job_workers: 10
notification:
  webhook_job_max_retry: 10
chart:
  absolute_url: disabled
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor
_version: 1.10.0
external_database:
  harbor:
    host: 192.168.166.203
    port: 5432
    db_name: registry
    username: postgres
    password: postgres
    ssl_mode: disable
    max_idle_conns: 2
    max_open_conns: 0
  clair:
    host: 192.168.166.203
    port: 5432
    db_name: clair
    username: postgres
    password: postgres
    ssl_mode: disable
  notary_signer:
    host: 192.168.166.203
    port: 5432
    db_name: notarysigner
    username: postgres
    password: postgres
    ssl_mode: disable
  notary_server:
    host: 192.168.166.203
    port: 5432
    db_name: notaryserver
    username: postgres
    password: postgres
    ssl_mode: disable
external_redis:
  host: 192.168.166.245
  port: 6379
  password:
  registry_db_index: 1
  jobservice_db_index: 2
  chartmuseum_db_index: 3
  clair_db_index: 4
proxy:
  http_proxy:
  https_proxy:
  no_proxy:
  components:
    - core
    - jobservice
    - clair

4)生成harbor運行的必要文件(環境)以及docker-compose.yml文件;執行後會通過網絡獲取Docker Image,建議提前修改好國內鏡像站加速。

./prepare 

5)安裝Harbor

./install.sh 

Nginx

1)安裝nginx

安裝可以參考https://wiki.clay-wangzhi.com/7-nginx/1.-chu-shi-nginx#4-bian-yi-an-zhuang-nginx

這裏我就不再詳細講了

2)編寫配置文件

# cat harbor.schengle.com.conf 
upstream harbor {
    ip_hash;
    server 192.168.166.81:80;
    server 192.168.166.212:80;
}
server {
    listen       80;
    server_name  harbor.***.com;
    rewrite ^(.*) https://$server_name$1 permanent;
}
server {
    listen  443 ssl;
    server_name harbor.schengle.com;

    ssl_certificate ***.crt;
    ssl_certificate_key ***.key;
    client_max_body_size 0;
    chunked_transfer_encoding on;

    location / {
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        #proxy_set_header Host $host;
        proxy_set_header X-Forwarded-Proto https;
        proxy_redirect off;
        proxy_ssl_verify off;
        proxy_ssl_session_reuse on;
        proxy_pass http://harbor;
        proxy_redirect default;
        proxy_http_version 1.1;
}
    location /v2/ {
        proxy_pass http://harbor/v2/;
        proxy_redirect default;
        #proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_ssl_verify off;
        proxy_ssl_session_reuse on;
        proxy_buffering off;
        proxy_request_buffering off;
    }
}

3)平滑重啓nginx

nginx -s reload

參考文章

https://www.cnblogs.com/kevingrace/p/11422710.html

https://juejin.im/post/5d973e246fb9a04dfa0963fb#heading-18

http://dwz-9.cn/_L4me

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章