CN118193354A - 云原生应用的代码插桩方法、装置、存储介质和计算设备 - Google Patents
云原生应用的代码插桩方法、装置、存储介质和计算设备 Download PDFInfo
- Publication number
- CN118193354A CN118193354A CN202310867722.6A CN202310867722A CN118193354A CN 118193354 A CN118193354 A CN 118193354A CN 202310867722 A CN202310867722 A CN 202310867722A CN 118193354 A CN118193354 A CN 118193354A
- Authority
- CN
- China
- Prior art keywords
- service
- image
- operation request
- resource
- code
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
- 238000000034 method Methods 0.000 title claims abstract description 63
- 238000003860 storage Methods 0.000 title claims abstract description 36
- 230000006870 function Effects 0.000 claims description 104
- 230000004044 response Effects 0.000 claims description 29
- 239000003795 chemical substances by application Substances 0.000 claims description 20
- 238000002347 injection Methods 0.000 claims description 11
- 239000007924 injection Substances 0.000 claims description 11
- 230000008569 process Effects 0.000 claims description 10
- 238000005538 encapsulation Methods 0.000 claims description 7
- 238000012360 testing method Methods 0.000 description 15
- 238000013475 authorization Methods 0.000 description 10
- 238000010586 diagram Methods 0.000 description 8
- 238000012545 processing Methods 0.000 description 8
- 238000004458 analytical method Methods 0.000 description 6
- 239000008186 active pharmaceutical agent Substances 0.000 description 4
- 239000000306 component Substances 0.000 description 4
- 238000007726 management method Methods 0.000 description 4
- 230000008901 benefit Effects 0.000 description 3
- 238000006243 chemical reaction Methods 0.000 description 3
- 238000001514 detection method Methods 0.000 description 3
- 238000005516 engineering process Methods 0.000 description 3
- 230000003287 optical effect Effects 0.000 description 3
- 230000001960 triggered effect Effects 0.000 description 3
- 230000006399 behavior Effects 0.000 description 2
- 230000007246 mechanism Effects 0.000 description 2
- 238000012986 modification Methods 0.000 description 2
- 230000004048 modification Effects 0.000 description 2
- 239000013307 optical fiber Substances 0.000 description 2
- 230000000644 propagated effect Effects 0.000 description 2
- 238000003491 array Methods 0.000 description 1
- 230000005540 biological transmission Effects 0.000 description 1
- 238000004891 communication Methods 0.000 description 1
- 238000004590 computer program Methods 0.000 description 1
- 239000008358 core component Substances 0.000 description 1
- 238000012217 deletion Methods 0.000 description 1
- 230000037430 deletion Effects 0.000 description 1
- 238000003780 insertion Methods 0.000 description 1
- 230000037431 insertion Effects 0.000 description 1
- 238000004519 manufacturing process Methods 0.000 description 1
- 238000012544 monitoring process Methods 0.000 description 1
- 238000004806 packaging method and process Methods 0.000 description 1
- 238000005192 partition Methods 0.000 description 1
- 230000002085 persistent effect Effects 0.000 description 1
- 238000002360 preparation method Methods 0.000 description 1
- 238000009420 retrofitting Methods 0.000 description 1
- 239000004065 semiconductor Substances 0.000 description 1
- 230000001131 transforming effect Effects 0.000 description 1
- 238000010200 validation analysis Methods 0.000 description 1
Classifications
-
- G—PHYSICS
- G06—COMPUTING; CALCULATING OR COUNTING
- G06F—ELECTRIC DIGITAL DATA PROCESSING
- G06F11/00—Error detection; Error correction; Monitoring
- G06F11/36—Preventing errors by testing or debugging software
- G06F11/362—Software debugging
- G06F11/3624—Software debugging by performing operations on the source code, e.g. via a compiler
Landscapes
- Engineering & Computer Science (AREA)
- Theoretical Computer Science (AREA)
- Computer Hardware Design (AREA)
- Quality & Reliability (AREA)
- Physics & Mathematics (AREA)
- General Engineering & Computer Science (AREA)
- General Physics & Mathematics (AREA)
- Stored Programmes (AREA)
Abstract
本公开的实施方式提供了一种云原生应用的代码插桩方法、装置、存储介质和计算设备。所述方法包括:接口服务器接收针对云原生应用的资源操作请求;准入控制器确定所述资源操作请求携带的操作参数与所述准入控制器中配置的参数标签的匹配结果;响应于所述匹配结果为匹配,拦截所述资源操作请求,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务;所述钩子函数服务基于封装的插桩逻辑,将待插桩的代码注入所述云原生应用。
Description
技术领域
本公开的实施方式涉及计算机技术领域,更具体地,本公开的实施方式涉及一种云原生应用的代码插桩方法、装置、存储介质和计算设备。
背景技术
本部分旨在为说明书中陈述的本公开的实施方式提供背景或上下文。此处的描述不因为包括在本部分中就承认是现有技术。
云原生(Cloud Native)是一种软件开发和部署的技术。旨在充分利用云计算环境的优势,为应用程序提供高效、弹性和可扩展的交付和管理方式。云原生应用就是基于云原生技术设计和构建的应用程序,相对于传统应用程序,云原生应用可以更好地适应云计算的环境。
在某些场景中,需要对云原生应用进行代码插桩,以基于插桩的代码实现对云原生应用的功能扩展。例如,在测试场景下,可以通过代码插桩的方式,统计云原生应用的代码覆盖率。
在相关技术中,代码插桩需要用户手动修改云原生应用相关的文件配置。例如,用户可以手动修改云原生应用的镜像文件,以在镜像文件中添加代码以及触发执行该代码的启动命令。
发明内容
在本公开实施方式的第一方面中,提供了一种云原生应用的代码插桩方法。应用于容器编排平台,所述容器编排平台中包括接口服务器和准入控制器;所述方法包括:
接口服务器接收针对云原生应用的资源操作请求;
准入控制器确定所述资源操作请求携带的操作参数与所述准入控制器中配置的参数标签的匹配结果;
响应于所述匹配结果为匹配,拦截所述资源操作请求,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务;
所述钩子函数服务基于封装的插桩逻辑,将待插桩的代码注入所述云原生应用。
可选的,所述钩子函数服务包含有业务镜像的启动配置,以及预先部署的基础镜像;
所述钩子函数服务基于封装的插桩逻辑,将代码注入到所述云原生中,包括:
所述钩子函数服务基于基础镜像中封装的插桩逻辑,将所述业务镜像的启动配置注入到所述资源操作请求,并将所述资源操作请求返回给所述接口服务器;
所述接口服务器响应于所述钩子函数服务返回的资源操作请求,完成对所述云原生应用的资源对象操作;以使所述云原生所在的虚拟机运行所述资源对象时,基于注入的所述启动配置获取业务镜像并执行所述业务镜像中的基于Java代理的业务代码。
可选的,在将所述业务镜像的启动配置注入到所述资源操作请求之前,还包括:
下载并解压业务镜像,将业务镜像挂载到所述云原生应用的业务容器的共享目录。
可选的,所述启动配置包括所述业务镜像的镜像下载配置和启动参数变量;
所述基于注入的所述启动配置获取业务镜像并执行所述业务镜像中的基于Java代理的业务代码,包括:
基于注入的镜像下载配置下载对应的业务镜像,并在启动所述云原生应用的业务容器时,通过类加载器触发所述启动参数变量,以将所述业务镜像中的基于Java代理的业务代码插入到所述业务容器中。
可选的,所述下载配置包括业务镜像存储在镜像仓库的存储地址、存储密钥和所述业务镜像的镜像名称。
可选的,所述准入控制器确定所述资源操作请求携带的操作参数与所述准入控制器中配置的参数标签的匹配结果,包括:
准入控制器将所述操作参数与第一标签选择器中的命名空间标签进行第一匹配;以及,
将所述操作参数与第二标签选择器中的资源对象标签进行第二匹配;
响应于第一匹配和第二匹配均匹配成功,将最终的匹配结果确定为匹配。
可选的,所述接口服务器响应于所述钩子函数服务返回的资源操作请求,还包括:
开放所述业务容器的端口;以供注入到所述云原生应用中的业务代码通过所述端口将执行过程中生成的数据转储到所述业务容器。
可选的,所述业务代码用于统计所述云原生应用对应的源代码的代码覆盖率。
可选的,所述业务代码包括Jacoco代码。
可选的,所述容器编排平台包括kubernetes集群;所述资源操作请求,包括pod的操作请求或deployment的操作请求。
可选的,所述钩子函数服务基于基础镜像中封装的插桩逻辑,将所述业务镜像的启动配置注入到所述资源操作请求,包括:
所述钩子函数服务对所述资源操作请求的请求体进行解析,基于解析结果反向编码出所述请求体中的目标资源对象的资源信息;其中,所述目标资源对象为所述资源操作请求指定的资源对象;
响应于所述资源信息不为空,获取并解析所述业务镜像的启动配置;
响应于启动配置不为空,将所述业务镜像的启动配置转换为JSONPatch类型的byte数据,并将所述byte数据作为响应体拼接回所述资源操作请求。
可选的,在将所述业务镜像的启动配置转换为JSONPatch类型的byte数据之前,还包括:
在所述目标资源对象中添加所述启动配置以及资源配置;
所述将所述业务镜像的启动配置转换为JSONPatch类型的byte数据,包括:
将所述启动配置的配置内容和资源配置的配置内容转换为JSONPatch类型的byte数据。
可选的,所述资源配置的配置内容包括以下一种或几种的组合:
初始化容器规则、共享目录规则、目录挂载规则、端口规则。
可选的,所述钩子函数服务通过以下方式部署:
创建钩子函数服务,为所述钩子函数服务添加业务镜像的启动配置和基础镜像;
通过接口服务器为所述钩子函数服务封装函数调用接口;
所述将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务,包括:
通过所述函数调用接口,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务。
可选的,还包括:
为管理所述钩子函数服务的接口服务器添加认证鉴权配置;
在接口服务器接收针对云原生应用的资源操作请求之后,还包括:
所述接口服务器基于所述认证鉴权配置对所述资源操作请求进行认证鉴权;
响应于通过所述认证鉴权,将所述资源操作请求传输到所述准入控制器。
在本公开实施方式的第二方面中,提供了一种云原生应用的代码插桩装置,应用于容器编排平台,所述容器编排平台中包括接口服务器和准入控制器;所述装置包括:
接收单元,接口服务器接收针对云原生应用的资源操作请求;
确定单元,准入控制器确定所述资源操作请求携带的操作参数与所述准入控制器中配置的参数标签的匹配结果;
拦截单元,响应于所述匹配结果为匹配,拦截所述资源操作请求,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务;
插桩单元,所述钩子函数服务基于封装的插桩逻辑,将待插桩的代码注入所述云原生应用。
可选的,所述钩子函数服务包含有业务镜像的启动配置,以及预先部署的基础镜像;
所述插桩单元,进一步包括:
注入子单元,所述钩子函数服务基于基础镜像中封装的插桩逻辑,将所述业务镜像的启动配置注入到所述资源操作请求,并将所述资源操作请求返回给所述接口服务器;
操作子单元,所述接口服务器响应于所述钩子函数服务返回的资源操作请求,完成对所述云原生应用的资源对象操作;
执行子单元,所述云原生所在的虚拟机运行所述资源对象时,基于注入的所述启动配置获取业务镜像并执行所述业务镜像中的基于Java代理的业务代码。
可选的,所述注入子单元在将所述业务镜像的启动配置注入到所述资源操作请求之前,还用于下载并解压业务镜像,将业务镜像挂载到所述云原生应用的业务容器的共享目录。
可选的,所述启动配置包括所述业务镜像的镜像下载配置和启动参数变量;
所述执行子单元,进一步用于,所述云原生所在的虚拟机运行所述资源对象时,基于注入的镜像下载配置下载对应的业务镜像,并在启动所述云原生应用的业务容器时,通过类加载器触发所述启动参数变量,以将所述业务镜像中的基于Java代理的业务代码插入到所述业务容器中。
可选的,所述下载配置包括业务镜像存储在镜像仓库的存储地址、存储密钥和所述业务镜像的镜像名称。
可选的,所述确定单元,进一步包括:
匹配子单元,准入控制器将所述操作参数与第一标签选择器中的命名空间标签进行第一匹配;以及,将所述操作参数与第二标签选择器中的资源对象标签进行第二匹配;
确定子单元,响应于第一匹配和第二匹配均匹配成功,将最终的匹配结果确定为匹配。
可选的,所述操作子单元在接口服务器响应于所述钩子函数服务返回的资源操作请求之后,还用于开放所述业务容器的端口;以供注入到所述云原生应用中的业务代码通过所述端口将执行过程中生成的数据转储到所述业务容器。
可选的,所述业务代码用于统计所述云原生应用对应的源代码的代码覆盖率。
可选的,所述业务代码包括Jacoco代码。
可选的,所述容器编排平台包括kubernetes集群;所述资源操作请求,包括pod的操作请求或deployment的操作请求。
可选的,所述注入子单元,进一步包括:
解析子单元,所述钩子函数服务对所述资源操作请求的请求体进行解析,基于解析结果反向编码出所述请求体中的目标资源对象的资源信息;其中,所述目标资源对象为所述资源操作请求指定的资源对象;
获取子单元,响应于所述资源信息不为空,获取并解析所述业务镜像的启动配置;
转换子单元,响应于启动配置不为空,将所述业务镜像的启动配置转换为JSONPatch类型的byte数据,并将所述byte数据作为响应体拼接回所述资源操作请求。
可选的,所述转换子单元在将所述业务镜像的启动配置转换为JSONPatch类型的byte数据之前,还用于在所述目标资源对象中添加所述启动配置以及资源配置;并且,所述将所述业务镜像的启动配置转换为JSONPatch类型的byte数据,包括:将所述启动配置的配置内容和资源配置的配置内容转换为JSONPatch类型的byte数据。
可选的,所述资源配置的配置内容包括以下一种或几种的组合:
初始化容器规则、共享目录规则、目录挂载规则、端口规则。
可选的,所述钩子函数服务通过以下子单元部署:
创建子单元,创建钩子函数服务,为所述钩子函数服务添加业务镜像的启动配置和基础镜像;
封装子单元,通过接口服务器为所述钩子函数服务封装函数调用接口;
所述拦截单元在将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务时,进一步通过所述函数调用接口,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务。
可选的,所述创建子单元,还用于为管理所述钩子函数服务的接口服务器添加认证鉴权配置;
在所述接收单元之后,还包括:
认证鉴权单元,所述接口服务器基于所述认证鉴权配置对所述资源操作请求进行认证鉴权;响应于通过所述认证鉴权,将所述资源操作请求传输到所述准入控制器。
在本公开实施方式的第三方面中,提供了一种计算机可读存储介质,包括:
当所述计算机可读存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行如前任一项所述的云原生应用的代码插桩方法。
在本公开实施方式的第四方面中,提供了一种计算设备,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述可执行指令,以实现如前任一项所述的云原生应用的代码插桩方法。
根据本公开实施方式提供的云原生应用的代码插桩方案,通过改造容器编排平台,将代码的插桩逻辑封装为接口服务器管理的钩子函数服务,以及在准入控制器中配置用于触发该钩子函数服务的参数标签;如此,当接口服务器接收到针对云原生应用的资源操作请求时,只要该资源操作请求携带的操作参数与准入控制器配置的参数标签匹配,那么就可以触发所述钩子函数服务,由所述钩子函数服务基于封装的插桩逻辑自动完成代码插桩。
附图说明
通过参考附图阅读下文的详细描述,本公开示例性实施方式的上述以及其他目的、特征和优点将变得易于理解。在附图中,以示例性而非限制性的方式示出了本公开的若干实施方式,其中:
图1示意性地示出了本公开提供的接口服务器处理请求的流程示意图;
图2示意性地示出了本公开提供的云原生应用的代码插桩方法示意图;
图3示意性地示出了本公开提供的准入控制器的示意图;
图4示意性地示出了本公开提供的部署钩子函数服务的示意图;
图5示意性地示出了本公开提供的钩子函数服务的流程示意图;
图6示意性地示出了本公开提供的介质示意图;
图7示意性地示出了本公开提供的云原生应用的代码插桩装置示意图;
图8示意性地示出了本公开提供的计算设备示意图。
在附图中,相同或对应的标号表示相同或对应的部分。
具体实施方式
下面将参考若干示例性实施方式来描述本公开的原理和精神。应当理解,给出这些实施方式仅仅是为了使本领域技术人员能够更好地理解进而实现本公开,而并非以任何方式限制本公开的范围。相反,提供这些实施方式是为了使本公开更加透彻和完整,并且能够将本公开的范围完整地传达给本领域的技术人员。
本领域技术人员知道,本公开的实施方式可以实现为一种系统、装置、设备、方法或计算机程序产品。因此,本公开可以具体实现为以下形式,即:完全的硬件、完全的软件(包括固件、驻留软件、微代码等),或者硬件和软件结合的形式。
根据本公开的实施方式,提出了一种云原生应用的代码插桩方法、计算机可读存储介质、装置和计算设备。
在本文中,需要理解的是,附图中的任何元素数量均用于示例而非限制,以及任何命名都仅用于区分,而不具有任何限制含义。
下面参考本公开的若干代表性实施方式,详细阐释本公开的原理和精神。
本公开所涉及的数据可以为经用户授权或者经过各方充分授权的数据,对数据的采集、传播、使用等,均符合国家相关法律法规要求,本公开实施方式/实施例可以互相组合。
发明概述
本公开旨在提供一种云原生应用的代码插桩方案,通过改造容器编排平台,将代码的插桩逻辑封装为接口服务器管理的钩子函数服务,以及在准入控制器中配置用于触发该钩子函数服务的参数标签;如此,当接口服务器接收到针对云原生应用的资源操作请求时,只要该资源操作请求携带的操作参数与准入控制器配置的参数标签匹配,那么就可以触发所述钩子函数服务,由所述钩子函数服务基于封装的插桩逻辑自动完成代码插桩。
在介绍了本公开的基本原理之后,下面具体介绍本公开的各种非限制性实施方式。
应用场景总览
代码插桩(Code Instrumentation)可以是指一种在应用程序中注入额外代码的技术。代码插桩可以用于收集应用程序执行过程中的信息、监测应用程序的行为或修改应用程序的逻辑。通过插入额外的代码,可以实现对应用程序的监控、调试、性能分析、安全检测等目的。
本公开可以适用于任意存在对云原生应用进行代码插桩需求的应用场景。
例如,安全检测场景,利用本公开在云原生应用中进行代码插桩,通过插入的安全检测代码可以检测云原生应用中存在的安全漏洞、恶意行为或防御措施的有效性等。
再例如,性能分析场景,利用本公开在云原生应用中进行代码插桩,通过在云原生应用的关键代码部分插入计时、统计等额外代码,可以对云原生应用的性能进行分析和优化。
再例如,调试和错误追踪场景,利用本公开在云原生应用中进行代码插桩,通过插入代码可以收集云原生应用执行过程中的调试信息,如变量的值、函数的执行路径等,从而帮助开发人员定位和解决问题。
再例如,测试覆盖率场景,利用本公开在云原生应用中进行代码插桩,通过插入的测试代码,统计云原生应用执行过程中哪些代码被覆盖,从而帮助评估测试的完整性和覆盖率。
本公开的方案可以应用在容器编排平台,通过所述容器编排平台对云原生应用进行代码插桩。其中,所述容器编排平台可以是指用于自动化部署和管理容器化应用的平台。例如Kubernetes(可以简称为K8s)、HasiCorp Nomad、Docker Swarm、Amazon ECS(ElasticContainer Service)、Apache Mesos等容器编排平台。
下面以Kubernetes为例加以说明。在Kubernetes中定义有多种资源对象例如pod、deployment等等。
其中,pod是Kubernetes的最小可部署单元。每个pod可以包含一个或多个容器。Kubernetes使用pod作为最小的可部署单位,并提供对pod的生命周期管理、自动化调度和故障恢复等操作。本公开中的云原生应用容器化后的业务容器就可以部署在pod中。
Kubernetes并不直接管理pod而是通过deployment管理pod。一个deployment可以管理一个或多个pod。deployment是Kubernetes中一种用于定义和管理容器化应用的资源对象。
接口服务器(APIServer)是Kubernetes中的核心组件之一。接口服务器管理有Kubernetes中所有资源对象的操作接口,通过接口服务器的接口(API)可以请求操作(创建、更新、删除和查询)Kubernetes中的各种资源对象。
下面请参考图1所示的接口服务器处理请求的流程示意图。
以创建deployment为例,通过接口服务器提供的资源接口请求(API Request)发起创建deployment的资源操作请求(以下称为请求)后,接口服务器中的接口处理器(APIHandler)先解析该请求从而获取请求头、请求体等信息,此时可以由接口处理器检查这些请求头、请求体的数据格式是否正确;如果正确接着对该请求进行认证鉴权(Authentication、Authorization);在通过认证鉴权后,由准入控制器(MutatingAdmission)进行准入控制流程(Admission Control),如果请求符合准入控制,则调用钩子函数服务(Webhook)执行封装的业务逻辑。本公开通过将代码的插桩逻辑封装为钩子函数服务,从而由所述钩子函数服务基于封装的插桩逻辑自动完成代码插桩。需要说明的是的是,这里的代码插桩是将代码对应镜像文件的启动配置注入到请求而不侵入云原生应用本身的内容或配置。接下来是对注入启动配置的请求进行结构校验(ObjectSchema Validation);以及进行验证式准入控制(Validating Admission),这一次准入控制只进行验证,不修改任何数据。最后将请求进行持久化存储(persistence),如存储到ETCD(kubernetes的一个高可用键值对存储系统)。在完成上述请求处理流程后接口服务器创建deployment资源。
上述准入控制是Kubernetes提供的一种安全机制。准入控制可以在资源对象被创建或修改之前拦截请求,并对拦截的请求进行验证或修改。准入控制可以用于强制执行策略、限制用户权限、防范攻击和错误等。
使用准入控制需要先启用准入控制机制并配置相应的准入控制器。通常准入控制器可以由多个独立的组件构成。这些组件根据功能和职责可以分为不同的类别,如预处理准入控制器、请求流控制准入控制器、修改式准入控制器等等。本公开中使用的准入控制器为修改式准入控制器。
Kubernetes可以通过接口服务器的命令行选项或配置文件来配置准入控制器。而每个准入控制器也可以通过Kubernetes的API来进行配置和管理。
需要注意的是,上述应用场景仅是为了便于理解本公开的精神和原理而示出,本公开的实施方式在此方面不受任何限制。相反,本公开的实施方式可以应用于适用的任何场景。
示例性方法
下面参考图2来描述根据本公开示例性实施方式的云原生应用的代码插桩的方法。可以应用于前述的容器编排平台,所述容器编排平台中包括接口服务器和准入控制器;该方法可以包括以下步骤:
步骤210,接口服务器接收针对云原生应用的资源操作请求。
步骤220,准入控制器确定所述资源操作请求携带的操作参数与所述准入控制器中配置的参数标签的匹配结果。
本实施例通过改造容器编排平台,在准入控制器中配置用于触发钩子函数服务的参数标签。
如前所示,容器编排平台可以包括kubernetes集群;所述资源操作请求,包括pod的操作请求或deployment的操作请求。
下面请结合图3所示的准入控制的示意图。图3中的准入控制器中配置有两种参数标签,分别对应第一标签选择器和第二标签选择器。其中,第一标签选择器可以包括NamespaceSelector,其可以配置命名空间标签。
第二标签选择器可以包括objectSelector,其可以配置资源对象标签。
命名空间(Namespace)是Kubernetes中的一种抽象概念,用于隔离和划分不同的应用程序或者环境。Kubernetes中的所有资源对象都必须属于某个命名空间,通过命名空间可以对Kubernetes中的资源对象进行更好的管理。
命名空间标签表示的是需要拦截的资源对象所在的命名空间。通过配置objectSelector的命名空间标签,可以对资源操作请求进行筛选;即将资源操作请求携带的操作参数中的命名空间与命名空间标签进行匹配,从而筛选出那些对该命名空间标签对应的命名空间进行操作的资源操作请求。
如果资源操作请求携带的操作参数中的命名空间命中该命名空间标签,则说明该资源操作请求可能需要拦截。但是,由于同一个命名空间允许存在不同的资源对象,因此在命名空间匹配的情况下,还需要进一步确定操作参数中的资源对象是否是需要拦截的资源对象。这就需要进一步将操作参数中的资源对象与第二标签选择器配置的资源对象标签进行匹配,如果操作参数中的资源对象命中该资源对象标签,则说明不仅是命名空间一致,而且资源对象一致,那么该资源操作请求需要进行拦截。
如图3所示,在接口服务器接收到资源操作请求后,可以由准入控制器将所述资源操作请求携带的操作参数与第一标签选择器中的命名空间标签进行第一匹配;以及,将所述操作参数与第二标签选择器中的资源对象标签进行第二匹配。
进一步,响应于第一匹配和第二匹配均匹配成功,将最终的匹配结果确定为匹配,执行后续步骤230。
步骤230,响应于所述匹配结果为匹配,拦截所述资源操作请求,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务。
继续参考图3所示,接口服务器接收到准入控制器返回的匹配结果,如果匹配结果为匹配(第一匹配和第二匹配均匹配成功),那么可以拦截资源操作请求,并将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务。
步骤240,所述钩子函数服务基于封装的插桩逻辑,将待插桩的代码注入所述云原生应用。
本实施例通过改造容器编排平台,将代码的插桩逻辑封装为接口服务器管理的钩子函数服务。
其中,所述钩子函数服务可以包含有业务镜像的启动配置,以及预先部署的基础镜像;上述步骤240,进一步可以包括:
步骤241,所述钩子函数服务基于基础镜像中封装的插桩逻辑,将所述业务镜像的启动配置注入到所述资源操作请求,并将所述资源操作请求返回给所述接口服务器;
步骤243,所述接口服务器响应于所述钩子函数服务返回的资源操作请求,完成对所述云原生应用的资源对象操作;以使所述云原生所在的虚拟机运行所述资源对象时,基于注入的所述启动配置获取业务镜像并执行所述业务镜像中的基于Java代理的业务代码。
一方面,现有代码插桩是一种侵入式插桩方案,待插桩代码是直接添加到云原生应用的源代码中。而本说明书提供的代码插桩,是将启动配置随资源操作请求注入到云原生应用的资源对象中,不影响云原生应用的源代码;因此可以实现无侵入的代码插桩。
另一方面,相对于人工进行代码插桩,本说明书提供的实施例通过钩子函数服务自动完成代码插桩,有效降低了插桩耗时。特别是在需要对大量的云原生应用进行代码插桩时,这种自动代码插桩可以有效提高插桩效率、降低插桩耗时。
再一方面,本说明书可以提供用于控制所述控制准入控制器配置的参数标签的开启或关闭的“开关”。例如,可以为参数标签设置标签状态,所述标签状态可以表示参数标签是否开启。当标签状态表示开启时,准入控制器才会将配置的参数标签与资源操作请求携带的操作参数进行匹配,并在匹配成功时,触发上述无侵入的代码插桩;而当标签状态表示关闭时,则不会触发上述无侵入的代码插桩。如此,利用“开关”来控制参数标签的开启或关闭,从而可以实现灵活开启或关闭本说明书提供的代码插桩方案,进而提高了针对云原生应用的代码插桩的易用性。
在有的实施例中,当不需要进行无侵入的代码插桩,可以删除控制准入控制器配置的参数标签;而当再次需要进行无侵入的代码插桩时,再将参数标签重新添加到准入控制器。这样也可以灵活开启或关闭本说明书提供的代码插桩方案,从而提高了针对云原生应用的代码插桩的易用性。
下面以云原生应用的测试覆盖率场景,并结合图4所示部署钩子函数服务的示意图为例,上述业务代码可以用于统计所述云原生应用对应的源代码的代码覆盖率。
图4中,统计代码覆盖率的业务代码采用的是Jacoco代码(即图4中的Jacocoagent包)。Jacoco(Java Code Coverage)是一个开源的Java代码覆盖率库,用于测量和报告代码的测试覆盖率。
准备阶段可以包括:创建业务镜像(图4中的“镜像名:jacoco-java-autoinsteumentation:1.0.2-9a61f08-multi”)、配置该业务镜像的启动配置(图4中的“配置存储对象,名称:jacoco-inject-webhook-config”)以及封装基础镜像(图4中的“镜像名:jacoco-agent-inject-webhook:2.0.2-9a61f08-multi”);该基础镜像内部封装了实现了钩子函数服务实现代码插桩逻辑。
部署阶段,钩子函数服务可以通过以下方式部署:
创建钩子函数服务,为所述钩子函数服务添加业务镜像的启动配置和基础镜像;
通过接口服务器为所述钩子函数服务封装函数调用接口;
所述将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务,包括:
通过所述函数调用接口,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务。
其中,创建的钩子函数服务为图4中的“Deployment,部署标识:jacoco-inject-webhook/qatset”;
封装的函数调用接口为图4中的“Service(服务),部署标识:jacoco-inject-webhook/qatset,port:443;targetPort:8000”。
在一示例性的实施例中,在上述步骤241将所述业务镜像的启动配置注入到所述资源操作请求之前,还可以包括:
下载并解压业务镜像,将业务镜像挂载到所述云原生应用的业务容器的共享目录。
当业务镜像存储在镜像仓库时,可以将业务镜像下载下来,并挂载到云原生应用的业务容器的共享目录,如此可以在云原生所在的虚拟机运行资源对象时,基于注入的启动配置从该共享目录中获取业务镜像并执行所述业务镜像中的基于Java代理的业务代码。
值得一提的是,现有代码插桩是一种侵入式插桩方案,这种侵入式插桩需要将云原生应用打包为镜像文件,并在镜像文件中添加插桩的代码以及触发执行该代码的启动命令。由于镜像文件体积较大,从而会占用镜像仓库更多的存储资源。
而本说明书是一种无侵入式的插桩方案,无需将云原生应用打包为镜像文件,而是单独将待插桩代码打包为业务镜像;并通过共享目录的方式,将业务镜像挂载到业务容器,进而通过注入到业务容器中的启动配置从共享目录中获取业务镜像并执行业务镜像中的插桩代码。这种方式下,由于镜像仓库只需要存储体积较小的业务镜像,因此可以降低镜像仓库存储资源的压力。
在一示例性的实施例中,所述启动配置进一步可以包括业务镜像的镜像下载配置和启动参数变量(图4中未示出)。
所述镜像下载配置可以包括业务镜像存储在镜像仓库的存储地址(如图4中“镜像仓库地址:harbor.cloud.netease.com/qztest/”)、存储密钥(如图4中“镜像推送下载密钥:xxx”)和所述业务镜像的镜像名称(如图4中“镜像名:jacoco-java-autoinsteumentation:1.0.2-9a61f08-multi”)。
所述启动参数变量可以用于在启动所述云原生应用的业务容器时,将业务镜像中的基于Java代理的业务代码插入到业务容器中。
以图4中所示的jacocoagent包为例,该启动参数变量可以为“-javaagent:/inject/jacoco/agent/jacocoagent.jar=includes=*,ou tput=tcpserver,port=XXX,address=0.0.0.0”。
其中,/inject/jacoco/agent/jacocoagent.jar表示jacocoagent的路径。includes表示覆盖率测试的范围;这里includes=*表示对云原生应用的所有代码进行覆盖率测试。output表示对外提供的服务;这里output=tcpserver表示对外提供tcp类型的服务。port表示对外提供的端口号,外部通过该端口号可以获取覆盖率测试结果;这里port=XXX表示对外提供XXX的端口号。
上述步骤243中,云原生所在的虚拟机运行所述资源对象时,基于注入的所述启动配置获取业务镜像并执行所述业务镜像中的基于Java代理的业务代码,可以包括:
基于注入的镜像下载配置下载对应的业务镜像,并在启动所述云原生应用的业务容器时,通过类加载器触发所述启动参数变量,以将所述业务镜像中的基于Java代理的业务代码插入到所述业务容器中。
当业务镜像存储在镜像仓库时,云原生所在的虚拟机运行资源对象可以基于注入的镜像下载配置从镜像仓库中下载业务镜像,然后通过类加载器触发所述启动参数变量,以将所述业务镜像中的基于Java代理的业务代码插入到所述业务容器中。
在一示例性的实施例中,创建钩子函数服务后,还可以为管理所述钩子函数服务的接口服务器添加认证鉴权配置;
如图4所示,所述认证鉴权配置可以包括“任务”:Job,部署标识:webhook-cert-setup/qatest;“服务帐号”:ServiceAccount,部署标识:webhook-cert-sa/qatest;
“集群级别命名空间内规则权限”:ClusterRoleBinding,部署标识:webhook-cert-cluster-role-binding/qatest”;“集群级别规则权限”:ClusterRole,部署标识:webhook-cert-cluster-role/qatest;以及“密钥”:Secret,部署标识:pub/qatest。
进一步,在上述步骤210之后,还可以包括:
所述接口服务器基于所述认证鉴权配置对所述资源操作请求进行认证鉴权;
响应于通过所述认证鉴权,将所述资源操作请求传输到所述准入控制器。
再结合图1,接口服务器在接收到资源操作请求之后,可以进行认证鉴权流程,此时需要根据上述认证鉴权配置,确定该资源操作请求是否符合这些配置,例如请求中的任务、服务账户、密钥是否一致,请求中的命名空间、集群是否具有操作权限。如果通过认证鉴权,接口服务器就可以将资源操作请求传输到准入控制器,由准入控制器执行准入控制流程。
回到图4中的部署阶段,在创建钩子函数服务之后,还需要进行准入控制器配置,通常可以通过MutatingWebhookConfiguration配置参数标签。针对Jacoco配置的标签选择器可以如下所示:
第一标签选择器NamespaceSelector,配置的命名空间标签为label:“jacoco-injection:enabled”;其中,jacoco-injection为命名空间标签的字段,enabled为命名空间标签的字段值。
第二标签选择器objectSelector,配置的资源对象标签为label:“language:jacoco”;其中,language为资源对象标签的字段,jacoco为资源对象标签的字段值。
假设资源操作请求携带的操作参数表示:在“jacoco-injection:enabled”的命名空间下执行修改“language:jacoco”的deployment资源对象的操作;那么准入控制器将该操作参数分别与第一标签选择器和第二标签选择器进行匹配时,由于该操作的命名空间与第一标签选择器中的命名空间标签一致,且操作的资源对象与第二标签选择器中的资源对象标签也一致;因此该准入控制器可以得出匹配成功的匹配结果。
响应于匹配结果为匹配成功,接口服务器拦截该资源操作请求,并将拦截的资源操作请求转发给对应的钩子函数服务jacoco-inject-webhook;并由该钩子函数服务基于基础镜像中封装的插桩逻辑,将jacoco agent包对应的业务镜像的启动配置注入资源操作请求。
在一示例性的实施例中,上述步骤241,进一步可以包括:
所述钩子函数服务对所述资源操作请求的请求体进行解析,基于解析结果反向编码出所述请求体中的目标资源对象的资源信息;其中,所述目标资源对象为所述资源操作请求指定的资源对象;
响应于所述资源信息不为空,获取并解析所述业务镜像的启动配置;
响应于启动配置不为空,将所述业务镜像的启动配置转换为JSONPatch类型的byte数据,并将所述byte数据作为响应体拼接回所述资源操作请求;
将所述资源操作请求返回给所述接口服务器。
下面结合图5示出的钩子函数服务的处理流程示意图,钩子函数服务在接收接口服务器转发的资源操作请求后,可以从资源操作请求中解析请求体;如果请求体中的请求头不为空,那么可以进一步反向编码出该请求体中的目标资源对象的资源信息。
一般的,资源信息可以包括对象信息(请求操作的资源对象的信息)、字段(如接口版本APIVersion等)、资源变量(如命名空间Namespace、资源名称等)。
对这些资源信息进行校验,以确定资源信息是否为空。如图5中所示,可以判断对象信息是否为空、字段是否为空、资源变量是否为空,并在对象信息、字段、资源变量均不为空时,确定反向编码出的资源信息不为空。需要说明的是图5中的判断顺序仅为示例,实际应用中可以灵活配置。
如果反向编码出的资源信息不为空,则进一步获取并解析所述业务镜像的启动配置,所述业务镜像的启动配置可以从图4中“配置存储对象”中解析出。
响应于启动配置不为空,将所述业务镜像的启动配置转换为JSONPatch类型的byte数据,并将所述byte数据作为响应体拼接回所述资源操作请求。
其中,JSONPatch是一种用于描述如何修改或更新JSON文档的格式化说明;JSONPatch类型的byte数据是指,采用JSONPatch这种数据格式的byte数据。
byte(字节)是一种基本的数据单位,byte数据通常是指8位二进制数,也就是一个byte(字节)含有8个比特。比特(Bit)是计算机中最基本的信息单位,是二进制数字系统中的最小可表示量。每个比特可以表示0或1两个状态。
由于资源操作请求中的数据是以JSONPatch类型的byte数据记录的,因此需要将启动配置也转换为相同格式,并将转换后byte数据作为响应体拼接回所述资源操作请求,从而实现将启动配置注入到资源操作请求的目的。
在一示例性的实施例中,在将所述业务镜像的启动配置转换为JSONPatch类型的byte数据之前,还包括:
在所述目标资源对象中添加所述启动配置以及资源配置;
继续结合图5所示,在配置信息不为空时,钩子函数服务会根据资源对象标签类型,做不同代码的插桩。
例如,当资源对象标签如前是“jacoco标签”时,进行jacocoagent代码的插桩逻辑;
当资源对象标签是“dump标签”时,进行采集覆盖率数据的代码的插桩逻辑;以自动采集测试代码覆盖率过程中生成的覆盖率数据。
当资源对象标签是“report标签”时,进行生成测试覆盖率报告的代码的插桩逻辑;以自动生成测试报告。
需要说明的是,上述不同代码插桩的原理是相同的。
如图5所示,不同资源对象标签下,均可以在所述目标资源对象中添加初始化容器规则、共享目录规则、目录挂载规则、启动配置和端口规则。
在添加上述规则后,进一步可以将所述启动配置的配置内容和资源配置的配置内容转换为JSONPatch类型的byte数据,将byte数据作为响应体拼接回资源操作请求后返回给接口服务器,以使接口服务器继续响应资源操作请求完成对云原生应用的资源对象操作。
由于此时资源操作请求注入了jacocoagent代码的启动配置,因此完成操作的资源对象也可以包含该启动配置。这样在后续业务容器的虚拟机运行资源对象时,会基于该启动配置自动附加Jacocoagent,以达到自动插桩的目的。
对于上述自动采集测试代码覆盖率过程中生成的覆盖率数据,上述步骤243接口服务器响应于所述钩子函数服务返回的资源操作请求,还可以包括:
开放所述业务容器的端口;以供注入到所述云原生应用中的业务代码通过所述端口将执行过程中生成的数据转储到所述业务容器。
通过开放业务容器的端口可以实现覆盖率数据的转储。转储可生成jacoco采集的覆盖率exec文件(存储代码测试覆盖率信息的二进制文件)以及进一步基于该覆盖率数据生成测试覆盖率可读报告。
示例性介质
在介绍了本公开示例性实施方式的方法之后,接下来,参考图6对本公开示例性实施方式的介质进行说明。
本示例性实施方式中,可以通过程序产品实现上述方法,如可以采用便携式紧凑盘只读存储器(CD-ROM)并包括程序代码,并可以在设备,例如个人电脑上运行。然而,本公开的程序产品不限于此,在本文件中,可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。
该程序产品可以采用一个或多个可读介质的任意组合。可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以为但不限于电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。
计算机可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。这种传播的数据信号可以采用多种形式,包括但不限于电磁信号、光信号或上述的任意合适的组合。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。
可读介质上包含的程序代码可以用任何适当的介质传输,包括但不限于无线、有线、光缆、RE等等,或者上述的任意合适的组合。
可以以一种或多种程序设计语言的任意组合来编写用于执行本公开操作的程序代码,程序设计语言包括面向对象的程序设计语言,诸如Java、C++等,还包括常规的过程式程序设计语言,诸如C语言或类似的程序设计语言。程序代码可以完全地在用户计算设备上执行、部分在用户计算设备上部分在远程计算设备上执行、或者完全在远程计算设备或服务器上执行。在涉及远程计算设备的情形中,远程计算设备可以通过任意种类的网络,包括局域网(LAN)或广域网(WAN),连接到用户计算设备,或者,可以连接到外部计算设备(例如利用因特网服务提供商来通过因特网连接)。
综上,本公开可以提供一种计算机可读存储介质,当所述计算机可读存储介质中的指令由电子设备的处理器执行时,可以使得电子设备能够执行前述云原生应用的代码插桩方法实施例。
示例性装置
在介绍了本公开示例性实施方式的介质之后,接下来,参考图7对本公开示例性实施方式的装置进行说明。
图7示意性地示出了根据本公开实施方式的一种云原生应用的代码插桩装置的框图,对应于前述图2所示的方法实施例。应用于容器编排平台,所述容器编排平台中包括接口服务器和准入控制器;所述装置包括:
接收单元710,接口服务器接收针对云原生应用的资源操作请求;
确定单元720,准入控制器确定所述资源操作请求携带的操作参数与所述准入控制器中配置的参数标签的匹配结果;
拦截单元730,响应于所述匹配结果为匹配,拦截所述资源操作请求,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务;
插桩单元740,所述钩子函数服务基于封装的插桩逻辑,将待插桩的代码注入所述云原生应用。
可选的,所述钩子函数服务包含有业务镜像的启动配置,以及预先部署的基础镜像;
所述插桩单元740,进一步包括:
注入子单元741,所述钩子函数服务基于基础镜像中封装的插桩逻辑,将所述业务镜像的启动配置注入到所述资源操作请求,并将所述资源操作请求返回给所述接口服务器;
操作子单元743,所述接口服务器响应于所述钩子函数服务返回的资源操作请求,完成对所述云原生应用的资源对象操作;
执行子单元745,所述云原生所在的虚拟机运行所述资源对象时,基于注入的所述启动配置获取业务镜像并执行所述业务镜像中的基于Java代理的业务代码。
可选的,所述注入子单元741在将所述业务镜像的启动配置注入到所述资源操作请求之前,还用于下载并解压业务镜像,将业务镜像挂载到所述云原生应用的业务容器的共享目录。
可选的,所述启动配置包括所述业务镜像的镜像下载配置和启动参数变量;
所述执行子单元745,进一步用于,所述云原生所在的虚拟机运行所述资源对象时,基于注入的镜像下载配置下载对应的业务镜像,并在启动所述云原生应用的业务容器时,通过类加载器触发所述启动参数变量,以将所述业务镜像中的基于Java代理的业务代码插入到所述业务容器中。
可选的,所述下载配置包括业务镜像存储在镜像仓库的存储地址、存储密钥和所述业务镜像的镜像名称。
可选的,所述确定单元720,进一步包括:
匹配子单元721,准入控制器将所述操作参数与第一标签选择器中的命名空间标签进行第一匹配;以及,将所述操作参数与第二标签选择器中的资源对象标签进行第二匹配;
确定子单元723,响应于第一匹配和第二匹配均匹配成功,将最终的匹配结果确定为匹配。
可选的,所述操作子单元743在接口服务器响应于所述钩子函数服务返回的资源操作请求之后,还用于开放所述业务容器的端口;以供注入到所述云原生应用中的业务代码通过所述端口将执行过程中生成的数据转储到所述业务容器。
可选的,所述业务代码用于统计所述云原生应用对应的源代码的代码覆盖率。
可选的,所述业务代码包括Jacoco代码。
可选的,所述容器编排平台包括kubernetes集群;所述资源操作请求,包括pod的操作请求或deployment的操作请求。
可选的,所述注入子单元741,进一步包括:
解析子单元7411,所述钩子函数服务对所述资源操作请求的请求体进行解析,基于解析结果反向编码出所述请求体中的目标资源对象的资源信息;其中,所述目标资源对象为所述资源操作请求指定的资源对象;
获取子单元7412,响应于所述资源信息不为空,获取并解析所述业务镜像的启动配置;
转换子单元7413,响应于启动配置不为空,将所述业务镜像的启动配置转换为JSONPatch类型的byte数据,并将所述byte数据作为响应体拼接回所述资源操作请求。
可选的,所述转换子单元7413在将所述业务镜像的启动配置转换为JSONPatch类型的byte数据之前,还用于在所述目标资源对象中添加所述启动配置以及资源配置;并且,所述将所述业务镜像的启动配置转换为JSONPatch类型的byte数据,包括:将所述启动配置的配置内容和资源配置的配置内容转换为JSONPatch类型的byte数据。
可选的,所述资源配置的配置内容包括以下一种或几种的组合:
初始化容器规则、共享目录规则、目录挂载规则、端口规则。
可选的,所述钩子函数服务通过以下子单元部署:
创建子单元701,创建钩子函数服务,为所述钩子函数服务添加业务镜像的启动配置和基础镜像;
封装子单元703,通过接口服务器为所述钩子函数服务封装函数调用接口;
所述拦截单元730在将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务时,进一步通过所述函数调用接口,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务。
可选的,所述创建子单元701,还用于为管理所述钩子函数服务的接口服务器添加认证鉴权配置;
在所述接收单元710之后,还包括:
认证鉴权单元711,所述接口服务器基于所述认证鉴权配置对所述资源操作请求进行认证鉴权;响应于通过所述认证鉴权,将所述资源操作请求传输到所述准入控制器。
示例性计算设备
在介绍了本公开示例性实施方式的方法、介质和装置之后,接下来,参考图8对本公开示例性实施方式的计算设备进行说明。
图8显示的计算设备1500仅仅是一个示例,不应对本公开实施例的功能和使用范围带来任何限制。
如图8所示,计算设备1500以通用计算设备的形式表现。计算设备1500的组件可以包括但不限于:至少一个处理单元1501、至少一个存储单元1502,连接不同系统组件(包括处理单元1501和存储单元1502)的总线1503。
总线1503包括数据总线、控制总线和地址总线。
存储单元1502可以包括易失性存储器形式的可读介质,例如随机存取存储器(RAM)15021和/或高速缓存存储器15022,可以进一步包括非易失性存储器形式的可读介质,例如只读存储器(ROM)15023。
存储单元1502还可以包括具有一组(至少一个)程序模块15024的程序/实用工具15025,这样的程序模块15024包括但不限于:操作系统、一个或者多个应用程序、其它程序模块以及程序数据,这些示例中的每一个或某种组合中可能包括网络环境的实现。
计算设备1500也可以与一个或多个外部设备1504(例如键盘、指向设备等)通信。
这种通信可以通过输入/输出(I/O)接口1505进行。并且,计算设备1500还可以通过网络适配器1506与一个或者多个网络(例如局域网(LAN),广域网(WAN)和/或公共网络,例如因特网)通信。如图8所示,网络适配器1506通过总线1503与计算设备1500的其它模块通信。应当理解,尽管图中未示出,可以结合计算设备1500使用其它硬件和/或软件模块,包括但不限于:微代码、设备驱动器、冗余处理单元、外部磁盘驱动阵列、RAID系统、磁带驱动器以及数据备份存储系统等。
通过如图8示出的计算设备1500,可以实现前述云原生应用的代码插桩方法,更具体地,存储单元1502存储处理单元1501可执行的指令,处理单元1501执行指令时,实现前述云原生应用的代码插桩方法。
应当注意,尽管在上文详细描述中提及了云原生应用的代码插桩装置的若干单元/模块或子单元/模块,但是这种划分仅仅是示例性的并非强制性的。实际上,根据本公开的实施方式,上文描述的两个或更多单元/模块的特征和功能可以在一个单元/模块中具体化。反之,上文描述的一个单元/模块的特征和功能可以进一步划分为由多个单元/模块来具体化。
此外,尽管在附图中以特定顺序描述了本公开方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
虽然已经参考若干具体实施方式描述了本公开的精神和原理,但是应该理解,本公开并不限于所公开的具体实施方式,对各方面的划分也不意味着这些方面中的特征不能组合以进行受益,这种划分仅是为了表述的方便。本公开旨在涵盖所附权利要求的精神和范围内所包括的各种修改和等同布置。
Claims (10)
1.一种云原生应用的代码插桩方法,应用于容器编排平台,所述容器编排平台中包括接口服务器和准入控制器;所述方法包括:
接口服务器接收针对云原生应用的资源操作请求;
准入控制器确定所述资源操作请求携带的操作参数与所述准入控制器中配置的参数标签的匹配结果;
响应于所述匹配结果为匹配,拦截所述资源操作请求,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务;
所述钩子函数服务基于封装的插桩逻辑,将待插桩的代码注入所述云原生应用。
2.根据权利要求1所述的方法,所述钩子函数服务包含有业务镜像的启动配置,以及预先部署的基础镜像;
所述钩子函数服务基于封装的插桩逻辑,将代码注入到所述云原生中,包括:
所述钩子函数服务基于基础镜像中封装的插桩逻辑,将所述业务镜像的启动配置注入到所述资源操作请求,并将所述资源操作请求返回给所述接口服务器;
所述接口服务器响应于所述钩子函数服务返回的资源操作请求,完成对所述云原生应用的资源对象操作;以使所述云原生所在的虚拟机运行所述资源对象时,基于注入的所述启动配置获取业务镜像并执行所述业务镜像中的基于Java代理的业务代码。
3.根据权利要求2所述的方法,在将所述业务镜像的启动配置注入到所述资源操作请求之前,还包括:
下载并解压业务镜像,将业务镜像挂载到所述云原生应用的业务容器的共享目录。
4.根据权利要求2所述的方法,所述启动配置包括所述业务镜像的镜像下载配置和启动参数变量;
所述基于注入的所述启动配置获取业务镜像并执行所述业务镜像中的基于Java代理的业务代码,包括:
基于注入的镜像下载配置下载对应的业务镜像,并在启动所述云原生应用的业务容器时,通过类加载器触发所述启动参数变量,以将所述业务镜像中的基于Java代理的业务代码插入到所述业务容器中。
5.根据权利要求4所述的方法,所述下载配置包括业务镜像存储在镜像仓库的存储地址、存储密钥和所述业务镜像的镜像名称。
6.根据权利要求1所述的方法,所述准入控制器确定所述资源操作请求携带的操作参数与所述准入控制器中配置的参数标签的匹配结果,包括:
准入控制器将所述操作参数与第一标签选择器中的命名空间标签进行第一匹配;以及,
将所述操作参数与第二标签选择器中的资源对象标签进行第二匹配;
响应于第一匹配和第二匹配均匹配成功,将最终的匹配结果确定为匹配。
7.根据权利要求4所述的方法,所述接口服务器响应于所述钩子函数服务返回的资源操作请求,还包括:
开放所述业务容器的端口;以供注入到所述云原生应用中的业务代码通过所述端口将执行过程中生成的数据转储到所述业务容器。
8.一种云原生应用的代码插桩装置,应用于容器编排平台,所述容器编排平台中包括接口服务器和准入控制器;所述装置包括:
接收单元,接口服务器接收针对云原生应用的资源操作请求;
确定单元,准入控制器确定所述资源操作请求携带的操作参数与所述准入控制器中配置的参数标签的匹配结果;
拦截单元,响应于所述匹配结果为匹配,拦截所述资源操作请求,将拦截的所述资源操作请求转发至所述接口服务器管理的钩子函数服务;
插桩单元,所述钩子函数服务基于封装的插桩逻辑,将待插桩的代码注入所述云原生应用。
9.一种计算机可读存储介质,包括:
当所述计算机可读存储介质中的指令由电子设备的处理器执行时,使得电子设备能够执行如权利要求1-7中任一项所述的云原生应用的代码插桩方法。
10.一种计算设备,包括:
处理器;
用于存储所述处理器可执行指令的存储器;
其中,所述处理器被配置为执行所述可执行指令,以实现如权利要求1-7中任一项所述的云原生应用的代码插桩方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310867722.6A CN118193354A (zh) | 2023-07-13 | 2023-07-13 | 云原生应用的代码插桩方法、装置、存储介质和计算设备 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202310867722.6A CN118193354A (zh) | 2023-07-13 | 2023-07-13 | 云原生应用的代码插桩方法、装置、存储介质和计算设备 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN118193354A true CN118193354A (zh) | 2024-06-14 |
Family
ID=91402315
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202310867722.6A Pending CN118193354A (zh) | 2023-07-13 | 2023-07-13 | 云原生应用的代码插桩方法、装置、存储介质和计算设备 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN118193354A (zh) |
-
2023
- 2023-07-13 CN CN202310867722.6A patent/CN118193354A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
Lu et al. | Chex: statically vetting android apps for component hijacking vulnerabilities | |
US10552610B1 (en) | Adaptive virtual machine snapshot update framework for malware behavioral analysis | |
WO2023011242A1 (en) | Automated synthesis of reference policies for runtime microservice protection | |
Altekar et al. | OPUS: Online Patches and Updates for Security. | |
Sekar et al. | Model-carrying code: a practical approach for safe execution of untrusted applications | |
US10305962B1 (en) | Unit testing clients of web services | |
US20150332043A1 (en) | Application analysis system for electronic devices | |
US20230036357A1 (en) | Method and apparatus for authority control, computer device and storage medium | |
CN110390184B (zh) | 用于在云中执行应用的方法、装置和计算机程序产品 | |
WO2015047295A1 (en) | Application control flow models | |
CN116324773A (zh) | 用于保护智能合约免受攻击的方法和装置 | |
Tang et al. | Xdebloat: Towards automated feature-oriented app debloating | |
CN115934471A (zh) | 基于大数据的数据采集方法及大数据系统 | |
CN110597496B (zh) | 应用程序的字节码文件获取方法及装置 | |
Choi et al. | Large‐Scale Analysis of Remote Code Injection Attacks in Android Apps | |
Jones et al. | A service-oriented approach to mobile code security | |
CN118193354A (zh) | 云原生应用的代码插桩方法、装置、存储介质和计算设备 | |
CN113434217B (zh) | 漏洞扫描方法、装置、计算机设备及介质 | |
CN115495731A (zh) | 面向容器主机平台的轻量级攻击检测方法及装置 | |
CN111901325B (zh) | 蜜罐节点的服务扩展方法、装置、电子装置和存储介质 | |
CN116628696A (zh) | 一种基于代理客户端的漏洞检测方法及相关设备 | |
Casolare et al. | 2 Faces: a new model of malware based on dynamic compiling and reflection | |
US10740303B2 (en) | Composite file system commands | |
Bellizzi et al. | Using Infrastructure-Based Agents to Enhance Forensic Logging of Third-Party Applications. | |
US11989280B2 (en) | Pointer authentication failure detection |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |