跳到主要内容

K8s 方式采集

前置条件

前置条件
  1. 需要安装好 light-agent,具体安装步骤查看 Lighthouse 平台【数据采集】
  2. 区分 light-agent 是否安装在 Kubernetes 集群中
  • 如果 light-agent 安装在 Kubernetes 集群中,在安装 light-agent 的时候,已经将镜像导入到 Kubernetes 可以访问的仓库
  • 如果 light-agent 安装在 Kubernetes 集群外,需要将 kube-state-metrics 的镜像导入到 Kubernetes 可以访问的仓库。具体步骤查看 Lighthouse 平台【数据采集】-> 【Kubernetes】-> 推送镜像到 Kubernetes 的镜像仓库
  1. 需要安装好 k8s-operator ,具体安装步骤查看 Kubenetes 安装 k8s-operator

1. 添加 Java 的 Automatic Instrumentation

kubectl apply -f automatic-instrumentation-java.yaml
automatic-instrumentation-java.yaml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: auto-instr
namespace: default
spec:
propagators:
- tracecontext
- baggage
- b3
sampler:
type: parentbased_traceidratio
argument: "1"
java:
image: ghcr.io/open-telemetry/opentelemetry-operator/autoinstrumentation-java:1.33.5
env:
- name: OTEL_INSTRUMENTATION_KAFKA_ENABLED
value: "false"
- name: OTEL_INSTRUMENTATION_REDISCALA_ENABLED
value: "false"
- name: OTEL_BSP_MAX_EXPORT_BATCH_SIZE
value: "512"
- name: OTEL_EXPORTER_OTLP_COMPRESSION
value: "gzip"
- name: OTEL_BSP_SCHEDULE_DELAY
value: "5000"
- name: OTEL_EXPORTER_OTLP_PROTOCOL
value: "http/protobuf"
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: "http://light-agent.light-agent.svc.cluster.local:54318"

操作过程

[root@master tpls]# kubectl apply -f automatic-instrumentation-java.yaml
instrumentation.opentelemetry.io/auto-instr created
[root@master tpls]# kubectl get instrumentation
NAME AGE ENDPOINT SAMPLER SAMPLER ARG
auto-instr 22s http://light-agent.monitoring.svc.cluster.local:54318 parentbased_traceidratio 1
[root@master tpls]#

2. 启动 Java Demo

kubect apply -f java-demo.yaml
java-demo.yaml
apiVersion: v1
kind: Pod
metadata:
name: java-app
namespace: default
labels:
app: java-app
annotations:
instrumentation.opentelemetry.io/inject-java: "true" # 添加这个注解
spec:
containers:
- image: docker.elastic.co/demos/apm/k8s-webhook-test
imagePullPolicy: Always
name: java-app
env:
# 这是 java agent 的配置,trace 到指定的具体类和函数
- name: OTEL_INSTRUMENTATION_METHODS_INCLUDE
value: "test.Testing[methodB]"

操作过程

[root@master tpls]# kubectl apply -f java-demo.yaml
pod/java-app created
[root@master tpls]# kubectl get pod
NAME READY STATUS RESTARTS AGE
java-app 1/1 Running 0 37s

3. 观察自动注入的效果

进入 java-app 的容器,查看环境变量,是否包含 -javaagentOTEL_EXPORTER_OTLP_ENDPOINT...

[root@master deployment]# kubectl exec -it java-app sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
Defaulted container "java-app" out of: java-app, opentelemetry-auto-instrumentation-java (init)
# printenv
OTEL_BSP_SCHEDULE_DELAY=5000
KUBERNETES_SERVICE_PORT=443
KUBERNETES_PORT=tcp://10.43.0.1:443
LANGUAGE=en_US:en
OTEL_EXPORTER_OTLP_PROTOCOL=http/protobuf
JAVA_TOOL_OPTIONS= -javaagent:/otel-auto-instrumentation-java/javaagent.jar
HOSTNAME=java-app
OTEL_SERVICE_NAME=java-app
HOME=/root
OTEL_INSTRUMENTATION_KAFKA_ENABLED=false
JAVA_VERSION=jdk-17.0.9+9
OTEL_TRACES_SAMPLER=parentbased_traceidratio
OTEL_TRACES_SAMPLER_ARG=1
TERM=xterm
KUBERNETES_PORT_443_TCP_ADDR=10.43.0.1
PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
OTEL_INSTRUMENTATION_METHODS_INCLUDE=test.Testing[methodB]
OTEL_PROPAGATORS=tracecontext,baggage
KUBERNETES_PORT_443_TCP_PORT=443
KUBERNETES_PORT_443_TCP_PROTO=tcp
LANG=en_US.UTF-8
OTEL_NODE_IP=192.168.2.159
OTEL_EXPORTER_OTLP_ENDPOINT=http://light-agent.light-agent.svc.cluster.local:54318
OTEL_RESOURCE_ATTRIBUTES_NODE_NAME=node2
OTEL_BSP_MAX_EXPORT_BATCH_SIZE=512
KUBERNETES_SERVICE_PORT_HTTPS=443
KUBERNETES_PORT_443_TCP=tcp://10.43.0.1:443
OTEL_EXPORTER_OTLP_COMPRESSION=gzip
JAVA_HOME=/opt/java/openjdk
LC_ALL=en_US.UTF-8
OTEL_RESOURCE_ATTRIBUTES=k8s.container.name=java-app,k8s.namespace.name=default,k8s.node.name=node2,k8s.pod.name=java-app,service.instance.id=default.java-app.java-app
KUBERNETES_SERVICE_HOST=10.43.0.1
PWD=/
OTEL_INSTRUMENTATION_REDISCALA_ENABLED=false
OTEL_POD_IP=10.42.2.157
OTEL_RESOURCE_ATTRIBUTES_POD_NAME=java-app