无侵入式容器化探针接入,节约70%接入成本

2023-12-12 07:38

本文主要是介绍无侵入式容器化探针接入,节约70%接入成本,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Takin一键部署教程:https://news.shulie.io/?p=3661

在使用Takin时,绕不开接入探针的问题。目前大多数的企业系统应用均部署在k8s平台容器,通过镜像部署方式来接入探针是比较简单的方式,但这种方式也有自己的缺点:

  • 每次探针升级(bug或者新功能)都要重做基础镜像
  • 基础镜像需要经过公司内部的安全扫描
  • 应用需要选择新镜像,重启后才能完成升级
  • 其他探针也使用此方式时,需要防止相互覆盖

有没有什么接入方式可以绕过这些问题呢?
这就是今天要跟大家分享的内容——无侵入式容器化探针接入。

技术方案概述

应用场景举例:一个Pod里部署一个镜像,镜像不能重新打包,不能挂在宿主机目录,在这个前提下要使用探针。

解决方案概述:可将探针目录打进一个镜像,部署到应用所在的pod里,修改k8s的yml文件,生成一个共享数据卷,在探针镜像启动成功后将探针目录拷贝到共享数据卷中,这样在启动应用镜像时就可以通过共享数据卷来获得探针的目录以达到加载探针的目的。

具体实现步骤

1.打探针镜像

探针Dockfile

#基础镜像通过java8来的
#根据系统的类型选择合适的镜像,这里用的是openjdk:oraclelinux8
FROM openjdk:oraclelinux8
#将当前文件中所有*.jar 拷贝到项目的app.jar中(这个app.jar是自己生成的)
COPY app.jar /app/shulie_data/app.jar
COPY simulator-agent /app/shulie_data/simulator-agent
#映射地址
CMD ["--server.prot=8080"]
#暴露端口
EXPOSE 8080#执行命令java -jar
# ENTRYPOINT ["java","${JAVA_OPTS}","-jar","/app.jar"]
ENTRYPOINT java -jar /app/shulie_data/app.jar

在Dockerfile当前目录,拷贝应用包到当前目录, 命名为app.jar,执行如下命令生成探针镜像:

docker build -t runoob/ubuntu:v1 . 

这个镜像的主要目的是将探针目录放入到Pod里,实际的app.jar不需要什么内容,只要一个能运行的jar包就行,这个更多的是测试使用,实际其实并不会用到。但探针在打进去之前需要做好准备,所有相应的配置文件都要配置好,打进镜像就不能调整了。

探针的空应用可以用这个: 由于附件无法上传请添加小树回复关键词【app.jar】获取空应用包
在这里插入图片描述

应用Dockfile

这个镜像是用来验证共享数据卷的技术方案可行性的,是一个demo应用,非必需的。

#基础镜像通过java8来的
FROM openjdk:oraclelinux8
#将当前文件中所有*.jar 拷贝到项目的app.jar中(这个app.jar是自己生成的)
COPY *.jar /app.jar
#映射地址
CMD ["--server.prot=8080"]
#暴露端口
EXPOSE 8080ENV JAVA_OPTS="\
-XX:MetaspaceSize=256M \
-XX:MaxMetaspaceSize=256M \
-Xbootclasspath/a:$JAVA_HOME/lib/tools.jar \
-javaagent:/app/shulie/simulator-agent/simulator-launcher-instrument.jar \     #共享数据卷的探针目录
-Dsimulator.app.name=zto-new-agent \
-Dsimulator.delay=0 \
-Djdk.attach.allowAttachSelf=true"#执行命令java -jar
# ENTRYPOINT ["java","${JAVA_OPTS}","-jar","/app.jar"]
ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar

2.加载探针

这里有2种方式可以实现:

  • 修改启动命令:可以修改应用Dockerfile来指向探针目录,也可以通过docker run -e的形式覆盖Dockerfile里的JAVA_OPTS来动态加载探针,或者通过k8s来实现docker run -e的同等效果
  • 设置环境变量:可以通过定义”JAVA_TOOL_OPTIONS” 这个环境变量来动态的设置jvm启动参数,比如
export JAVA_TOOL_OPTIONS="-javaagent:/app/shulie/simulator-agent/simulator-launcher-instrument.jar -javaagent:/app/shulie/simulator-agent/bootstrap/transmittable-thread-local-2.12.1.jar -Dsimulator.app.name=app_name"

此时在启动java应用时时会在jvm启动参数上附加

-javaagent:/app/shulie/simulator-agent/simulator-launcher-instrument.jar 
-javaagent:/app/shulie/simulator-agent/bootstrap/transmittable-thread-local-2.12.1.jar 
-Dsimulator.app.name=app_name

这是利用JNI的内置机制:JNI在启动jvm时会将制定环境变量 JAVA_TOOL_OPTIONS 的值添加到jvm参数里。

3.配置k8s共享数据卷

数据卷含义图:

在这里插入图片描述

配置k8s的pod文件

