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

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-test
  labels:
    app: webhook-test
spec:
  containers:
    - image: docker.elastic.co/demos/apm/k8s-webhook-test
      imagePullPolicy: Always
      name: 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_TOKEN
  namespaces:
    - 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-test
  annotations: #(1)
    co.elastic.apm/attach: java #(1)
  labels:
    app: webhook-test
spec:
  containers:
    - image: docker.elastic.co/demos/apm/k8s-webhook-test
      imagePullPolicy: Always
      name: 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_TOKEN
  namespaces:
    - 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.0
      artifact: "/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


http://www.kler.cn/a/418357.html

相关文章:

  • 触觉智能亮相OpenHarmony人才生态大会2024
  • Zephyr 入门-设备树与设备驱动模型
  • 【操作文档】mysql分区操作步骤.docx
  • pycharm链接neo4j(导入文件)
  • shell语法(1)bash
  • 分布式系统中的Dapper与Twitter Zipkin:链路追踪技术的实现与应用
  • k8s 架构详解
  • 虚拟列表遇上瀑布流布局
  • 基于Springboot开发的云野旅游平台
  • 机器学习与深度学习-2-Softmax回归从零开始实现
  • 模型 布鲁姆法则
  • 如何用一块香橙派Zero3打造你的HomeAssistant智能家居中心并实现远程管理
  • 华为机试HJ77 火车进站
  • 【docker】多阶段构建与基础构建,及企业案例展示
  • Vue 3 中实现页面特定功能控制
  • Ubuntu双系统20.04平稳升级至22.04
  • 代数拓扑学
  • 【热门主题】000073 探索云原生后端:开启高效应用开发新时代
  • 系统架构:MVVM
  • YOLOv8-ultralytics-8.2.103部分代码阅读笔记-files.py
  • LSTM神经网络时间序列
  • 使用Docker在Ubuntu 22.04上部署MySQL数据库的完整指南
  • 如何在 VPS 上设置 Apache 并使用免费签名的 SSL 证书
  • Uniapp 使用自定义字体
  • Linux下如何安装JDK
  • 粒子群算法优化RBF网络