运维开发网

搭建高可用的harbor集群

运维开发网 https://www.qedev.com 2020-10-12 12:01 出处:51CTO 作者:oudemen
说明:本文中的主机操作系统全部为CentOS7版本:Harbor:v2.1.0,postgresql:12.4Harbor(https://goharbor.io)是一个优秀的企业级的容器镜像仓库管理系统,用于为企业级用户建立私有的容器镜像库。做为CNCF第十一个毕业的项目,国内外众多的公司都采用harbor做为自己的docker私有仓库。Harbor是基于docker官方的DockerRegis

说明:

    本文中的主机操作系统全部为CentOS7

    版本: Harbor: v2.1.0 ,  postgresql: 12.4

    

Harbor(https://goharbor.io)是一个优秀的企业级的容器镜像仓库管理系统,用于为企业级用户建立私有的容器镜像库。做为CNCF第十一个毕业的项目,国内外众多的公司都采用harbor做为自己的docker私有仓库。Harbor是基于docker官方的Docker Registry,在官方Registry基础上,增加了权限控制、LDAP、审计、管理界面、API等企业必备功能,这些额外功能的数据都存储在postgresql数据库中。缓存使用的redis。镜像的存储是由Docker Registry负责的,Docker Registry支持存储后端包括文件系统,azure,gcs,s3,swift,oss等。(详细见官方文档)

        要实现harbor高可用,需要将数据层(postgresql,redis,镜像存储后端) 相关组件抽离出来,并扩展成集群。

        1、postgresql

        postgresql和mysql一样,也支持复制功能的。我们搭建一个postgresql主从复制集群,利用keepalived实现故障自动切换。

# 在主库和从库上分别安装postgresql
yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat-repo-latest.noarch.rpm
yum install -y postgresql12-server

## 在主库上执行
# root用户执行: 初始化并启动postgresql
$ /usr/pgsql-12/bin/postgresql-12-setup initdb
$ systemctl start postgresql-12
# 切换到postgres用户执行:修改postgresql监听端口,默认postgresql只监听127.0.0.1
$ su - postgres 
$ psql -c "ALTER SYSTEM SET listen_addresses TO '*'";
# 然后再用root重启启动postgresql 
$ systemctl restart postgresql-12
# 登录到postgresql,创建复制用户
$ su - postgres -c psql 
postgres=# CREATE USER replicator WITH REPLICATION ENCRYPTED PASSWORD 'secret';
$ echo "host replication replicator samenet md5" >> /var/lib/pgsql/12/data/pg_hba.conf

## 在从库上执行
$ pg_basebackup -h master_ip -U replicator -p 5432 -D /var/lib/pgsql/12/data -Fp -Xs -P -R
#查看文件,看数据文件是否都复制过来了,查看是否存在文件standby.signal,查看recovery.conf内容
$ ls -al /var/lib/pgsql/12/data
$ ls -al /var/lib/pgsql/12/data/standby.signal
$ cat /var/lib/pgsql/12/data/recovery.conf
# 启动从库上的postgresql
$ systemctl start postgresql-12

##在主库上创建harbor用到的库, 并查看从库复制是否正常
postgres=# CREATE USER harbor  ENCRYPTED PASSWORD 'secret1';
postgres=# CREATE DATABASE harbor owner harbor;
postgres=# CREATE DATABASE harbor_clair owner harbor;
postgres=# CREATE DATABASE harbor_notary_signer owner harbor;
postgres=# CREATE DATABASE harbor_notary_server owner harbor;


##分别在两个主机上安装keepalived,当主机进入到master状态是,调用脚本,
执行命令 su - postgres -c "pg_ctl promote  -D /var/lib/pgsql/12/data",将从库提升为主库。从库状态下的,postgresql是只读的。

        2、s3

        在这里,我采用minio搭建S3集群,作为镜像的存储层

# minio 搭建非常简单。
# 准备几台主机,在所有主机上安装minio,创建/data/minio目录
# 所有主机上执行下面的命令
$ export MINIO_ACCESS_KEY=<ACCESS_KEY>
$ export MINIO_SECRET_KEY=<SECRET_KEY>
$ minio server http://minio{1...n}.example.com/data/minio
# 然后用nginx或haproxy做负载均衡即可,例子:https://docs.min.io/docs/setup-nginx-proxy-with-minio.html

# 为harbor创建bucket,分配权限
# 访问minio的web页面,或者下载客户端mc。下面以mc为例
$ mc alias set myminio http://localhost:9000 <ACCESS_KEY> <SECRET_KEY>
$ mc mb myminio harbor
$ mc admin user add myminio harbor <HARBOR_SECRET_KEY>
$ mc admin policy add myminio harbor harbor.json
$ mc admin policy set myminio harbor user=harbor
harbor.json:
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:*"
      ],
      "Effect": "Allow",
      "Resource": [
        "arn:aws:s3:::harbor/*"
      ],
      "Sid": ""
    }
  ]
}

         3、harbor

