由于之前在生产环境出现了一次harbor的事故,因此考虑harbor升级,升级到1.5.1,但是看了官方文档只支持1.2.x,1.3.x,1.4.x的,只好自己升级了
之前的问题主要是ui模块并发修改pull的次数引起panic,以及ui程序启动时同步数据到mysql时同步不完全引起的,也涉及到了存储的问题,关于docker storage请,更多信息请前往docker storage
问题涉及到的函数
ui模块的main.go
initRouters()
//if err := api.SyncRegistry(); err != nil {
// log.Error(err)
//}
beego.Run()
ui service notification.go模块的函数
if action == "pull" {
//go func() {
// log.Debugf("Increase the repository %s pull count.", repository)
// if err := dao.IncreasePullCount(repository); err != nil {
// log.Errorf("Error happens when increasing pull count: %v", err)
// }
//}()
}
以上问题引起ui服务不断地重启,导致harbor无法使用,因此考虑了升级harbor,但是猜想不会根本解决问题
升级步骤
1.同步数据库的数据
2.同步镜像仓库的镜像
3.修改代码(需要特别功能)
同步数据库的数据
对比了相关的数据表结构
1.5.1的数据库表结构在harbor项目下的make/photon/db
目录下,1.1.1的数据库表结构在make/common/db
目录下,
harbor 1.1.1的mysql数据库表结构
harbor1.5.1的数据库表结构目录
对比了数据结构,发现了以下不同点
DROP TABLE IF EXISTS `access_log`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `access_log` (
`log_id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) NOT NULL, /*之前是user_id 现在改为username*/
`project_id` int(11) NOT NULL,
`repo_name` varchar(256) DEFAULT NULL,
`repo_tag` varchar(128) DEFAULT NULL,
`GUID` varchar(64) DEFAULT NULL,
`operation` varchar(20) NOT NULL,
`op_time` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`log_id`),
KEY `pid_optime` (`project_id`,`op_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
新增表
clair_vuln_timestamp harbor_label harbor_resource_label img_scan_job img_scan_overview user_group
保持一样的表
alembic_version role user
项目project
表少了个public
的字段
DROP TABLE IF EXISTS `project`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `project` (
`project_id` int(11) NOT NULL AUTO_INCREMENT,
`owner_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL,
`creation_time` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`update_time` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`deleted` tinyint(1) NOT NULL DEFAULT 0, /*少了public,跟新增的表project_metadata结合在一起了*/
PRIMARY KEY (`project_id`),
UNIQUE KEY `name` (`name`),
KEY `owner_id` (`owner_id`),
CONSTRAINT `project_ibfk_1` FOREIGN KEY (`owner_id`) REFERENCES `user` (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
project_member表修改user_id 为entity_id,新增entity_type字段,字段的值有u
以及g
DROP TABLE IF EXISTS `project_member`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `project_member` (
`id` int(11) NOT NULL AUTO_INCREMENT,/*多了id这个字段*/
`project_id` int(11) NOT NULL,
`entity_id` int(11) NOT NULL, /*user_id entity_id*/
`entity_type` char(1) NOT NULL,/*实体类型 u*/
`role` int(11) NOT NULL,/*admin 1 开发人员2 访客3*/
`creation_time` timestamp NOT NULL DEFAULT current_timestamp(),
`update_time` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `unique_project_entity_type` (`project_id`,`entity_id`,`entity_type`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;
另外这张表properties也用了,主要存相关的配置信息以及配置的密码
这张新增的表replication_immediate_trigger
,主要针对同步规则时,选择的时立即同步而设计的
replication_job 表多了个job_uuid
字段
replication_policy多了cron_str,filters,replicate_deletion这三个字段,另外harbor1.5.1还添加了过滤功能
相关功能如下图
replication_target 表多了insecure字段,用来区分是否校验同步目标仓库的证书开关
repository 仓库表少了owner_id
字段
通过比较以上harbor1.1.1和harbor1.5.1的表数据结构的改变情况,本人写了相关的同步数据的code,github地址:https://github.com/qinzhao168/harbor_upgrade
进到项目,配置好数据库运行go run main.go
就可以同步了
这一部分是同步数据,接下来的另一编写部署的注意事项