harbor1.91高可用升级备份踩坑记录

单机harbor时代

  • 代理: Harbor的组件(例如注册表,UI和令牌服务)都位于反向代理之后。代理将来自浏览器和Docker客户端的请求转发到各种后端服务。

  • 注册表:负责存储Docker映像和处理Docker推/拉命令。由于Harbor需要强制执行对图像的访问控制,因此注册表将引导客户端使用令牌服务,以便为每个请求请求提供有效的令牌。

  • 核心服务: Harbor的核心功能,主要提供以下服务:

  • UI:图形用户界面,可帮助用户管理注册表上的图像Webhook:Webhook是在注册表中配置的一种机制,因此可以将注册表中的图像状态更改填充到Harbor的Webhook端点。Harbor使用webhook更新日志,启动复制和其他一些功能。令牌服务:负责根据项目用户的角色为每个docker push / pull命令发布令牌。如果从Docker客户端发送的请求中没有令牌,则注册表会将请求重定向到令牌服务。数据库:数据库存储项目,用户,角色,复制策略和图像的元数据。

  • 作业服务:用于图像复制,可以将本地图像复制(同步)到其他Harbor实例。

  • 日志收集器:负责在一个地方收集其他模块的日志。

下载地址

  • harbor版本: https://github.com/goharbor/harbor/releases

harbor的自签证书域名版本

openssl req  -newkey rsa:4096 -nodes -sha256 -keyout ca.key -x509 -days 365 -out ca.crt -subj "/C=CN/L=Shanghai/O=harbor/CN=harbor-registry"
openssl req -newkey rsa:4096 -nodes -sha256 -keyout harbor-test.iauto360.cn.key -out server.csr -subj "/C=CN/L=Shanghai/O=harbor/CN=你的域名"
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out harbor-test.iauto360.cn.crt
  • 修改配置文件

  • 运行

harbor坑之一

  • 简单说就是请求体过长这种情况通常出现在nginx -> harbor 同步镜像的时候会发生解决方法

nginx修改配置项大小限制

server {
    client_max_body_size 512M; 
}

harbor坑之二

  • 容器默认解析的是容器内部的host,在生产情况下同步镜像到slave节点需要走域名https等需要经过多级nginx转发这时候就需要指定host

修改docker-compose配置信息

    extra_hosts:
     - "harbor-pro.xxx.cn:10.10.8.xx"
     - "harbor-test.xxx.cn:xx.104.178.xx"

//保存退出然后再重载一下
./install.sh

harbor坑之三

  • 在你自定义harbor持续化存储的路径时候要小心secretkey的位置会导致adminserver这个服务起不来

报错信息

Oct 11 11:42:24 172.21.0.1 adminserver[260299]: 2019-10-11T03:42:24Z [INFO] the path of json configuration storage: /etc/adminserver/config/config.json
Oct 11 11:42:24 172.21.0.1 adminserver[260299]: 2019-10-11T03:42:24Z [INFO] the path of key used by key provider: /etc/adminserver/key
Oct 11 11:42:24 172.21.0.1 adminserver[260299]: 2019-10-11T03:42:24Z [FATAL] [main.go:45]: failed to initialize the system: read /etc/adminserver/key: is a directory

解决方式

#The path of secretkey storage
secretkey_path = /data/harbor
以上需要和你
adminserver:
  volumes:
    - /data/harbor/secretkey:/etc/adminserver/key:z    #路径一致否则会报错

使用姿势

  • 配置默认镜像仓库地址
vim /etc/docker/daemon.json

{

  "insecure-registries": ["具体所在的环境的地址","地址二"]  #不要加https/http

}

systemctl restart docker  #重载docker就可以安心拉镜像了

  • 上传镜像的方式如下:
将harbor.ym.crt秘钥上传的机器的

/etc/docker/certs.d/[upload的域名/ip]/

/usr/local/share/ca-certificates 

执行 update-ca-certificates

登入 docker login harbor.ym(域名/IP)
  • 报错解决方案
第一种 : Error response from daemon: Get https://harbor.ym/v2/: x509: certificate signed by unknown authority  #这种未知颁发的证书

vim /etc/docker/daemon.json

{

  "insecure-registries": ["harbor.ym"]

}

重启下docker