apiVersion: v1
kind: Pod
metadata:name: agent-applabels:name: agent-app
spec:nodeSelector:    #这个是k8s选择主从节点的,看情况添加shulie: agentvolumes:            #生成一个数据卷,类型是emptyDir,可在pod内多个容器间共享目录- name: shared-dataemptyDir: {}containers:- name: agent              #探针镜像image: agent-docker:v3volumeMounts:          #定义数据卷- name: shared-data       mountPath: /app/shulie_agent          #共享数据卷路径,多个容器不能重复#定义一个command,会覆盖默认的java -jar commandcommand: ["/bin/sh"]     #将镜像里的探针目录拷贝到共享数据卷/app/shulie_agent, 设置JAVA_TOOL_OPTIONS环境变量 ,同时启动应用。探针镜像的/app/shulie_agent对应着app镜像的 /app/shulie,拷贝后应用就能在/app/shulie里看到探针args: ["-c","cp -rf /app/shulie_data/simulator-agent /app/shulie_agent; export JAVA_TOOL_OPTIONS='-javaagent:/app/shulie/simulator-agent/simulator-launcher-instrument.jar -javaagent:/app/shulie/simulator-agent/bootstrap/transmittable-thread-local-2.12.1.jar -Dsimulator.app.name=app_name';java -jar /app/shulie_data/app.jar"]           - name: app               #应用镜像image: app-docker-noagent:v1#image: app-docker:v2volumeMounts:- name: shared-datamountPath: /app/shulie   #应用镜像里通过-javaagent来指定共享数据卷的探针目录,也可以在启动镜像是通过环境变量来设置-javaagent

这篇关于无侵入式容器化探针接入,节约70%接入成本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/483790

相关文章

如何将Tomcat容器替换为Jetty容器

《如何将Tomcat容器替换为Jetty容器》:本文主要介绍如何将Tomcat容器替换为Jetty容器问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Tomcat容器替换为Jetty容器修改Maven依赖配置文件调整(可选)重新构建和运行总结Tomcat容器替

C++从序列容器中删除元素的四种方法

《C++从序列容器中删除元素的四种方法》删除元素的方法在序列容器和关联容器之间是非常不同的,在序列容器中,vector和string是最常用的,但这里也会介绍deque和list以供全面了解,尽管在一... 目录一、简介二、移除给定位置的元素三、移除与某个值相等的元素3.1、序列容器vector、deque

C++常见容器获取头元素的方法大全

《C++常见容器获取头元素的方法大全》在C++编程中,容器是存储和管理数据集合的重要工具,不同的容器提供了不同的接口来访问和操作其中的元素,获取容器的头元素(即第一个元素)是常见的操作之一,本文将详细... 目录一、std::vector二、std::list三、std::deque四、std::forwa

Python容器类型之列表/字典/元组/集合方式

《Python容器类型之列表/字典/元组/集合方式》:本文主要介绍Python容器类型之列表/字典/元组/集合方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 列表(List) - 有序可变序列1.1 基本特性1.2 核心操作1.3 应用场景2. 字典(D

IDEA接入Deepseek的图文教程

《IDEA接入Deepseek的图文教程》在本篇文章中,我们将详细介绍如何在JetBrainsIDEA中使用Continue插件接入DeepSeek,让你的AI编程助手更智能,提高开发效率,感兴趣的小... 目录一、前置准备二、安装 Continue 插件三、配置 Continue 连接 DeepSeek四

SpringBoot快速接入OpenAI大模型的方法(JDK8)

《SpringBoot快速接入OpenAI大模型的方法(JDK8)》本文介绍了如何使用AI4J快速接入OpenAI大模型,并展示了如何实现流式与非流式的输出,以及对函数调用的使用,AI4J支持JDK8... 目录使用AI4J快速接入OpenAI大模型介绍AI4J-github快速使用创建SpringBoot

PyCharm 接入 DeepSeek最新完整教程

《PyCharm接入DeepSeek最新完整教程》文章介绍了DeepSeek-V3模型的性能提升以及如何在PyCharm中接入和使用DeepSeek进行代码开发,本文通过图文并茂的形式给大家介绍的... 目录DeepSeek-V3效果演示创建API Key在PyCharm中下载Continue插件配置Con

Spring AI Alibaba接入大模型时的依赖问题小结

《SpringAIAlibaba接入大模型时的依赖问题小结》文章介绍了如何在pom.xml文件中配置SpringAIAlibaba依赖,并提供了一个示例pom.xml文件,同时,建议将Maven仓... 目录(一)pom.XML文件:(二)application.yml配置文件(一)pom.xml文件:首

Go语言中三种容器类型的数据结构详解

《Go语言中三种容器类型的数据结构详解》在Go语言中,有三种主要的容器类型用于存储和操作集合数据:本文主要介绍三者的使用与区别,感兴趣的小伙伴可以跟随小编一起学习一下... 目录基本概念1. 数组(Array)2. 切片(Slice)3. 映射(Map)对比总结注意事项基本概念在 Go 语言中,有三种主要

PyCharm接入DeepSeek实现AI编程的操作流程

《PyCharm接入DeepSeek实现AI编程的操作流程》DeepSeek是一家专注于人工智能技术研发的公司,致力于开发高性能、低成本的AI模型,接下来,我们把DeepSeek接入到PyCharm中... 目录引言效果演示创建API key在PyCharm中下载Continue插件配置Continue引言