k8s opentelemetry 部署
·
准备一个k8s 平台

进行部署:cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.19.4/cert-manager.yaml

进行部署
# 可以参考官方文档
https://opentelemetry.io/zh/docs/platforms/kubernetes/operator/
operator 方式部署:
opentelemetry operator 部署
wget https://gh.llkk.cc/https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
# 下载完成后,进入这个文件中的17686添加一个
# --enable-go-instrumentation=true # go 的自动注入
# --enable-nginx-instrumentation=true # nginx的自动注入
kubectl apply -f opentelemetry-operator.yaml
验证是否部署成功:

helm operator 部署
进行安装helm
wget https://get.helm.sh/helm-v4.1.1-linux-amd64.tar.gz
tar zxvf helm-v4.1.1-linux-amd64.tar.gz
mv linux-amd64/helm /usr/bin/helm
开始配置镜像仓库和下载:
helm repo add open-telemetry https://open-telemetry.github.io/opentelemetry-helm-charts # 添加仓库
helm repo update # 进行更新最新的
helm repo list # 进行查看是否配置成功
helm pull open-telemetry/opentelemetry-operator # 进行下载到本地
tar zxvf opentelemetry-operator-0.106.0.tgz


开始进行部署:
cd opentelemetry-operator
kubectl create ns opentelemetry-collector-system
# 修改values.yaml中的87行修改成true
85 autoInstrumentation:
86 go:
87 enabled: true
# 开始进行部署:
helm install opentelemetry-collector -n opentelemetry-collector-system .
开始部署collector服务
# opentelemetry-Collector.yaml
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
name: otel
spec:
config: |
# 接收器配置 - 定义如何接收遥测数据
receivers:
# OTLP (OpenTelemetry Protocol) 接收器
otlp:
protocols:
# gRPC协议端点 - 用于接收gRPC格式的遥测数据
grpc:
endpoint: 0.0.0.0:4317
# HTTP协议端点 - 用于接收HTTP格式的遥测数据
http:
endpoint: 0.0.0.0:4318
# 导出器配置 - 定义遥测数据的发送目标
exporters:
# 调试导出器 - 支持链路追踪、指标、日志
# 用于调试,输出详细的遥测数据信息到日志
# 注意:v0.86.0之前使用 `logging` 代替 `debug`
debug:
verbosity: detailed
# prometheusremotewrite:
# endpoint: 'http://prometheus:9090/api/v1/write'
# # 开始普罗米接口:
# prometheus:
# endpoint: "0.0.0.0:9464" # prometheus指标暴露端口
processors:
# 批处理器 - 将遥测数据分批发送,提高传输效率
batch:
timeout: 10s
send_batch_size: 1024
# 服务配置 - 定义启用的扩展和数据处理管道
service:
# 遥测配置 - 日志和性能监控配置
telemetry:
logs:
# 日志级别:debug(调试信息最详细)
level: debug
# 数据管道配置 - 定义各类遥测数据的处理流程
pipelines:
# 链路追踪管道 - 处理分布式追踪数据
traces:
receivers: [ otlp ] # 从OTLP接收器接收数据
processors: [ batch ] # 使用批处理器处理数据
exporters: [ debug ] # 使用调试导出器输出追踪数据
# 指标管道 - 处理性能指标数据
metrics:
receivers: [ otlp ] # 从OTLP接收器接收数据
processors: [] # 不使用处理器,直接转发
exporters: [ debug ] # 导出到Prometheus远程存储
# 日志管道 - 处理应用日志数据
logs:
receivers: [ otlp ] # 从OTLP接收器接收数据
processors: [ batch ] # 使用批处理器处理数据
exporters: [ debug ] # 导出到Loki日志存储

开始配置自动注入
# 参考官方文档:https://opentelemetry.io/zh/docs/platforms/kubernetes/operator/automatic/
# opentelemetry-instrumentation.yaml
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
name: otel-instrumentation
spec:
exporter:
endpoint: http://otel-collector:4317
propagators:
- tracecontext
- baggage
- b3
sampler:
type: parentbased_traceidratio
argument: "1"
python:
env:
# Required if endpoint is set to 4317.
# Python autoinstrumentation uses http/proto by default
# so data must be sent to 4318 instead of 4317.
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://otel-collector:4318
dotnet:
env:
# Required if endpoint is set to 4317.
# Dotnet autoinstrumentation uses http/proto by default
# See https://github.com/open-telemetry/opentelemetry-dotnet-instrumentation/blob/888e2cd216c77d12e56b54ee91dafbc4e7452a52/docs/config.md#otlp
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://otel-collector:4318
go:
env:
# Required if endpoint is set to 4317.
# Go autoinstrumentation uses http/proto by default
# so data must be sent to 4318 instead of 4317.
- name: OTEL_EXPORTER_OTLP_ENDPOINT
value: http://otel-collector:4318