第二种 : 报认证错误的更新下证书重新上传
  • 镜像打包的格式:

  • 例子: harbor.ym/test/jenkins:1.11 → harbor.ym/(harbor的镜像仓库)/镜像的命名:镜像版本号

  • 镜像的上传:

  • 例子: docker push harbor.ym/test/jenkins:1.11

harbor v1.7.6 升级 v1.9.1-rc

官方升级指南

步骤

  • 备份数据可能携带大量的镜像导致过大,最好不要压缩直接cp -r xx xx-bak即可
  • docker pull goharbor/harbor-migrator:[tag] #tag号是你要升级到的版本
  • 升级切记测试环境不要直接玩生产,切记切记!!!

升级坑一

docker run -it --rm -v ${老配置文件路径}/harbor.cfg:/harbor-migration/harbor-cfg/harbor.yml -v ${新配置文件路径}harbor.yml:/harbor-migration/harbor-cfg-out/harbor.yml goharbor/harbor-migrator:v1.9.0 --cfg up
Please backup before upgrade, 
Enter y to continue updating or n to abort: y
Command for config file migration: python ./cfg/run.py --input /harbor-migration/harbor-cfg/harbor.yml --output /harbor-migration/harbor-cfg-out/harbor.yml
input version: 1.7.0, migrator chain: ['1.8.0', '1.9.0']
migrating to version 1.8.0
migrating to version 1.9.0
python iamges ERROR:
ERROR:jinja2.exceptions.UndefinedError: 'chart' is undefined

解决方案

  • 依赖的资料 https://github.com/goharbor/harbor/issues/9174

  • 参考资料二 https://github.com/goharbor/harbor/blob/master/docs/installation_guide.md

替换官方的提供镜像迁移的镜像
源 -> goharbor/harbor-migrator:v1.9.0
新 -> thatsk/harbor-migrator:v1.9.0
执行成功的提示:
[info] Written new values to /harbor-migration/harbor-cfg-out/harbor.yml

harbor.yml

hostname: 域名/ip
http:
  port: 80
https:
  port: 443
  certificate: /data/www/cert/ip/域名或ip.crt
  private_key: /data/www/cert/ip/域名或ip.key
harbor_admin_password: Harbor12345
database:
  password: root123
  max_idle_conns: 50
  max_open_conns: 100
data_volume: /data/harbor
storage_service:
  ca_bundle: 
clair:
  updaters_interval: 12
jobservice:
  max_job_workers: 10
notification:
  webhook_job_max_retry: 10
log:
  level: info
  local:
    rotate_count: 50
    rotate_size: 200M
    location: /var/log/harbor
_version: 1.9.0
proxy:
  http_proxy:
  https_proxy:
  no_proxy: 127.0.0.1,localhost,.local,.internal,log,db,redis,nginx,core,portal,postgresql,jobservice,registry,registryctl,clair
  components:
    - core
    - jobservice
    - clair
  • ./install.sh #开始更新

  • 记得docker ps -a #查看健康检查是否全通过 and /var/log/harbor/core.log 观察日志即可

企业级harbor高可用构建

在企业中单间架构的harbor是远远无法满足多机房快速迭代高并发的场合的所以某些情况下需要对现有的habor环境进行相应的改造
符合当下时代的devops潮流满足业务快速迭代上线的CI/CD方式给予以下的内容作为参考

  • 技术需求: nginx,dns,harbor,docker,docker-compose,redis,postfressql,nfs

架构图

记录下redis和postfressql版本

  • docker exec -it harbor-db psql

  • docker exec -it redis redis-server –version

NFS安装

服务端

# 创建需要共享的目录
mkdir -p /data/harbor

# nfs-sever
sudo apt-get install nfs-kernel-server

# 启动开机重启
systemctl start rpcbind
systemctl enable rpcbind
systemctl start nfs-server
systemctl enable nfs-server
systemctl start nfs-lock
systemctl enable nfs-lock
systemctl start nfs-idmap
systemctl enable nfs-idmap

# 使用如下命令像/etc/exports中添加配置
/data/harbor   10.200.10.0/23(rw,sync,no_root_squash)  #具体NFS不懂的可以百度

# 使exports的修改生效
exportfs -a

# showmount -e localhost
Export list for localhost:
/data/nfs 10.0.0.0/8

# 如果有使用防火墙自己放通云服务一样