# 安装docker和docker-compose
# 下载harbor离线安装包
$ wget https://github.com/goharbor/harbor/releases/download/v2.1.0/harbor-offline-installer-v2.1.0.tgz
$ tar zxf harbor-offline-installer-v2.1.0.tgz && cd harbor
# 配置harbor
$ cp harbor.yml.tmpl harbor.yml
修改storage_service
storage_service:
  s3:
    accesskey: harbor
    secretkey: <HARBOR_SECRET_KEY>   #之前创建harbor的secretkey
    region: us-west-1    #随便写一个区就可以,必填项
    regionendpoint: http://s3.example.com:9000  
    bucket: harbor    #上面创建的bucket名字
    encrypt: false									
    secure: true
    v4auth: true
    multipartcopychunksize: 33554432
    multipartcopymaxconcurrency: 100
    multipartcopythresholdsize: 33554432
    rootdirectory: /online    #bucket里文件夹的名字
修改external_database:
  harbor:
    host: postgresql-vip
    port: 5432
    db_name: harbor
    username: harbor
    password: secret1
    ssl_mode: disable
    max_idle_conns: 2
    max_open_conns: 0
  clair:
    host: postgresql-vip
    port: 5432
    db_name: harbor_clair
    username: harbor
    password: secret1
    ssl_mode: disable
    max_idle_conns: 2
    max_open_conns: 0
  notary_signer:
    host: postgresql-vip
    port: 5432
    db_name: harbor_notary_signer
    username: harbor
    password: secret1
    ssl_mode: disable
    max_idle_conns: 2
    max_open_conns: 0
  notary_server:
    host: postgresql-vip
    port: 5432
    db_name: harbor_notary_server
    username: harbor
    password: secret1
    ssl_mode: disable
    max_idle_conns: 2
    max_open_conns: 0

配置external_redis:
  external_redis:
    host: redis-vip:6379
    password: pass
    registry_db_index: 1
    jobservice_db_index: 2
    chartmuseum_db_index: 3
    clair_db_index: 4
    trivy_db_index: 5

# 初始化并启动harbor
./install.sh --with-notary --with-clair --with-trivy --with-chartmuseum

如果想开启自启动,可以使用systemd管理
/etc/systemd/system/harbor.service:
[Unit]
Description=Harbor
After=docker.service systemd-networkd.service systemd-resolved.service
Requires=docker.service
Documentation=http://github.com/vmware/harbor

[Service]
Type=simple
Restart=on-failure
RestartSec=3
WorkingDirectory=/opt/backend/harbor
ExecStart=/usr/local/bin/docker-compose up
ExecStop=/usr/local/bin/docker-compose stop

[Install]
WantedBy=multi-user.target

$ systemctl daemon-reload
$ systemctl enable harbor

 

       补充:       

        1、存储层独立出来后,harbor可以部署多份,实现高可用和负载均衡。也可以部署到kubernetes,但是建议不要只部署在kubernetes里,以防出现意外时,影响到harbor访问,进而影响到kubernetes的自动修复。

        2、如果采用的后端存储是s3,客户端也需要能访问到s3集群。因为当docker推拉镜像时,harbor是直接返给客户端s3的访问地址              

搭建高可用的harbor集群

        3、如果你的网络下载harbor离线安装包和docker-compose比较慢的话,可以从这个连接里得到 https://share.weiyun.com/53rIFTx6

           

         

扫码领视频副本.gif

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号