kubernetes部署jaeger
# 引言
在 Kubernetes 中为 Java 和 Go 程序实现链路追踪(Distributed Tracing)的最主流、最推荐的组合。
- OpenTelemetry(OTel):统一的标准化探针,支持 Java 和 Go 的自动/手动埋点。
- Jaeger:优秀的可视化后端,CNCF 项目,在 Kubernetes 上部署成熟。
# 第一步:安装cert-manager(依赖)
#在国内会出现镜像拉取问题,可以修改成代理镜像地址也可以直接拉取到本地,填写本地镜像地址
# 先下载 yaml
curl -LO https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
# 批量替换镜像源
#搜索quay.io
kubectl apply -f cert-manager.yaml
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
报错问题,如果安装报错,删除不干净执行下面操作。清理 CRD(避免冲突)
kubectl delete crd \
certificates.cert-manager.io \
certificaterequests.cert-manager.io \
challenges.acme.cert-manager.io \
clusterissuers.cert-manager.io \
issuers.cert-manager.io \
orders.acme.cert-manager.io \
--ignore-not-found
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# 第二步:安装 OpenTelemetry Operator
# 下载 operator yaml
curl -LO https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
# 替换 ghcr.io 为阿里云加速镜像
#搜索ghcr.io
kubectl apply -f opentelemetry-operator.yaml
# 验证
kubectl get pods -n opentelemetry-operator-system
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 第三步:部署 Jaeger v2(All-in-one,内存存储,开发/测试用)
[root@k8s-master01 jaeger]# cat jaeger-allinone.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: jaeger
namespace: observability
labels:
app: jaeger
spec:
replicas: 1
selector:
matchLabels:
app: jaeger
template:
metadata:
labels:
app: jaeger
spec:
containers:
- name: jaeger
image: docker.cnb.cool/zzppjj/docker-images/jaeger:2.1.0
ports:
- containerPort: 4317 # OTLP gRPC
- containerPort: 4318 # OTLP HTTP
- containerPort: 16686 # Jaeger UI
env:
- name: SPAN_STORAGE_TYPE
value: memory
---
apiVersion: v1
kind: Service
metadata:
name: jaeger
namespace: observability
spec:
selector:
app: jaeger
ports:
- name: otlp-grpc
port: 4317
targetPort: 4317
- name: otlp-http
port: 4318
targetPort: 4318
- name: ui
port: 16686
targetPort: 16686
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 第四步:部署 OpenTelemetry Collector
[root@k8s-master01 jaeger]# cat otel-collector.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: otel-collector-config
namespace: observability
data:
config.yaml: |
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
processors:
batch:
timeout: 1s
exporters:
otlp/jaeger:
endpoint: jaeger.observability.svc.cluster.local:4317
tls:
insecure: true
service:
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [otlp/jaeger]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: otel-collector
namespace: observability
spec:
replicas: 1
selector:
matchLabels:
app: otel-collector
template:
metadata:
labels:
app: otel-collector
spec:
containers:
- name: otel-collector
image: docker.cnb.cool/zzppjj/docker-images/opentelemetry-collector-contrib:0.105.0
args: ["--config=/conf/config.yaml"]
volumeMounts:
- name: config
mountPath: /conf
ports:
- containerPort: 4317
- containerPort: 4318
volumes:
- name: config
configMap:
name: otel-collector-config
---
apiVersion: v1
kind: Service
metadata:
name: otel-collector
namespace: observability
spec:
selector:
app: otel-collector
ports:
- name: otlp-grpc
port: 4317
- name: otlp-http
port: 4318
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# 第五步:应用接入
# 第五步:应用接入
# Java(Spring Boot)
在 pom.xml 中添加:
xml
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-spring-boot-starter</artifactId>
<version>2.6.0</version>
</dependency>
1
2
3
4
5
2
3
4
5
application.yaml 配置:
spring:
application:
name: my-java-service
management:
tracing:
sampling:
probability: 1.0
otel:
exporter:
otlp:
endpoint: http://otel-collector.observability.svc.cluster.local:4318
service:
name: my-java-service
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Go
// tracer.go
package tracer
import (
"context"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
"go.opentelemetry.io/otel/sdk/resource"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
)
func InitTracer(ctx context.Context) (*sdktrace.TracerProvider, error) {
exporter, err := otlptracegrpc.New(ctx,
otlptracegrpc.WithEndpoint("otel-collector.observability:4317"),
otlptracegrpc.WithInsecure(),
)
if err != nil {
return nil, err
}
res, _ := resource.New(ctx,
resource.WithAttributes(
semconv.ServiceName("my-go-service"),
),
)
tp := sdktrace.NewTracerProvider(
sdktrace.WithBatcher(exporter),
sdktrace.WithResource(res),
sdktrace.WithSampler(sdktrace.AlwaysSample()),
)
otel.SetTracerProvider(tp)
return tp, nil
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# 第六步:访问 Jaeger UI
kubectl port-forward svc/jaeger 16686:16686 -n observability
1
浏览器打开 http://localhost:16686

上次更新: 2026/05/30, 22:51:34
|