一种通过初始化容器来加载应急补丁的方法技术

技术编号:34790391 阅读:18 留言:0更新日期:2022-09-03 19:53
本发明专利技术公开了一种通过初始化容器来加载应急补丁的方法,该方法包括以下步骤:S1、根据用户请求,使用注解标识应用需要替换的Class文件;S2、利用Kubernetes在资源对象创建时触发回调服务;S3、所述回调服务根据注解信息,修改资源对象的描述定义信息,增加初始化容器;S4、Kubernetes完成修订后的资源对象的创建,并调度容器实例到具体节点上运行;S5、运行时先启动初始化容器,所述初始化容器将所述Class文件更新到Jar包中;S6、所述原容器正常启动,加载修改后的Jar包并运行。本发明专利技术实现Class文件自动化更新,无须修改容器的启动逻辑、制作容器镜像,实现快速的版本更新。实现快速的版本更新。实现快速的版本更新。

【技术实现步骤摘要】
一种通过初始化容器来加载应急补丁的方法


[0001]本专利技术涉及DevOps领域,具体来说,涉及一种通过初始化容器来加载应急补丁的方法。

技术介绍

[0002]在软件交付过程中,很多场景都需要通过替换Java应用中的Class文件来实现版本更新,比如:生产系统发现一个紧急的缺陷,需要尽快修复。如果更新整个版本或者重新构建所有Jar包文件,可能会引入很多未经充分验证的变更,因此为了控制变更范围,最安全的方案就是只更新这一处代码逻辑所属的Class文件。另外,在研发和交付分处异地的场景下,如果每次都全部重新打包、测试、发布容器镜像,不但整个流程非常长,而且因为发布包非常大,沟通和传输时间长,无法满足快速修复缺陷的时效要求。
[0003]目前越来越多的应用采用容器化的方式进行交付,并普遍使用容器编排引擎来管理应用,目前最为主流的容器平台是Kubernetes,利用Kubernetes来实现自动化的部署和运维。与传统的虚拟机部署方式相比,容器平台实现了自动化的资源调度,提高了运维效率,但是也让一些传统运维手段无法再使用,比如传统方式下,如果我们需要替换某个Java应用的Class文件,可以直接登录到虚拟机中直接停止进程,修改Jar文件,然后再启动。但是容器交付模式下,容器是动态调度的,容器内文件的修改是易失的,如果直接修改文件,当重启进程生效修改时会造成容器重建,修改内容会被重置,无法实现替换Class文件的目标。为了解决这个问题,现有的容器化Java应用实现Class文件替换的方法有:1) 重新制作镜像。主要原理是从原镜像中下载Jar文件,将Class合入后再制作成新的镜像文件,并升级新的镜像文件。这种方案有如下问题,首先需要在现场部署容器镜像制作平台,并管理镜像仓库授权等,需要额外占用资源,流程长,耗时长,同时由于重新制作了镜像,也存在变更范围蔓延的风险。同时如果有多个版本的容器镜像,每个版本都需要全部制作一遍,否则版本升级或者回滚时会冲掉原来的修改内容,并且需要通知容器镜像所有的相关方,所有版本更新必须先合入这个Class后再做升级。可以看出这个方法比较复杂,并且协作较多,变更容易被遗漏。
[0004]2) 修改容器,在进程启动前进行文件下载和替换。这种方法无须重新制作镜像,而是在容器中放入一个专门的程序(通常是一个脚本),并修改容器启动命令,容器启动后先执行这个脚本,在脚本中从外部存储拉取Class文件,然后合入到Jar文件中,然后再启动原来的Java进程。这种方式在进程启动之前进行替换,无须重新制作镜像,但是这个方法对容器启动逻辑有侵入性修改,需要提前埋入脚本,解决存活探针失效问题,不具备通用性。
[0005]3) 在进程运行过程中通过热更新方式进行Class替换。在Java程序运行时,利用JVM本身提供的热更新能力,在不停进程的情况下直接进行替换。但是这种方法只能支持方法级修改等非常窄的场景,无法满足项目的需要。
[0006]这些方法都存在一些缺陷,也没有充分利用Kubernetes本身能力,因此并非Kubernetes平台上应用加载Class的最优方案,需要提出了一种充分利用Kubernetes的扩
展能力来实现的更优的Java应用替换Class文件方案。
[0007]针对相关技术中的问题,目前尚未提出有效的解决方案。

技术实现思路