服务开启进行配置自动注入:
这边写了一个简单的服务:
package main
import (
"github.com/gin-gonic/gin"
)
func main() {
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.JSON(200, gin.H{"message": "pong"})
})
router.Run() // 默认监听 0.0.0.0:8080
}
// 可以使用我这边的镜像:里面也就是上面的服务
// swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/lushouxin/server:v1
开始给服务进行配置注释:
# server.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: server
name: server
spec:
replicas: 1
selector:
matchLabels:
app: server
strategy: {}
template:
metadata:
labels:
app: server
annotations:
instrumentation.opentelemetry.io/inject-go: "true"
instrumentation.opentelemetry.io/otel-go-auto-target-exe: "/app/main" # 我服务的路径
spec:
containers:
- image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/lushouxin/server:v1
name: server
securityContext:
privileged: true
runAsUser: 0
---
apiVersion: v1
kind: Service
metadata:
labels:
app: server
name: server
spec:
ports:
- port: 8080
protocol: TCP
targetPort: 8080
selector:
app: server
type: NodePort
status:
loadBalancer: {}
进行验证

kubectl logs -f otel-collector-6bc6d65657-b6swn
开始进行配置存放数据的配置:这边服务暂时都通过deploy的方式安装,生产环境建议使用其他方式如helm等
开始配置普罗米修斯:
# prometheus.yaml
apiVersion: v1
data:
prometheus.yml: |
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
scrape_configs:
- job_name: "prometheus"
static_configs:
- targets: ["localhost:9090"]
- job_name: "otel"
metrics_path: "/metrics"
scrape_interval: 5s
static_configs:
- targets: ["otel-collector:8889"]
kind: ConfigMap
metadata:
name: prometheus
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: prometheus
name: prometheus
spec:
replicas: 1
selector:
matchLabels:
app: prometheus
template:
metadata:
labels:
app: prometheus
spec:
volumes:
- name: prometheus
configMap:
name: prometheus
containers:
- image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/prom/prometheus:v3.10.0
name: prometheus
args:
- --config.file=/etc/prometheus/prometheus.yml
- --enable-feature=otlp-write-receiver
volumeMounts:
- name: prometheus
mountPath: /etc/prometheus/prometheus.yml
subPath: prometheus.yml
---
apiVersion: v1
kind: Service
metadata:
labels:
app: prometheus
name: prometheus
spec:
ports:
- port: 9090
protocol: TCP
targetPort: 9090
selector:
app: prometheus
type: NodePort
开始部署jaeger:
# jaeger.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: jaeger
name: jaeger
spec:
replicas: 1
selector:
matchLabels:
app: jaeger
strategy: {}
template:
metadata:
labels:
app: jaeger
spec:
containers:
- image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/jaegertracing/all-in-one:1.71.0
name: all-in-one
env:
- name: "COLLECTOR_ZIPKIN_HOST_PORT"
value: ":9411"
ports:
- name: http
containerPort: 4318
- name: grpc
containerPort: 4317
- name: web
containerPort: 16686
---
apiVersion: v1
kind: Service
metadata:
labels:
app: jaeger
name: jaeger
spec:
ports:
- name: port-1
port: 4318
protocol: TCP
targetPort: 4318
- name: port-2
port: 4317
protocol: TCP
targetPort: 4317
- name: port-3
port: 16686
protocol: TCP
targetPort: 16686
selector:
app: jaeger
type: NodePort
status:
loadBalancer: {}
开始安装loki:
apiVersion: v1
data:
loki.yml: |
auth_enabled: false
server:
http_listen_port: 3100
## 专用于接收处理OTEL数据
limits_config:
allow_structured_metadata: true
volume_enabled: true
common:
path_prefix: /tmp/loki
replication_factor: 1
instance_addr: 0.0.0.0
ring:
kvstore:
store: inmemory
storage_config:
tsdb_shipper:
active_index_directory: /tmp/loki/index
cache_location: /tmp/loki/index_cache
filesystem:
directory: /tmp/loki/chunks
pattern_ingester:
enabled: true
compactor:
retention_enabled: true
retention_delete_delay: 720h
delete_request_store: filesystem
schema_config:
configs:
- from: 2024-10-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: otlp_
period: 24h
kind: ConfigMap
metadata:
name: loki
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: loki
labels:
app: loki
spec:
replicas: 1
selector:
matchLabels:
app: loki
template:
metadata:
labels:
app: loki
spec:
volumes:
- name: loki
configMap:
name: loki
containers:
- name: loki
image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/grafana/loki:3.4.1
args:
- "-config.file=/mnt/config/loki.yml" # 使用 ConfigMap 中的 loki.yml
ports:
- containerPort: 3100
name: http
volumeMounts:
- name: loki
mountPath: /mnt/config/loki.yml
subPath: loki.yml
---
apiVersion: v1
kind: Service
metadata:
labels:
app: loki
name: loki
spec:
ports:
- port: 3100
protocol: TCP
targetPort: 3100
selector:
app: loki
type: NodePort
status:
loadBalancer: {}
开始配置OpenTelemetry 配置文件:
# opentelemetry-operator.yaml
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
name: otel
spec:
image: ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector:0.145.0
config: |
receivers:
otlp:
protocols:
grpc:
endpoint: 0.0.0.0:4317
http:
endpoint: 0.0.0.0:4318
exporters:
debug:
verbosity: detailed
prometheusremotewrite:
endpoint: 'http://prometheus:9090/api/v1/write'
otlp_grpc/tempo:
endpoint: http://tempo:4317
tls:
insecure: true
otlp_grpc/jaeger:
# 这个
endpoint: jaeger:4317
tls:
insecure: true
otlp_http/loki:
endpoint: http://loki:3100/otlp
tls:
insecure: true
processors:
batch:
timeout: 10s
send_batch_size: 1024
service:
telemetry:
logs:
level: debug
pipelines:
traces:
receivers: [ otlp ]
processors: [ batch ]
exporters: [ debug,otlp_grpc/tempo,otlp_grpc/jaeger ]
metrics:
receivers: [ otlp ]
processors: [ batch ]
exporters: [ debug,prometheusremotewrite]
logs:
receivers: [ otlp ]
processors: [ batch ]
exporters: [ debug,otlp_http/loki ]
# 开始进行加载配置:
kubectl apply -f opentelemetry-operator.yaml
开始进行验证是否把链路数据写入到jaeger 中:



发现链路没有问题之后,开始把jaeger替换成tempo
部署数据存储:rustfs
# 默认用户名和密码:rustfsadmin
# rustfs.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: rustfs
name: rustfs
spec:
replicas: 1
selector:
matchLabels:
app: rustfs
strategy: {}
template:
metadata:
labels:
app: rustfs
spec:
containers:
- image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/rustfs/rustfs:1.0.0-alpha.85
name: rustfs
args: ["/data"]
resources: {}
ports:
- containerPort: 9000
name: api
- containerPort: 9001
name: web
---
apiVersion: v1
kind: Service
metadata:
labels:
app: rustfs
name: rustfs
spec:
ports:
- name: api
port: 9000
protocol: TCP
targetPort: 9000
- name: web
port: 9001
protocol: TCP
targetPort: 9001
selector:
app: rustfs
type: NodePort
status:
loadBalancer: {}

开始部署tempo
helm repo add grafana https://grafana.github.io/helm-charts
helm repo update
helm pull grafana/tempo
开始部署grafana
# Grafana server Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
name: grafana
spec:
selector:
matchLabels:
name: grafana
template:
metadata:
labels:
name: grafana
spec:
containers:
- image: swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/grafana/grafana:12.3.3
name: grafana
ports:
- containerPort: 3000
name: ui
---
# Grafana UI Service NodePort
apiVersion: v1
kind: Service
metadata:
labels:
name: grafana
name: grafana
spec:
ports:
- name: grafana-ui
port: 3000
targetPort: 3000
selector:
name: grafana
type: NodePort
更多推荐
所有评论(0)