Observability:如何在 Kubernetes pod 中轻松添加应用程序监控
作者:来自 Elastic Jack Shirazi•Sylvain Juge•Alexander Wert
Elastic® APM K8s Attacher 允许将 Elastic APM 应用程序代理(例如 Elastic APM Java 代理)自动安装到 Kubernetes 集群中运行的应用程序中。该机制使用变异 webhook(mutating webhook),这是一个标准的 Kubernetes 组件,但你无需了解使用 Attacher 的所有详细信息。本质上,你可以安装 Attacher,向任何包含你想要监控的应用程序的 Kubernetes 部署添加一个注释(annotation),就这样!
在本博客中,我们将使用 Java 应用程序从头开始介绍一个完整的示例。除了 Java 代码和为应用程序使用 JVM 之外,对于 Attacher 支持的其他语言,其他一切都相同。
先决条件
本演练假设系统上已安装以下内容:JDK 17、Docker、Kubernetes 和 Helm。
示例应用程序
虽然该应用程序(如下所示)是 Java 应用程序,但它可以轻松地用任何语言实现,因为它只是一个简单的循环,每 2 秒调用一次方法链 methodA->methodB->methodC->methodD,其中 methodC 休眠 10 毫秒,methodD 休眠 200 毫秒。选择应用程序只是为了能够在 Elastic APM UI 中清楚地显示正在监视该应用程序。
完整的 Java 应用程序如下所示:
package test;public class Testing implements Runnable {public static void main(String[] args) {new Thread(new Testing()).start();}public void run(){while(true) {try {Thread.sleep(2000);} catch (InterruptedException e) {}methodA();}}public void methodA() {methodB();}public void methodB() {methodC();}public void methodC() {System.out.println("methodC executed");try {Thread.sleep(10);} catch (InterruptedException e) {}methodD();}public void methodD() {System.out.println("methodD executed");try {Thread.sleep(200);} catch (InterruptedException e) {}}
}
我们为你创建了一个包含该简单 Java 应用程序的 Docker 镜像,可从以下 Docker 存储库中提取:
docker.elastic.co/demos/apm/k8s-webhook-test
部署 pod
首先我们需要一个部署配置。我们将配置文件命名为 webhook-test.yaml,内容非常少 — 只需拉取镜像并将其作为默认命名空间中名为 webhook-test 的 pod 和容器运行即可:
apiVersion: v1
kind: Pod
metadata:name: webhook-testlabels:app: webhook-test
spec:containers:- image: docker.elastic.co/demos/apm/k8s-webhook-testimagePullPolicy: Alwaysname: webhook-test
这可以使用 kubectl 正常部署:
kubectl apply -f webhook-test.yaml
结果正如预期:
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
webhook-test 1/1 Running 0 10s$ kubectl logs webhook-test
methodC executed
methodD executed
methodC executed
methodD executed
到目前为止,这只是设置了一个没有 APM 监控的标准 Kubernetes 应用程序。现在我们开始讨论有趣的部分:添加自动检测。
安装 Elastic APM K8s Attacher
第一步是安装 Elastic APM K8s Attacher。对于集群,这只需要执行一次 — 一旦安装,它就始终可用。在安装之前,我们将定义监视数据的去向。正如你稍后将看到的,我们可以随时决定或更改这一点。现在,我们将指定我们自己的 Elastic APM 服务器,该服务器位于 https://myserver.somecloud:443 — 我们还有一个用于授权该 Elastic APM 服务器的秘密令牌,其值为 MY_SECRET_TOKEN。(如果你想设置快速测试 Elastic APM 服务器,你可以在 https://cloud.elastic.co/ 上进行设置)。
为应用程序设置了两个额外的环境变量,这些变量通常不需要,但当我们在演练结束时看到生成的 UI 内容时会有所帮助(当代理自动安装时,这两个变量会告诉代理在 UI 中给这个应用程序起什么名字以及要跟踪什么方法)。现在我们只需要定义自定义 yaml 文件来保存这些内容。安装时,自定义 yaml 将合并到 Attacher 的 yaml 中:
apm:secret_token: MY_SECRET_TOKENnamespaces:- default
webhookConfig:agents:java:environment:ELASTIC_APM_SERVER_URL: "https://myserver.somecloud:443"ELASTIC_APM_TRACE_METHODS: "test.Testing#methodB"ELASTIC_APM_SERVICE_NAME: "webhook-test"
该 custom.yaml 文件就是我们安装附加器所需的全部内容(请注意,我们目前仅为代理自动安装指定了默认命名空间 - 这可以轻松更改,稍后你将看到)。接下来,我们将 Elastic 图表添加到 helm - 这只需执行一次,然后所有 Elastic 图表都可用于 helm。这是常用的 helm add repo 命令,具体来说:
helm repo add elastic https://helm.elastic.co
现在 Elastic 图表可供安装(helm search repo 将显示所有可用图表)。我们将使用 “elastic-webhook” 作为安装名称,从而产生以下安装命令:
helm install elastic-webhook elastic/apm-attacher --namespace=elastic-apm --create-namespace --values custom.yaml
就这样,我们现在安装了 Elastic APM K8s Attacher,并将其设置为将数据发送到 custom.yaml 文件中定义的 APM 服务器!(如果需要,你可以使用 helm list -A 确认安装。)
自动安装 Java 代理
Elastic APM K8s Attacher 已安装,但它不会将 APM 应用程序代理自动安装到每个 pod 中 — 这可能会导致问题!相反,Attacher 被故意限制为将代理自动安装到 a) 由 custom.yaml 中列出的命名空间定义的部署中,以及 b) 那些具有特定注释 “co.elastic.apm/attach” 的命名空间中的部署中。
因此,目前,重新启动我们上面创建的 webhook-test pod 不会对 pod 产生任何不同的影响,因为它尚未设置为受监控。我们需要做的是添加注释(annotation)。具体来说,我们需要使用与 Attacher 一起安装的默认代理配置为 Java 代理添加注释,该配置称为 “java”(我们稍后会看到该代理配置是如何更改的 — 默认配置会安装最新的代理版本,并将该版本的所有其他内容保留为默认设置)。因此,将该注释添加到 webhook-test yaml 中会为我们提供新的 yaml 文件内容(附加配置显示为标签 (1)):
apiVersion: v1
kind: Pod
metadata:name: webhook-testannotations: #(1)co.elastic.apm/attach: java #(1)labels:app: webhook-test
spec:containers:- image: docker.elastic.co/demos/apm/k8s-webhook-testimagePullPolicy: Alwaysname: webhook-test
应用此更改使我们现在可以监控应用程序:
$ kubectl delete -f webhook-test.yaml
pod "webhook-test" deleted
$ kubectl apply -f webhook-test.yaml
pod/webhook-test created
$ kubectl logs webhook-test
… StartupInfo - Starting Elastic APM 1.45.0 …
由于代理现在正在将数据提供给我们的 APM 服务器,我们现在可以在 UI 中看到它:
请注意,由于 custom.yaml 中的 ELASTIC_APM_TRACE_METHODS 环境变量设置为 test.Testing#methodB,因此代理将 Testing.methodB 方法标识为跟踪根 — 这会告诉代理专门跟踪该方法。该方法所花费的时间将在每次调用的 UI 中可用,但我们目前看不到子方法。在下一节中,我们将看到自定义 Attacher 是多么容易,并且在这样做时,我们将看到有关应用程序中正在执行的方法链的更多详细信息。
自定义代理
在你的系统中,你可能会有开发、测试和生产环境。你需要指定要使用的代理版本,而不仅仅是提取最新版本,你需要对某些应用程序或实例进行调试,并且你需要将特定选项设置为特定值。这听起来很费劲,但附加器可以让你以非常简单的方式启用这些类型的更改。在本节中,我们将添加一个指定所有这些更改的配置,我们可以看到配置和启用它是多么容易。
我们从上面定义的 custom.yaml 文件开始。这是合并到 Attacher 中的文件。添加一个包含上一段列出的所有项目的新配置很容易 —— 尽管首先我们需要为新配置确定一个名称。我们在这里将其称为 “java-interesting”。完整的新 custom.yaml 是(第一部分与之前相同,新配置只是附加的):
apm:secret_token: MY_SECRET_TOKENnamespaces:- default
webhookConfig:agents:java:environment:ELASTIC_APM_SERVER_URL: "https://myserver.somecloud:443"ELASTIC_APM_TRACE_METHODS: "test.Testing#methodB"ELASTIC_APM_SERVICE_NAME: "webhook-test"java-interesting:image: docker.elastic.co/observability/apm-agent-java:1.52.0artifact: "/usr/agent/elastic-apm-agent.jar"environment:ELASTIC_APM_SERVER_URL: "https://myserver.somecloud:443"ELASTIC_APM_TRACE_METHODS: "test.Testing#methodB"ELASTIC_APM_SERVICE_NAME: "webhook-test"ELASTIC_APM_ENVIRONMENT: "testing"ELASTIC_APM_LOG_LEVEL: "debug"ELASTIC_APM_PROFILING_INFERRED_SPANS_ENABLED: "true"JAVA_TOOL_OPTIONS: "-javaagent:/elastic/apm/agent/elastic-apm-agent.jar"
将附加配置分解,我们有:
- 新配置的名称 java-interesting
- APM Java 代理映像 docker.elastic.co/observability/apm-agent-java
- 使用特定版本 1.43.0 而不是最新
- 我们需要指定代理 jar 位置(附件将其放在此处)
- artifact:“/usr/agent/elastic-apm-agent.jar”
- 然后是环境变量
- ELASTIC_APM_SERVER_URL 与之前一样
- ELASTIC_APM_ENVIRONMENT 设置为 testing,在 UI 中查看时很有用
- ELASTIC_APM_LOG_LEVEL 设置为 debug 以获得更详细的代理输出
- ELASTIC_APM_PROFILING_INFERRED_SPANS_ENABLED 启用它(设置为 true)将为我们提供有关应用程序中正在执行的方法链的其他有趣信息
- 最后,我们需要将 JAVA_TOOL_OPTIONS 设置为启用启动代理“-javaagent:/elastic/apm/agent/elastic-apm-agent.jar” —— 这基本上是 Attacher 自动附加 Java 代理的方式
Java 代理的更多配置和配置选项详细信息可在此处找到,其他语言代理也可用。
使用新配置跟踪的应用程序
最后,我们只需使用更改后的 custom.yaml 升级附加程序:
helm upgrade elastic-webhook elastic/apm-attacher --namespace=elastic-apm --create-namespace --values custom.yaml
这是与原始安装相同的命令,但现在使用升级。就是这样 — 将配置添加到 custom.yaml 并升级附件,就完成了!很简单。
当然,我们仍然需要在应用程序上使用新配置。在本例中,我们将编辑现有的 webhook-test.yaml 文件,将 java 替换为 java-interesting,因此注释行现在是:
co.elastic.apm/attach: java-interesting
应用新的 pod 配置并重新启动 pod,你可以看到日志现在包含调试输出:
$ kubectl delete -f webhook-test.yaml
pod "webhook-test" deleted
$ kubectl apply -f webhook-test.yaml
pod/webhook-test created
$ kubectl logs webhook-test
… StartupInfo - Starting Elastic APM 1.44.0 …
… DEBUG co.elastic.apm.agent. …
… DEBUG co.elastic.apm.agent. …
更有趣的是 UI。现在推断跨度(inferred spans)已打开,完整的方法链可见。
这给出了 methodB 的详细信息(它耗时 211 毫秒,因为它调用 methodC - 10 毫秒 - 而 methodC 又调用 methodD - 200 毫秒)。methodC 和 methodD 的时间是推断出来的,而不是记录出来的(推断出来的,而不是跟踪出来的 — 如果你需要准确的时间,你可以把这些方法添加到 trace_methods 中,然后对它们进行跟踪)。
关于 ECK operator 的说明
Elastic Cloud on Kubernetes operator 允许你在 Kubernetes 上安装和管理许多其他 Elastic 组件。在发布本博客时,Elastic APM K8s Attacher 是一个单独的组件,这些管理机制之间没有冲突 —— 它们适用于不同的组件并且彼此独立。
自己尝试一下!
此演练可轻松在你的系统上重复,你可以通过将示例应用程序替换为你自己的应用程序并将 Docker 注册表替换为你使用的注册表来使其更有用。
了解有关使用 Kubernetes 和 Elastic Observability 进行实时监控的更多信息。
本文中描述的任何特性或功能的发布和时间均由 Elastic 自行决定。任何当前不可用的特性或功能可能无法按时交付或根本无法交付。
原文:How to easily add application monitoring in Kubernetes pods — Elastic Observability Labs
相关文章:

