头图

前言

本次最佳实践将介绍如何在 Kubernetes 集群中部署基于 Java 的若依系统。若依是一个开源的、轻量级的企业级 Java 快速开发平台,它构建于经典的 SpringCloud 框架之上,并集成了多种常用的开发组件。这样的设计旨在助力开发者高效地构建各类应用程序。在本实践案例中,我们将通过 Kubernetes 的 Deployment 资源来部署若依服务,所有操作均在默认命名空间(default)下进行。

图片

部署 DataKit

  • 下载 datakit.yaml 文件
wget https://static.guance.com/datakit/datakit.yaml
  • 修改 datakit.yaml 文件,配置 DataWay 网关地址,该地址在观测云空间「管理」中可以看到
- name: ENV_DATAWAY
  value: https://openway.guance.com?token=tkn_xxxxxxxxxxxxx

图片

  • 开启采集器 ddtrace
- name: ENV_DEFAULT_ENABLED_INPUTS
  value: cpu,disk,diskio,mem,swap,system,hostobject,net,host_processes,container,ddtrace,profile

图片

  • 重启 DataKit
datakit service -R

安装 DataKit Operator

DataKit Operator 是 DataKit 在 Kubernetes 编排的联动项目,旨在协助 Datakit 更方便的部署,以及其他诸如验证、注入的功能。

目前 Datakit-Operator 提供以下功能:

  • 注入 DDTrace SDK(Java/Python/Node.js)以及对应环境变量信息,参见文档
  • 注入 Sidecar logfwd 服务以采集容器内日志,参见文档
  • 支持 Datakit 采集器的任务选举,参见文档
  • 在本最佳实践案例中,operator主要负责注入DDTrace SDK以及对应环境变量信息,并实现无侵入式接入业务应用链路数据(APM)。

下载 datakit-operator.yaml ,步骤如下:

wget https://static.guance.com/datakit-operator/datakit-operator.yaml

配置相关环境变量

{
    "server_listen": "0.0.0.0:9543",
    "log_level":     "info",
    "admission_inject": {
        "ddtrace": {
            "enabled_namespaces":     [],
            "enabled_labelselectors": [],
            "images": {
                "java_agent_image":   "pubrepo.guance.com/datakit-operator/dd-lib-java-init:v1.30.1-guance",
                "python_agent_image": "pubrepo.guance.com/datakit-operator/dd-lib-python-init:v1.6.2",
                "js_agent_image":     "pubrepo.guance.com/datakit-operator/dd-lib-js-init:v3.9.2"
            },
            "envs": {
                "DD_AGENT_HOST":           "datakit-service.datakit.svc",
                "DD_TRACE_AGENT_PORT":     "9529",
                "DD_JMXFETCH_STATSD_HOST": "datakit-service.datakit.svc",
                "DD_JMXFETCH_STATSD_PORT": "8125",
                "DD_SERVICE":              "{fieldRef:metadata.labels['service']}",
                "POD_NAME":                "{fieldRef:metadata.name}",
                "POD_NAMESPACE":           "{fieldRef:metadata.namespace}",
                "NODE_NAME":               "{fieldRef:spec.nodeName}",
                "DD_TAGS":                 "pod_name:$(POD_NAME),pod_namespace:$(POD_NAMESPACE),host:$(NODE_NAME)"
            }
        },
        "logfwd": {
            "options": {
                "reuse_exist_volume": "false"
            },
            "images": {
                "logfwd_image": "pubrepo.guance.com/datakit/logfwd:1.28.1"
            }
        },
        "profiler": {
            "images": {
                "java_profiler_image":   "pubrepo.guance.com/datakit-operator/async-profiler:0.1.0",
                "python_profiler_image": "pubrepo.guance.com/datakit-operator/py-spy:0.1.0",
                "golang_profiler_image": "pubrepo.guance.com/datakit-operator/go-pprof:0.1.0"
            },
            "envs": {
                "DK_AGENT_HOST":  "datakit-service.datakit.svc",
                "DK_AGENT_PORT":  "9529",
                "DK_PROFILE_VERSION": "1.2.333",
                "DK_PROFILE_ENV": "prod",
                "DK_PROFILE_DURATION": "240",
                "DK_PROFILE_SCHEDULE": "0 * * * *"
            }
        }
    }
}

enabled_namespaces 和 enabled_labelselectors 配置

enabled_namespacesenabled_labelselectorsddtrace 专属,可以对匹配到的 Pod 资源执行注入,不需要再给 Pod 添加 Annotation。它们的写法如下:

{
    "server_listen": "0.0.0.0:9543",
    "log_level":     "info",
    "admission_inject": {
        "ddtrace": {
            "enabled_namespaces": [
                {
                    "namespace": "testns",  # 指定 namespace
                    "language": "java"      # 指定需要注入的 agent 语言
                }
            ],
            "enabled_labelselectors": [
                {
                    "labelselector": "app=log-output",  # 指定 labelselector
                    "language": "java"                  # 指定需要注入的 agent 语言
                }
            ]
            # other..
        }
    }
}

如果一个 Pod 即满足 enabled_namespaces 规则,又满足 enabled_labelselectors ,以 enabled_labelselectors 配置为准。

其中 admission_inject 包含三个配置模块 ddtrace、logfwd、profile ,在本案例中我们需要关注 ddtrace 相关配置,如图:

图片

在 enabled_namespaces 的配置中填写业务应用的 namespace 或者相关 labelselectotrs(本案例中的 namespace 是 default )这样就可以根据相关 namespace 找到并拦截业务 yaml 并注入配置信息和镜像。

执行安装

kubectl apply -f datakit-operator.yaml

重启应用

重启需要使用 APM 的应用 pod。

实践效果

在本次实践活动中,我们通过模拟用户访问若依系统的页面来生成流量数据,并故意引入一些错误以测试系统的响应。通过这种方式,我们可以观察到在观测云控制台的「应用性能监控」(APM)模块中,若依系统已经成功接入了应用性能监控服务。这表明我们能够实时监控和分析系统的性能指标,确保其稳定运行。

图片

在业务访问过程中产生的错误,我们同样可以在观测云的 APM(应用性能监控)页面上实时查看。这使得我们能够及时发现并处理系统中的问题,确保业务的顺畅运行。

图片


观测云
21 声望85 粉丝

云时代的系统可观测平台