客户端挂载

# 安装NFS-Client
apt-get install -y nfs-common

# 查看远端的NFS-server是否正常
showmount -e 10.200.10.146
正常返回:
Export list for 10.200.10.146:
/data/harbor 10.200.10.0/23

# 挂载nfs-client
mount -t nfs 目标IP:目标path /path
df -h

# 以下如果成功可以设置开机自动挂载
echo '10.200.10.146:/data/nfs /data nfs defaults 0 0' >> /etc/fstab
  • 故障:NFS无法挂载查看防火墙是否有开启限制,如果是公有云查看公有云是否没有开启策略

  • 测试是否成功: touch /data/harbor/www #然后去其他的机器上查看是否存储

DB的安装

Harbor的数据库原先使用的是Mysql后续官方评估后大概在1.7.0版本弃用了换成Postgresql了国内使用比较少吧
在1.7.x版本中4个数据库是集成在harbor-db这个容器中的,但是在当前的架构下需要拆开来提供使用.
在1.9.x版本中yaml配置文件已经可以使用额外的配置向开启使用外部的数据库,当前将4个库按配置文件要求全部拆分到4个容器中提供服务

  • registry/clair/notarysigner/notaryserver/redis #拆开数据库分别用容器启动

注意事项

  • volume的路径为挂载到的当前的机器的对应路径

  • 密码/端口/等待,DIY时候主要小心

  • 如果涉及到数据库迁移则需要导出sql文件

迁移数据库

  • 原数据库信息存在Container harbor-db中
docker ps -a   # 找到harbor-db的信息
docker exec -it --user postgres harbor-db bash  # root用户是不支持做sqldump操作的
postgres [ ~ ]$ psql  # 先查看所有的使用中的数据库
pg_dumpall -f all.sql   # 搞下所有的
pg_dump -d notarysigner -f notarysigner-bak.sql  # 指定单个数据库dump下来
# dump的sql拷贝出来
docker cp <containerId>:/file/path/within/container /host/path/target
# 数据库信息存储在NFS的共享存储之上所以记得放置在映射到目标容器的目录中导入信息
# 例如我的在/data/harbor/postgres中容器中的位置在/var/lib/postgres/data/中这样才能找到dump的文件

新建起来

version: "3"

networks:
  harbor:
    driver: bridge

services:
  registry:
    image: postgres:9.6.14
    container_name: harbor-registry
    restart: always
    environment:
      POSTGRES_DB: registry
      POSTGRES_PASSWORD: hlym3321
    volumes:
      - /data/harbor/postgres/registry:/var/lib/postgresql/data
    networks:
      - harbor
    ports:
      - 20010:5432
  clair:
    image: postgres:9.6.14
    container_name: harbor-clair
    restart: always
    environment:
      POSTGRES_DB: clair
      POSTGRES_PASSWORD: hlym3321
    volumes:
      - /data/harbor/postgres/clair:/var/lib/postgresql/data
    networks:
      - harbor
    ports:
      - 20011:5432
  notarysigner:
    image: postgres:9.6.14
    container_name: harbor-notarysigner
    restart: always
    environment:
      POSTGRES_DB: notarysigner
      POSTGRES_PASSWORD: hlym3321
    volumes:
      - /data/harbor/postgres/notarysigner:/var/lib/postgresql/data
    networks:
      - harbor
    ports:
      - 20012:5432
  notaryserver:
    image: postgres:9.6.14
    container_name: harbor-notaryserver
    restart: always
    environment:
      POSTGRES_DB: notaryserver
      POSTGRES_PASSWORD: hlym3321
    volumes:
      - /data/harbor/postgres/notaryserver:/var/lib/postgresql/data
    networks:
      - harbor
    ports:
      - 20013:5432
  Redis:
    image: redis:4.0.10
    container_name: harbor-redis
    command: redis-server /usr/local/etc/redis/redis.conf
    restart: always
    volumes:
      - /data/harbor/redis:/data
      - /data/harbor/redis/redis.conf:/usr/local/etc/redis/redis.conf
    networks:
      - harbor
    ports:
      - 20000:6379
  • docker ps -a #记得查看容器的健壮性

  • 挨个进入容器进行导入工作
