全链路状态跟踪 程序插桩
后端Jaeger
资源清单
yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jaeger
namespace: otel
spec:
replicas: 1
selector:
matchLabels:
app: jaeger
template:
metadata:
labels:
app: jaeger
spec:
containers:
- name: jaeger
image: jaegertracing/jaeger:2.3.0
env:
- name: COLLECTOR_OTLP_ENABLED
value: "true"
# - name: SPAN_STORAGE_TYPE # 生产环境需要配置存储
# value: elasticsearch
# - name: ES_SERVER_URLS
# value: http://elasticsearch.jaeger.svc.cluster.local:9200
ports:
- containerPort: 16686
- containerPort: 4317
- containerPort: 4318
- containerPort: 5778
- containerPort: 9411
---
apiVersion: v1
kind: Service
metadata:
annotations:
# openELB靠注解来绑定
lb.kubesphere.io/v1alpha1: openelb
eip.openelb.kubesphere.io/v1alpha2: layer2-eip
name: jaeger
namespace: otel
spec:
selector:
app: jaeger
ports:
- name: ui
protocol: TCP
port: 16686
targetPort: 16686
- name: grpc
port: 4317
targetPort: 4317
- name: http
port: 4318
targetPort: 4318
- port: 5778
targetPort: 5778
- port: 9411
targetPort: 9411
type: LoadBalancer
在k8s中快速使用Jaeger和OpenTelemetry 安装cert-manager和OpenTelemetry Operator 官方指南
cert-manager
自动化 Kubernetes 集群中 TLS 证书的颁发和管理
bash
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.16.1/cert-manager.yaml
OpenTelemetry Operator
简化 OpenTelemetry 组件 (例如 Collector、Agent) 的部署、配置和管理
bash
kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
OpenTelemetry Collector
collector接受数据推送到后端,比如jaeger
yml
kind: OpenTelemetryCollector
metadata:
name: otel
namespace: otel
spec:
config: |
receivers:
otlp:
protocols:
grpc:
http:
processors:
memory_limiter:
check_interval: 15
limit_percentage: 75
spike_limit_percentage: 15
batch:
send_batch_size: 10000
timeout: 105
exporters:
otlp/jaeger:
endpoint: "jaeger.otel.svc.cluster.local:4317"
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [memory_limiter, batch]
exporters: [otlp/jaeger]
endpoint根据实际地址修改
Instrumentation配置(插桩)
Instrumentation 是 Otel Operator 的另一个 CRD,用于自动安装 Otel 探针和配置:
- propagators 用于配置跟踪信息在上下文的传递方式。
- tracecontext:用于传递跟踪信息的标准格式。
- baggage:允许将额外的信息与请求一起传递,通常用于实现一些额外的元数据传递。
- b3:一种流行的分布式跟踪格式,支持多种上下文传播方式。
- sampler 采样器
- env 和 [language].env添加到容器的境変量
yml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: instrumentation-sample
spec:
propagators:
- tracecontext
- baggage
- b3
sampler:
type: always_on
env:
# 环境变量 指定收集器ENDPOINT
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: otel-collector.otel.svc.cluster.local:4317
java:
env:
# 这里必须有http协议,端口必须是grpc端口
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://otel-collector.otel.svc.cluster.local:4317
# 测试用,关闭了metrics收集
- name: OTEL_METRICS_EXPORTER
value: none
java项目示例
注解插桩,会自动使用Instrumentation配置,在pod内部多运行一个init container推送给otel-collector
yml
apiVersion: apps/v1
kind: Deployment
metadata:
name: java-sample
spec:
replicas: 1
selector:
matchLabels:
app: java-sample
template:
metadata:
labels:
app: java-sample
annotations:
# 注解插桩
instrumentation.opentelemetry.io/inject-java: "true"
spec:
containers:
- name: java-sample
image: chompujaa/spring-boot-web:v1
ports:
- containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: java-sample
annotations:
lb.kubesphere.io/v1alpha1: openelb
eip.openelb.kubesphere.io/v1alpha2: layer2-eip
spec:
selector:
app: java-sample
ports:
- protocol: TCP
port: 8080
targetPort: 8080
type: LoadBalancer