OpenTelemetry 部署模式
OpenTelemetry Collector 按部署方式分為 Agent 和Gateway 模式。
Agent 模式
在 Agent 模式下,OpenTelemetry 檢測的應用程序將數據發送到與應用程序一起駐留的(收集器)代理。然后,該代理程序將接管并處理所有來自應用程序的追蹤數據。
收集器可以通過 sidecar 方式部署為代理,sidecar 可以配置為直接將數據發送到存儲后端。
Gateway 模式
Gateway 模式則是將數據發送到另一個 OpenTelemetry 收集器,然后從(中心)收集器進一步將數據發送到存儲后端。在這種配置中,我們有一個中心的 OpenTelemetry 收集器,它使用 deployment/statefulset/daemonset
模式部署,具有許多優勢,如自動擴展。
發送遙測數據最佳實踐是將數據發送到OpenTelemetry Collector而不是直接發送到后端。Collector可以幫助簡化密鑰管理,將數據導出與應用程序解耦,并允許您在遙測數據中添加其他數據。
部署 OpenTelemetry
建議使用 OpenTelemetry Operator 來部署,因為它可以幫助我們輕松部署和管理 OpenTelemetry 收集器,還可以自動檢測應用程序。具體可參考文檔https://opentelemetry.io/docs/platforms/kubernetes/operator/
部署cert-manager
因為 Operator 使用了 Admission Webhook 通過 HTTP 回調機制對資源進行校驗/修改。Kubernetes 要求 Webhook 服務必須使用 TLS,因此 Operator 需要為其 webhook server 簽發證書,所以需要先安裝cert-manager。
# wget https://github.com/cert-manager/cert-manager/releases/latest/download/cert-manager.yaml
# kubectl apply -f cert-manager.yaml
# kubectl get pod -n cert-manager
NAME READY STATUS RESTARTS AGE
cert-manager-5577849d6c-kwg7f 1/1 Running 0 3m18s
cert-manager-cainjector-5755f77bbb-knlm2 1/1 Running 0 3m18s
cert-manager-webhook-b78d65b96-vpvrn 1/1 Running 0 3m18s
部署Operator
在 Kubernetes 上使用 OpenTelemetry,主要就是部署 OpenTelemetry 收集器。
# wget https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
# kubectl apply -f opentelemetry-operator.yaml
# kubectl get pod -n opentelemetry-operator-system
NAME READY STATUS RESTARTS AGE
opentelemetry-operator-controller-manager-6d94c5db75-cz957 2/2 Running 0 74s
# kubectl get crd |grep opentelemetry
instrumentations.opentelemetry.io 2025-04-21T09:48:53Z
opampbridges.opentelemetry.io 2025-04-21T09:48:54Z
opentelemetrycollectors.opentelemetry.io 2025-04-21T09:48:54Z
targetallocators.opentelemetry.io 2025-04-21T09:48:54Z
部署Collector(中心)
接下來我們部署一個精簡版的 OpenTelemetry Collector,用于接收 OTLP 格式的 trace 數據,通過 gRPC 或 HTTP 協議接入,經過內存控制與批處理后,打印到日志中以供調試使用。
# cat center-collector.yaml
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector
# 元數據定義部分
metadata:name: center # Collector 的名稱為 centernamespace: opentelemetry
# 具體的配置內容
spec:replicas: 1 # 設置副本數量為1config: # 定義 Collector 配置receivers: # 接收器,用于接收遙測數據(如 trace、metrics、logs)otlp: # 配置 OTLP(OpenTelemetry Protocol)接收器protocols: # 啟用哪些協議來接收數據grpc: endpoint: 0.0.0.0:4317 # 啟用 gRPC 協議http: endpoint: 0.0.0.0:4318 # 啟用 HTTP 協議processors: # 處理器,用于處理收集到的數據batch: {} # 批處理器,用于將數據分批發送,提高效率exporters: # 導出器,用于將處理后的數據發送到后端系統debug: {} # 使用 debug 導出器,將數據打印到終端(通常用于測試或調試)service: # 服務配置部分pipelines: # 定義處理管道traces: # 定義 trace 類型的管道receivers: [otlp] # 接收器為 OTLPprocessors: [batch] # 使用批處理器exporters: [debug] # 將數據打印到終端# kubectl apply -f center-collector.yaml
opentelemetrycollector.opentelemetry.io/center created
# kubectl get pod -n opentelemetry
NAME READY STATUS RESTARTS AGE
center-collector-5c5987f4ff-zwqbk 1/1 Running 0 9s
# kubectl get svc -n opentelemetry
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
center-collector ClusterIP 10.109.226.90 <none> 4317/TCP,4318/TCP 22s
center-collector-headless ClusterIP None <none> 4317/TCP,4318/TCP 22s
center-collector-monitoring ClusterIP 10.110.106.116 <none> 8888/TCP 22s
部署Collector(代理)
我們使用 Sidecar 模式部署 OpenTelemetry 代理。該代理會將應用程序的追蹤發送到我們剛剛部署的中心OpenTelemetry 收集器。
# cat sidecar-collector.yaml
apiVersion: opentelemetry.io/v1beta1
kind: OpenTelemetryCollector # 定義資源類型為 OpenTelemetryCollector
metadata:name: sidecar # Collector 的名稱namespace: opentelemetry
spec:mode: sidecar # 以 sidecar 模式運行(與應用容器同 Pod)config: # Collector 配置部分(結構化 YAML)receivers:otlp: # 使用 OTLP 協議作為接收器protocols:grpc: endpoint: 0.0.0.0:4317 # 啟用 gRPC 協議http: endpoint: 0.0.0.0:4318 # 啟用 HTTP 協議processors:batch: {} # 使用 batch 處理器將數據批量發送,提高性能exporters:debug: {} # 將數據輸出到 stdout 日志(用于調試)otlp: # 添加一個 OTLP 類型導出器,發送到 central collectorendpoint: "center-collector.opentelemetry.svc:4317" # 替換為 central collector 的地址tls:insecure: true # 不使用 TLSservice:telemetry:logs:level: "debug" # 設置 Collector 自身日志等級為 debug(方便觀察日志)pipelines:traces: # 定義 trace 數據處理流水線receivers: [otlp] # 從 otlp 接收 trace 數據processors: [batch] # 使用批處理器exporters: [debug, otlp] # 同時導出到 debug(日志)和 otlp(中心 Collector)
# kubectl apply -f sidecar-collector.yaml
opentelemetrycollector.opentelemetry.io/sidecar created
# kubectl get opentelemetrycollectors -n opentelemetry
NAME MODE VERSION READY AGE IMAGE MANAGEMENT
center deployment 0.123.1 1/1 10m ghcr.io/open-telemetry/opentelemetry-collector-releases/opentelemetry-collector:0.123.1 managed
sidecar sidecar 0.123.1 11s managed
# kubectl get pod -n opentelemetry
NAME READY STATUS RESTARTS AGE
center-collector-5c5987f4ff-zwqbk 1/1 Running 0 10m
sidecar 代理依賴于應用程序啟動,因此現在創建后并不會立即啟動,需要我們創建一個應用程序并使用這個 sidecar 模式的 collector。
查看更多
崔亮的博客-專注devops自動化運維,傳播優秀it運維技術文章。更多原創運維開發相關文章,歡迎訪問https://www.cuiliangblog.cn