[0008]针对相关技术中的问题,本专利技术提出一种通过初始化容器来加载应急补丁的方法,以克服现有相关技术所存在的上述技术问题。
[0009]为此,本专利技术采用的具体技术方案如下:一种通过初始化容器来加载应急补丁的方法,该方法包括以下步骤:S1、根据用户请求,使用注解标识应用需要替换的Class文件;S2、利用Kubernetes在资源对象创建时触发回调服务;S3、所述回调服务根据注解信息,修改资源对象的描述定义信息,增加初始化容器,并返回修订内容至Kubernetes;S4、Kubernetes完成修订后的资源对象的创建,并调度容器实例到具体节点上运行;S5、运行时先启动初始化容器,所述初始化容器将所述Class文件更新到Jar包中,并覆盖原容器中的原始Jar包;S6、所述原容器正常启动,加载修改后的Jar包并运行。
[0010]进一步的,所述根据用户请求,使用注解标识应用需要替换的Class文件,包括以下步骤:S11、根据应用的创建或更新请求,在最小修改范围内修改Java代码实现相应功能,并将修改后的Java文件编译成对应的Class文件;S12、利用Kubernetes的Configmap对象来存放所述Class文件以及对应的Jar包路径和类路径信息;S13、修订Kubernetes平台上部署的应用Workload对象的描述,在其内部Pod对象的元数据字段增加一个注解,并将值设定为Configmap资源对象名。
[0011]进一步的,所述利用Kubernetes在资源对象创建时触发回调服务,包括以下步骤:S21、通过新增Kubernetes的MutatingWebhookConfiguration在Kubernetes平台中新增一个动态准入控制策略;S22、所述动态准入控制策略在Kubernetes创建Pod资源时自动触发一个准入控制器插件的回调服务。
[0012]进一步的,所述Kubernetes采用滚动更新的方式逐步更换Pod实例。
[0013]进一步的,所述回调服务根据注解信息,修改资源对象的描述定义信息,增加初始化容器,并返回修订内容至Kubernetes,包括以下步骤:S31、当接收到Kubernetes的回调请求后,从参数中获取应用的Pod资源对象的描述定义信息;S32、判断所述描述定义信息中元数据字段是否存在需要更新Class文件的注解,如果不存在,则直接返回结束;S33、如果存在需要更新Class文件的注解,根据注解的值找到对应的Configmap信息;
S34、根据所述Configmap信息,向Pod对象中增加一个初始化容器,同时初始化容器的入口程序替换为更新Class文件的脚本,并挂载至Configmap;S35、根据所述Configmap信息,向Pod对象增加一个共享卷,并将共享卷同时挂载到初始化容器和原容器中;S36、将Pod资源描述的修订内容返回给Kubernetes完成资源对象的编辑。
[0014]进一步的,所述Configmap信息包括存放的Class文件以及路径和类路径信息。
[0015]进一步的,所述初始化容器通过使用与原容器相同的容器镜像创建得到。
[0016]进一步的,所述运行时先启动初始化容器,所述初始化容器将所述Class文件更新到Jar包中,并覆盖原容器中的原始Jar包,包括以下步骤:S51、利用初始化容器读取原容器的文件,并在原文件基础上进行增量修改;S52、所述初始化容器通过卷挂载的方式将Class文件信息挂载到初始化容器中;S53、利用所述初始化容器将Jar文件放置到共享卷中;S54、将所述共享卷同时挂载到所述初始化容器和原容器,并本文档来自技高网
...

【技术保护点】

【技术特征摘要】
1.一种通过初始化容器来加载应急补丁的方法,其特征在于,该方法包括以下步骤:S1、根据用户请求,使用注解标识应用需要替换的Class文件;S2、利用Kubernetes在资源对象创建时触发回调服务;S3、所述回调服务根据注解信息,修改资源对象的描述定义信息,增加初始化容器,并返回修订内容至Kubernetes;S4、Kubernetes完成修订后的资源对象的创建,并调度容器实例到具体节点上运行;S5、运行时先启动初始化容器,所述初始化容器将所述Class文件更新到Jar包中,并覆盖原容器中的原始Jar包;S6、所述原容器正常启动,加载修改后的Jar包并运行。2.根据权利要求1所述的一种通过初始化容器来加载应急补丁的方法,其特征在于,所述根据用户请求,使用注解标识应用需要替换的Class文件,包括以下步骤:S11、根据应用的创建或更新请求,在最小修改范围内修改Java代码实现相应功能,并将修改后的Java文件编译成对应的Class文件;S12、利用Kubernetes的Configmap对象来存放所述Class文件以及对应的Jar包路径和类路径信息;S13、修订Kubernetes平台上部署的应用Workload对象的描述,在其内部Pod对象的元数据字段增加一个注解,并将值设定为Configmap资源对象名。3.根据权利要求2所述的一种通过初始化容器来加载应急补丁的方法,其特征在于,所述利用Kubernetes在资源对象创建时触发回调服务,包括以下步骤:S21、通过新增Kubernetes的MutatingWebhookConfiguration在Kubernetes平台中新增一个动态准入控制策略;S22、所述动态准入控制策略在Kubernetes创建Pod资源时自动触发一个准入控制器插件的回调服务。4.根据权利要求3所述的一种通过初始化容器来加载应急补丁的方法,其特征在于,所述Kubernetes采用滚动更新的方式逐步更换Pod实例。5.根据权利要求4所述的一种通过初始化容器来加载应急补丁的方法,其特征在于,所述回调服务根据注解信息,修改资源对象的描述定义信息,增加初始化容器,并返回修订内容至Kubernetes,包括以下步骤:S31、当接收到Kubernetes的回调请求后,从参数中获取应用的Pod资源对象的描述...

【专利技术属性】
技术研发人员:鲍钟峻王玉木
申请(专利权)人:浩鲸云计算科技股份有限公司
类型:发明
国别省市:

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1