# 进入的姿势
docker exec -it --user username ContainerName/id bash/command
psql database -f /path/file-name.sql
# 如果有报错删除久的库新建导入
DROP DATABASE name;
create DATABASE name;
# 重复以上操作

启动harbor

修改配置文件

  • 使用外部的数据库想信息,注意host端口密码,ssl默认即可
#Uncomment external_database if using external database.
external_database:
   harbor:
     host: 10.200.10.146
     port: 20010
     db_name: registry
     username: postgres
     password: hlym3321
     ssl_mode: disable
   clair:
     host: 10.200.10.146
     port: 20011
     db_name: clair
     username: postgres
     password: hlym3321
     ssl_mode: disable
   notary_signer:
     host: 10.200.10.146
     port: 20012
     db_name: notarysigner
     username: postgres
     password: hlym3321
     ssl_mode: disable
   notary_server:
     host: 10.200.10.146
     port: 20013
     db_name: notaryserver
     username: postgres
     password: hlym3321
     ssl_mode: disable

# Umcomments external_redis if using external Redis server
external_redis:
  host: 10.200.10.146
  port: 20000
  password:
  # db_index 0 is for core, it's unchangeable
  registry_db_index: 1
  jobservice_db_index: 2
  chartmuseum_db_index: 3

启动

  • 登入网页查看是否成功操作下
./install.sh --with-notary --with-clair --with-chartmuseum
# 如果报错有容器冲突可以使用这个方式来解决
docker-compose up -d --remove-orphans

将相应的节点启动web查看结果

  • 高可用完成

配置相关NGinx

upstream name {
        server ip:443;
        server ip:443;
}
server
{
        listen 443;
        server_name 域名;
        access_log /data/www/log/nginx/域名.log;
        error_log /data/www/log/nginx/域名-err.log;

        #证书文件
        ssl_certificate     /data/www/ca/域名.crt;
        #私钥文件
        ssl_certificate_key /data/www/ca/域名.key;
        ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers         HIGH:!aNULL:!MD5;
        keepalive_timeout 120s;
        keepalive_requests 10000;

        location / {
                proxy_pass https://name;
                proxy_redirect off;
                proxy_set_header Host $host;
                proxy_read_timeout 5s;
                proxy_send_timeout 90s;
                proxy_connect_timeout 90s;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_http_version 1.1;
        }
        location /v2/ {
                proxy_pass https://name/v2/;
                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_buffering off;
                proxy_request_buffering off;
        }
}

接入LDAP

常见问题

  • 在harbor1.7x大版本之后不再支持配置文件里面修改LDAP权限接入了,转而使用web端进行编辑

  • web端编辑数据库方式灰色无法进行选择怎么办?

  • 如何开启LDAP

按钮为灰色因为在psql的数据上创建了除了admin之外的其他用户,系统默认是只能使用一种权限控制的方式,如果想编辑需要以下方式

  • 进入数据库删除,id>2的用户,因为有关联外键的所以在删除用户之前需要删除相关的表数据
docker -exec -it -u postgres harbor-registry(如果没有独立出数据则使用harbor-db)
psql               #进入SQL客户端
\l               #打印当前的数据库
\c registry     #切换到对应的数据库中
\d               #打印当前所有表
select * from harbor_user;
delete harbor_user where id>2;
#正常情况下project这个表会有强关联的东西
#id>1的基本都要修改的
update from project set id=1 where id=?
  • https://github.com/goharbor/harbor/wiki/harbor-faqs#authentication #进行激活ldap

  • 然后就可以看到灰色的按钮可以进行选择了

  • 对应你的LDAP信息添入,登出登入使用ldap用户测试是否成功

关于拓展

NFS存在性能问题所以最好生产上不要去使用推荐的方式是使用分布式存储来解决如果觉得数据库方面还是单点则做好定时备份
寻求横向扩展数据库主备等来使用

  • NFS切换cephFS流程
      1. 停止所有环境的推送harbor-register任务
      1. 停止harbor所有容器
      1. umount卸载所有的NFS挂载
      1. 确保nfs资源同步CephFS资源
      1. 挂载CephFS客户端(最好基于内核态挂载)
      1. 启动先关容器,注意配置文件的路径是否需要更新
      1. 检查功能是否完整日志是否有错误
      1. 更新完成

发表评论

电子邮件地址不会被公开。 必填项已用*标注