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 -d
3个命令。
回滚步骤类似,可以参考官方文档: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 -d
3个命令。
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