Observability:如何在 Kubernetes pod 中轻松添加应用程序监控
作者:来自 Elastic Jack Shirazi•Sylvain Juge•Alexander Wert Elastic APM K8s Attacher 允许将 Elastic APM 应用程序代理(例如 Elastic APM Java 代理)自动安装到 Kubernetes 集群中运行的应用程序中。该机制使用变异 webhook࿰…...

关于Nginx前后端分离部署spring boot和vue工程以及反向代理的配置说明
最近项目中用到关于Nginx前后端分离部署spring boot和vue工程以及反向代理的配置,总结了一下说明: 1、后端是spring boot工程,端口8000,通过 jar命令启动 nohup java -jar xxx-jsonflow-biz.jar > /usr/local/nohup.out 2>…...

redis渐进式遍历
文章目录 一. 渐进式遍历介绍二. scan命令 一. 渐进式遍历介绍 keys * , 一次性把整个redis中所有的key都获取到, 这个操作比较危险, 可能会阻塞redis服务器 通过渐进式遍历, 就可以做到, 既能够获取到所有的key, 又不会卡死服务器 渐进式遍历, 不是一个命令把所有key都拿到,…...

【C++】数据类型与操作实践:详细解析与优化
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目一:三个数的倒序输出1.1 题目描述与代码实现代码实现: 1.2 代码解析与细节说明1.3 使用 int 类型的合理性分析1.4 其他数据类型的考虑1.5 代码优…...

