当前位置: 首页 > news >正文

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&#xff0…...

关于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的物理存储结构中的文件。如下图所示。 如上图所示&#xff0c…...

智能探针技术:实现可视、可知、可诊的主动网络运维策略

网络维护的重要性 网络运维是确保网络系统稳定、高效、安全运行的关键活动。在当今这个高度依赖信息技术的时代,网络运维的重要性不仅体现在技术层面,更关乎到企业运营的方方面面。网络运维具有保障网络的稳定性、提升网络运维性能、降低企业运营成本等…...

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&#xff…...

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)是一种可以在卷积操作中插入“空洞”来扩大感受野的技术,更有效地捕捉到图像中的大范围上下文…...

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Docker 运行 Kafka 带 SASL 认证教程

Docker 运行 Kafka 带 SASL 认证教程 Docker 运行 Kafka 带 SASL 认证教程一、说明二、环境准备三、编写 Docker Compose 和 jaas文件docker-compose.yml代码说明&#xff1a;server_jaas.conf 四、启动服务五、验证服务六、连接kafka服务七、总结 Docker 运行 Kafka 带 SASL 认…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

软件工程 期末复习

瀑布模型&#xff1a;计划 螺旋模型&#xff1a;风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合&#xff1a;模块内部功能紧密 模块之间依赖程度小 高内聚&#xff1a;指的是一个模块内部的功能应该紧密相关。换句话说&#xff0c;一个模块应当只实现单一的功能…...

js 设置3秒后执行

如何在JavaScript中延迟3秒执行操作 在JavaScript中&#xff0c;要设置一个操作在指定延迟后&#xff08;例如3秒&#xff09;执行&#xff0c;可以使用 setTimeout 函数。setTimeout 是JavaScript的核心计时器方法&#xff0c;它接受两个参数&#xff1a; 要执行的函数&…...

深入理解 React 样式方案

React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...

k8s从入门到放弃之Pod的容器探针检测

k8s从入门到放弃之Pod的容器探针检测 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;容器探测是指kubelet对容器执行定期诊断的过程&#xff0c;以确保容器中的应用程序处于预期的状态。这些探测是保障应用健康和高可用性的重要机制。Kubernetes提供了两种种类型…...