harbor被扫出了漏洞,需要升级新版本

正好也想看看有没有新功能,借此机会升级下

其实harbor官网的相关文档非常详细了,跟着说明,基本都是无脑操作

官网地址:https://goharbor.io/docs/2.8.0/administration/upgrade/

根据文档介绍得知:harbor的升级策略是隔两个版本升级

从官网得知升级路线为: v1.10.x   -->  v2.4.0  -->   v2.6.0  --> v2.8.0

我的版本是v2.1.0 依次升级三个版本

我这里采用离线包的升级方式,离线包的下载地址为:https://github.com/goharbor/harbor/releases

找到对应的版本,在assets里面就能下载

下载地址:

https://github.com/goharbor/harbor/releases/download/v2.4.0/harbor-offline-installer-v2.4.0.tgz      # harbor-V2.4.0
https://github.com/goharbor/harbor/releases/download/v2.6.0/harbor-offline-installer-v2.6.0.tgz      # harbor-V2.6.0  
https://github.com/goharbor/harbor/releases/download/v2.8.0/harbor-offline-installer-v2.8.0.tgz # harbor-V2.8.0

 

升级步骤:

1.进入harbor安装目录,关闭harbor

这里的 down 不仅关闭,也删除了旧harbor容器

cd harbor
docker-compose down

2.备份harbor当前目录,便于回滚

cd ..
mkdir -p
/my_backup_dir
mv harbor /my_backup_dir/harbor

3.备份数据库,默认情况下为 /data/database,是否为默认地址可以查看harbor.yml 配置文件

cp -r /data/database /my_backup_dir/

4.上传解压harbor离线安装包,并用docker load -i 加载

把harbor离线安装包上传到之前harbor安装目录的上层目录,之后解压

tar zxf <offline package>
docker image load -i harbor/harbor.[version].tar.gz

5.复制配置文件,并升级

这里要好好说明下,harbor所有配置全部在harbor.yml 里面配置,包括日志路径,登陆密码,连接地址,数据库密码,ssl配置,trivy安全扫描等

你想要了解的所有细节全在里面,这个文件要仔细看看

还有如果升级版本跨度过大,还是推荐用新配置文件,然后从旧配置文件中提取关键参数,逐个替换的方式,这样配置最全

当然如果升级失败,harbor升级是由harbor-core来负责,可以查看harbor-core的日志

从harbor.yml可以看出,日志路径为  /var/log/harbor/core.log

#进入harbor安装目录(解压后的目录)
cd /harbor
#复制模板文件
cp harbor.yml.tmpl  harbor.yml
#按备份完旧文件的参数逐个修改
cat /my_backup_dir/harbor/harbor.yml
vi harbor.yml
运行初始化命令
docker run -it --rm -v /:/hostfs goharbor/prepare:v2.4.0 migrate -i /harbor安装目录/harbor.yml

执行完这步后,会在 /harbor安装目录/common/config 生成配置文件 

 

6.在安装目录,执行安装命令

./install.sh

install.sh脚本包含了:docker load、./prepare、docker-compose up -d3个命令。 

 

 

回滚步骤类似,可以参考官方文档:https://goharbor.io/docs/2.4.0/administration/upgrade/roll-back-upgrade/

 

至此升级了一个版本,后面按相同步骤依次升级到2.6和2.8即可

 

升级过程中遇到的问题:

当执行最后安装命令时报错

error while removing network: network harbor_harbor id 144d9ccaeacd8d0135c5a459b03a0668891ffee9a2a74ad0a88d7dda41844660 has active endpoints

 

 

这个报错是说 harbor_harbor 网络仍然在活动,不能删除

本来找到一篇文章,感觉很合理,解除和他关联的容器不就不活动了嘛

https://blog.csdn.net/catoop/article/details/103463007

docker network ls
docker network inspect harbor_harbor
docker network disconnect -f harbor_harbor harbor-core

执行到第二步傻眼了,我这根本就没关联上容器啊

 

百思不得其解,docker network rm 手动删除也报同样的错

后来抱着死马当活马医的想法,重启一下docker试试,最后解决了

systemctl restart docker

 

所以,重启yyds

 

参考文档:

https://www.cnblogs.com/kdsmyhome/articles/16735621.html

https://blog.csdn.net/qq_44749491/article/details/128682105

事后还找到一个相同处理思路的文章,记录下

https://blog.csdn.net/wangerzheng/article/details/128382840

 

 harbor基础知识

以下转自:https://segmentfault.com/a/1190000044449824

修改配置

将harbor.yml.tmpl文件复制为 harbor.yml
修改几个重要的配置:

# 配置认证服务地址,认证服务在docker客户端首次访问时,由harbor返回给docker客户端使用。
external_url: http://myserver.com

# 这个属性也用来确定认证服务地址,如果已配置external_url属性,则这个属性被忽略;否则认证地址为:http://hostname:port
# 如果已配置external_url属性,那么这里如果配置了ip地址、并且harbor的主机ip已变化,也无须处理。
# 否则需要重新执行 ./prepare来处理harbor主机ip的变化
hostname: myserver