C# 集合(Collection)
文章目录 前言一、动态数组(ArrayList)二、哈希表(Hashtable)三、排序列表(SortedList)四、堆栈(Stack)五、队列(Queue)六、点阵列(BitArray&…...

【智能控制】实验,基于MATLAB的模糊推理系统设计,模糊控制系统设计
关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...
前端跳转路由的时候,清掉缓存
清除路由缓存的方法 使用 $router.push() 方法:在跳转路由时,可以通过传递一个包含 replace: true 属性的对象来实现清除路由缓存。例如: this.$router.push({ path: "/new-route", replace: true }); 使用 $router.replace…...
基于 LlamaFactory 的 LoRA 微调模型支持 vllm 批量推理的实现
背景 LlamaFactory 的 LoRA 微调功能非常便捷,微调后的模型,没有直接支持 vllm 推理,故导致推理速度不够快。 LlamaFactory 目前支持通过 VLLM API 进行部署,调用 API 时的响应速度,仍然没有vllm批量推理的速度快。 …...

【赵渝强老师】PostgreSQL的物理存储结构
PostgreSQL在执行initdb的数据库集群初始化时会指定一个目录。该目录通过环境变量$PGDATA来表示。当数据库集群初始化完成后,会在这个目录生成相关的子目录以及一些文件。这些生成的文件就是PostgreSQL的物理存储结构中的文件。如下图所示。 如上图所示,…...

智能探针技术:实现可视、可知、可诊的主动网络运维策略
网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代,网络运维的重要性不仅体现在技术层面,更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…...
CTF-PWN: 全保护下格式化字符串利用 [第一届“吾杯”网络安全技能大赛 如果能重来] 赛后学习(不会)
通过网盘分享的文件:如果能重来.zip 链接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取码: 1111 --来自百度网盘超级会员v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…...

debian 11 虚拟机环境搭建过坑记录
目录 安装过程系统配置修改 sudoers 文件网络配置换源安装桌面mount nfs 挂载安装复制功能tab 无法补全其他安装 软件配置eclipse 配置git 配置老虚拟机硬盘挂载 参考 原来去 debian 官网下载了一个最新的 debian 12,安装后出现包依赖问题,搞了半天&…...
MYSQL 什么是内连接 外连接 左连接 右连接?及适用场景
在 SQL 中,连接(JOIN)是用于组合来自两个或更多表的行的一种方法。根据连接的方式不同,可以分为几种类型的连接:内连接(INNER JOIN)、外连接(OUTER JOIN)、左连接&#x…...

利用Ubuntu批量下载modis图像(New)
由于最近modis原来批量下载的代码不再直接给出,因此,再次梳理如何利用Ubuntu下载modis数据。 之前的下载代码为十分长,现在只给出一部分,需要自己再补充另一部分。之前的为: 感谢郭师兄的指导(https://blo…...

【Springboot】@Autowired和@Resource的区别
【Springboot】Autowired和Resource的区别 【一】定义【1】Autowired【2】Resource 【二】区别【1】包含的属性不同【2】Autowired默认按byType自动装配,而Resource默认byName自动装配【3】注解应用的地方不同【4】出处不同【5】装配顺序不用(1ÿ…...

UIE与ERNIE-Layout:智能视频问答任务初探
内容来自百度飞桨ai社区UIE与ERNIE-Layout:智能视频问答任务初探: 如有侵权,请联系删除 1 环境准备 In [2] # 安装依赖库 !pip install paddlenlp --upgrade !pip install paddleocr --upgrade !pip install paddlespeech --upgrade In …...

数据结构:树
树的基本定义: 树是一种数据结构,它是由n(n>1)个有限节点组成一个具有层次关系的集合。把它叫做 “树” 是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点: …...
docker 怎么启动nginx
在Docker中启动Nginx容器是一个简单的过程。以下是启动Nginx容器的步骤: 拉取Nginx镜像: 首先,你需要从Docker Hub拉取Nginx的官方镜像。使用以下命令: docker pull nginx运行Nginx容器: 使用docker run命令来启动一个…...

【智商检测——DP】
题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M 110; int f[N][M]; int main() {int n, k;cin >> n >> k;for(int i 1; i < n; i){int x;cin >> x;f[i][0] __gcd(f[i-1][0], x);for(int j 1; j < min(i, k)…...

YOLOv11改进,YOLOv11添加SAConv可切换空洞卷积,二次创新C3k2结构
摘要 作者提出的技术结合了递归特征金字塔和可切换空洞卷积,通过强化多尺度特征学习和自适应的空洞卷积,显著提升了目标检测的效果。 理论介绍 空洞卷积(Atrous Convolution)是一种可以在卷积操作中插入“空洞”来扩大感受野的技术,更有效地捕捉到图像中的大范围上下文…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...