无侵入式容器化探针接入,节约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

相关文章

K8S(Kubernetes)开源的容器编排平台安装步骤详解

K8S(Kubernetes)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。以下是K8S容器编排平台的安装步骤、使用方式及特点的概述: 安装步骤: 安装Docker:K8S需要基于Docker来运行容器化应用程序。首先要在所有节点上安装Docker引擎。 安装Kubernetes Master:在集群中选择一台主机作为Master节点,安装K8S的控制平面组件,如AP

Spring框架5 - 容器的扩展功能 (ApplicationContext)

private static ApplicationContext applicationContext;static {applicationContext = new ClassPathXmlApplicationContext("bean.xml");} BeanFactory的功能扩展类ApplicationContext进行深度的分析。ApplicationConext与 BeanF

容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么? K8s的架构原理  控制平面(Control plane)         kube-apiserver         etcd         kube-scheduler         kube-controller-manager         cloud-controlle

C++ STL关联容器Set与集合论入门

1. 简介 Set(集合)属于关联式容器,也是STL中最实用的容器,关联式容器依据特定的排序准则,自动为其元素排序。Set集合的底层使用一颗红黑树,其属于一种非线性的数据结构,每一次插入数据都会自动进行排序,注意,不是需要排序时再排序,而是每一次插入数据的时候其都会自动进行排序。因此,Set中的元素总是顺序的。 Set的性质有:数据自动进行排序且数据唯一,是一种集合元素,允许进行数学上的集合相

Spring容器上下文

目录 一 什么是spring容器上下文 二 spring容器上下文可以做什么 三 如何使用 1.实现ApplicationContextAware接口 2.代码测试 一 什么是spring容器上下文 你可以把它理解成就是spring容器,它主要用于管理Bean对象,包括bean的生命周期,bean的注入等等。 二 spring容器上下文可以做什么 我们刚刚上面

Java 入门指南:Java 并发编程 —— 并发容器 ConcurrentLinkedDeque

文章目录 ConcurrentLinkedDeque特点构造方法常用方法使用示例注意事项 ConcurrentLinkedDeque ConcurrentLinkedDeque 是 Java 并发工具包(java.util.concurrent 包)中的一个线程安全的双端队列(Deque)实现,实现了 Deque 接口。它使用了链表结构,并且针对高并发环境进行了优化,非常适合

Docker 容器技术:简化 MySQL 主从复制部署与优化

Docker 容器技术:简化 MySQL 主从复制部署与优化 引言 随着大数据和云计算的快速发展,数据库的高可用性、可扩展性和易维护性成为了企业IT架构中的重要考量因素。MySQL 作为一款流行的开源数据库管理系统,其主从复制(Master-Slave Replication)功能为实现数据备份、故障恢复、读取扩展和数据分析提供了强有力的支持。然而,传统的 MySQL 主从复制部署过程复杂且容

Docker进入容器并运行命令

在讨论如何使用Docker进入容器并运行命令时,我们需要先理解Docker的基本概念以及容器的工作原理。Docker是一个开放平台,用于开发、交付和运行应用程序。它使用容器来打包、分发和运行应用程序,这些容器是轻量级的、可移植的、自包含的,能够在几乎任何地方以相同的方式运行。 进入Docker容器的几种方式 1. 使用docker exec命令 docker exec命令是最常用的进入正在运

Qt-常用控件(3)-多元素控件、容器类控件和布局管理器

1. 多元素控件 Qt 中提供的多元素控件有: QListWidgetQListViewQTableWidgetQTableViewQTreeWidgetQTreeView xxWidget 和 xxView 之间的区别,以 QTableWidget 和 QTableView 为例. QTableView 是基于 MVC 设计的控件.QTableView 自身不持有数据,使用 QTab

spring ioc容器的原理

1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 图1:软件系统中耦合的对象 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协