# 我们这里仅使用http协议
http:
  # 这里的端口有两个作用,1、为harbor前端代理nginx的服务端口,也即整个服务的对外端口。
  # 作用2:如果没有配置external_url属性,那么harbor认证服务地址由 hostname+此处的port两个属性决定。
  # 这就意味着,如果外网映射域名后的端口(比如80)和harbor内网端口(比如9000)不一致的话,必须借助external_url来配置。 
  port: 9000

# 暂时注释掉https相关内容

#https:
  #port: 443
  #certificate: /your/certificate/path
  #private_key: /your/private/key/path

# 指定harbor的admin密码,当harbor初次启动后,harbor的admin密码被加密存储到postgre数据库中,后续修改此处的密码是无效的。
# 要修改admin密码,除了通过控制台修改以外,修改配置文件需要下面步骤:
# 修改docker-compose文件中:postgresql服务的端口导出:如ports: -5432:5432(5432是harbor postgresql的缺省端口)
# 使用任意客户端工具连接postgresql数据库,数据库缺省密码为 postgres / root123,数据库:registry
# 更新密码:update harbor_user set password='',salt='' where username='admin'
# 然后重新执行 ./prepare,再启动即可:docker-compose up -d
harbor_admin_password: 123456

# 指定数据存储路径
data_volume: /home/apps/harbor/data

log:
  local:
    # 日志存储路径
    location: /home/apps/harbor/log

 

 

生成harbor各服务的配置文件

执行命令 ./prepare

启动harbor

执行命令 docker-compose up -d 或者 ./install.sh也一样。
install.sh脚本包含了:docker load、./prepare、docker-compose up -d3个命令。

docker客户端访问

因为我们没有为harbor配置 https 相关证书内容。所以需要为 docker客户端配置 “非安全的仓库地址”。 找到/etc/daemon.json文件,添加以下内容:

{
    "registry-mirrors": [
        "https://hub-mirror.c.163.com"
    ],
    "insecure-registries": [
        "10.1.27.89:9000"
    ]
}

特别注意:

  • json文件中的 逗号,不要多也不要少
  • /etc/daemon.json文件的换行符应该为 linux环境的“\n”,而不是windows环境的“\r\n”

修改完daemon.json配置后,客户端需要重启docker:

systemctl daemon-reload
systemctl restart docker

问题1 - harbor主机ip变化

如果harbor的认证服务地址我们是通过 external_url 配置的,那么harbor主机ip地址变化时,无须对harbor配置进行调整。
否则,如果hostname配置的是 域名,那么也无须对harbor配置进行调整。
否则,如果hostname配置的是内网ip,那么就需要更改harbor配置中的hostname属性。
然后执行下面命令:

docker-compose down
./prepare
docker-compose up -d

客户端如果时通过内网ip来访问 harbor的话,也需要同时修改 daemon.json文件配置,并重启docker

 

这里有一个情况要说明下

如果想要外网访问harbor

# 因为harbor采用了登陆和token分离的方式, 所以公网docker login时token会返回你的子网Harbor机器IP,导致报错如下:
Error response from daemon: Get "http://119.26.88.210:20061/v2/": Get "http://10.1.1.60/service/token?account=admin&client_id=docker&offline_token=true&service=harbor-registry": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

# 此时需要配置harbor的external_url, 需要把此值写为公网访问的地址+端口(80不用写)
vim harbor.yml
# 找到如下位置, 取消external_url的注释, 添加公网地址
===============yaml文件内容如下===============
# Uncomment external_url if you want to enable external proxy
# And when it enabled the hostname will no longer used
external_url: http://119.26.88.210:20061

# 保存退出后, 需要清空harbor配置, 重新使配置生效
rm -rf ./common/config #每次修改配置后必须删除安装目录下这个文件夹
bash install.sh #重新安装即更新配置

# 再次登陆harbor就正常了

 

这里,external_url是控制harbor返回给你的token校验的地址,如果配成外网域名或ip,则内网登陆会报错

如果不配置,则用hostname地址作为token校验地址返回,hostname如果配置的是内网ip,则外网访问会报错,网络超时

所以想要harbor既在内网又在外网使用,配置起来是比较麻烦的:

hostname只能配置成域名,内网通过内网dns或者本地hosts的方式指向内网ip,外网则通过外网dns指向外网ip

参考文档:

https://www.cnblogs.com/zhaolongisme/p/17215134.html

https://blog.csdn.net/Skywin88/article/details/112370239

 

 

问题2 - 重置harbor的admin密码

harbor的admin密码存储在 postgresql数据库中。如果忘记密码的话,可以使用SQL客户端连接postgre数据库,删除admin密码即可。

具体步骤:

  • 停止harbor服务:docker-compose down
  • 修改docker-compose文件中:postgresql服务的端口导出:如ports: -5432:5432(5432是harbor postgresql的缺省端口)
  • 重启harbor:docker-compose up -d
  • 使用任意客户端工具连接postgresql数据库,数据库缺省密码为 postgres / root123,数据库:registry
  • 更新密码:update harbor_user set password='',salt='' where username='admin'
  • 再次停止harbor服务:docker-compose down
  • 修改harbor.yml文件中登录密码
  • 重新生成配置文件 ./prepare
  • 再次重启harbor:docker-compose up -d

 

docker 基础知识补充2:https://cloud.tencent.com/developer/article/1718372

posted on 2023-09-23 19:59  06  阅读(820)  评论(0编辑  收藏  举报