在 Kubernetes 中無侵入安裝 OpenTelemetry 探針

背景

OpenTelemetry 探針

OpenTelemetry(簡稱 Otel芳室,最新的版本是 1.27) 是一個用于觀察性的開源項目,提供了一套工具糙箍、APIs 和 SDKs渤愁,用于收集、處理和導(dǎo)出遙測數(shù)據(jù)(如指標(biāo)深夯、日志和追蹤信息)抖格。應(yīng)用程序遙測數(shù)據(jù)(如追蹤、指標(biāo)和日志)的收集是通過探針來完成的咕晋,探針通常以庫的形式集成到應(yīng)用程序中雹拄,自動捕獲重要信息協(xié)助監(jiān)控和調(diào)試。OpenTelemetry 探針支持市面上大多數(shù)的編程語言掌呜,探針的安裝(通常被稱為插樁滓玖,Instrumentation)分為手動和自動兩種方式。

  • 手動插樁:指開發(fā)者直接在其應(yīng)用程序代碼中顯式地添加遙測數(shù)據(jù)收集的代碼质蕉,需要手動完成 SDK 初始化势篡、插入追蹤點、添加上下文信息等一系列操作模暗。
  • 自動插樁:利用 OpenTelemetry 提供的庫自動捕獲應(yīng)用程序的遙測數(shù)據(jù)禁悠,無需或只需很少的代碼更改。比如兑宇,Java 通過 javaagent 實現(xiàn)探針的自動安裝碍侦。

二者各有優(yōu)劣:手動插樁適用于需要高度定制和精確控制遙測數(shù)據(jù)收集的場景;自動插樁適合快速啟動和簡化集成,特別是在使用標(biāo)準(zhǔn)框架和庫的應(yīng)用程序中瓷产。

OpenTelemetry Operator 介紹

OpenTelemetry Operator 是一個為了簡化 OpenTelemetry 組件在 Kubernetes 環(huán)境中的部署和管理而設(shè)計的 Kubernetes Operator站玄。

OpenTelemetry Operator 通過 CRD(OpenTelemetryCollectorInstrumentation濒旦、OpAMPBridge) 實現(xiàn)在 Kubernetes 集群中自動部署和管理 OpenTelemetry Collector株旷;在工作負(fù)載中自動安裝 OpenTelemetry 探針。

今天我們就將體驗如何使用 OpenTelemetry Operator 自動安裝探針疤估,實現(xiàn)鏈路跟蹤灾常。

演示

架構(gòu)

這是演示的架構(gòu),Otel 提供了 多種語言的 instrumentation SDK铃拇,這篇文章中我們將使用 Java 和 Go 兩種語言的應(yīng)用钞瀑。這兩種語言會使用全自動和半自動的注入安裝:

  • Java 全自動注入安裝,Otel Operator 通過使用 init container 引入 sdk 慷荔,并通過 JAVA_TOOL_OPTIONS 來指定 javaagent 來插樁雕什。這里將使用 pinakispecial/spring-boot-rest 鏡像來運行一個簡單的 Spring Boot REST 服務(wù)。
  • Go 半自動注入安裝显晶,為什么是半自動贷岸?Go 的全自動是通過 eBPF 的方式實現(xiàn)的:在 Pod 注入獨立的容器,加載 BPF 程序磷雇。但是 eBPF 的實現(xiàn)對內(nèi)核要求十分苛刻 5.4 - 5.14偿警。這里演示半自動的方式:手動引入 Go instrumentation SDK自動注入配置唯笙。

Jaeger

為了便于演示這里使用 jaegertracing/all-in-one 鏡像來部署 Jaeger螟蒸,這個鏡像包含了 Jaeger 收集器、內(nèi)存存儲崩掘、查詢服務(wù)和 UI 等組件七嫌,非常適合開發(fā)和測試使用。

通過環(huán)境變量 COLLECTOR_OTLP_ENABLED 啟動對 OTLP(OpenTelemetry Protocol) 的支持苞慢。

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jaeger
spec:
  replicas: 1
  selector:
    matchLabels:
      app: jaeger
  template:
    metadata:
      labels:
        app: jaeger
    spec:
      containers:
      - name: jaeger
        image: jaegertracing/all-in-one:latest
        env:
        - name: COLLECTOR_OTLP_ENABLED
          value: "true"
        ports:
        - containerPort: 16686
        - containerPort: 14268
---
apiVersion: v1
kind: Service
metadata:
  name: jaeger
spec:
  selector:
    app: jaeger
  type: ClusterIP
  ports:
    - name: ui
      port: 16686
      targetPort: 16686
    - name: collector
      port: 14268
      targetPort: 14268
    - name: http
      protocol: TCP
      port: 4318
      targetPort: 4318
    - name: grpc
      protocol: TCP
      port: 4317
      targetPort: 4317      
EOF

安裝 cert-manager

Otel Operator 依賴 cert-manager 進(jìn)行證書的管理诵原,安裝 operator 之前需要安裝 cert-manager。

kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.2/cert-manager.yaml

安裝 OpenTelemetry Operator

執(zhí)行下面命令安裝 Otel Operator

kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml

配置 OpenTelemetry Collector

通過創(chuàng)建 CR OpenTelemetryCollector 來配置 Otel 的采集器挽放,這里我們配置了:

  • otel 接收器:支持 grpc(端口 4317)和 http(端口 4318
  • memory_limiterbatch 處理器绍赛,但是為了方便快速查看數(shù)據(jù),這兩個并沒有啟用辑畦,僅作展示用惹资。
  • debugotlp/jaeger 的輸出器,分別用于在標(biāo)準(zhǔn)輸出中打印信息和使用 otlp 協(xié)議輸出到 Jaeger航闺。
  • pipeline 服務(wù),用于配置跟蹤數(shù)據(jù)的處理流程:接收、處理和輸出潦刃。
kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: OpenTelemetryCollector
metadata:
  name: otel
spec:
  config: |
    receivers:
      otlp:
        protocols:
          grpc:
          http:
    processors:
      memory_limiter:
        check_interval: 1s
        limit_percentage: 75
        spike_limit_percentage: 15
      batch:
        send_batch_size: 10000
        timeout: 10s

    exporters:
      debug:
      otlp/jaeger:
        endpoint: "jaeger.default:4317"
        tls:
          insecure: true

    service:
      pipelines:
        traces:
          receivers: [otlp]
          processors: []
          exporters: [debug,otlp/jaeger]
EOF

創(chuàng)建 CR OpenTelemetryCollector 后侮措,Otel Operator 會創(chuàng)建一個 deployment 和 多個 service。

kubectl get deployment,service -l app.kubernetes.io/component=opentelemetry-collector
NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/otel-collector   1/1     1            1           12h

NAME                                TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                               AGE
service/otel-collector              ClusterIP   10.43.152.81    <none>        4317/TCP,4318/TCP,8889/TCP,9411/TCP   12h
service/otel-collector-headless     ClusterIP   None            <none>        4317/TCP,4318/TCP,8889/TCP,9411/TCP   12h
service/otel-collector-monitoring   ClusterIP   10.43.115.103   <none>        8888/TCP                              12h

Collector 部署的四種部署模型 Deployment乖杠、DaemonSet分扎、StatefulSet、Sidecar胧洒,默認(rèn)為 Deployment畏吓。

配置 Instrumentation

Instrumentation 是 Otel Operator 的另一個 CRD,用于自動安裝 Otel 探針和配置:

  • propagators 用于配置跟蹤信息在上下文的傳遞方式卫漫。
  • sampler 采樣器
  • env[language].env 添加到容器的環(huán)境變量

更多配置說明菲饼,請參考 Instrumentation API 文檔

kubectl apply -f - <<EOF
apiVersion: opentelemetry.io/v1alpha1
kind: Instrumentation
metadata:
  name: instrumentation-sample
spec:
  propagators:
    - tracecontext
    - baggage
    - b3
  sampler:
    type: parentbased_traceidratio
    argument: "1"
  env:
    - name: OTEL_EXPORTER_OTLP_ENDPOINT
      value: otel-collector.default:4318
  java:    
    env:
      - name: OTEL_EXPORTER_OTLP_ENDPOINT
        value: http://otel-collector.default:4317   
EOF

Java 示例應(yīng)用

為 Pod 添加注解 instrumentation.opentelemetry.io/inject-java: "true" 通知 Otel Operator 該應(yīng)用的類型以便注入正確的探針列赎。

kubectl apply -f - <<EOF
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: pinakispecial/spring-boot-rest
        ports:
        - containerPort: 8080
EOF

可以看到 Otel Operator 向 Pod 中注入了一個 otel 的初始化容器宏悦。

以及在 java 容器中注入了一系列的環(huán)境變量進(jìn)行配置。

Go 示例應(yīng)用

前面提到 Go 語言的自動注入演示使用半自動的方式包吝,與本文的標(biāo)題不符饼煞,屬于嵌入式的。我寫了一個 簡單的 Go 應(yīng)用诗越,使用手動的方式來安裝 Otel 探針砖瞧,有興趣的可以查看源碼。

kubectl apply -f https://raw.githubusercontent.com/addozhang/http-sample/main/manifests/service-v1.yaml

查看 Pod 同樣可以看到通過環(huán)境變量的方式注入的 Otel 配置嚷狞。

測試

pod_name="$(kubectl get pod -n default -l app=service-a -o jsonpath='{.items[0].metadata.name}')"
kubectl port-forward $pod_name 8080:8080 &

curl localhost:8080
service-a(version: v1, ip: 10.42.0.68, hostname: service-a-5bf98748f5-l9pjw) -> service-b(version: v1, ip: 10.42.0.70, hostname: service-b-676c56fb98-rjbwv) -> service-c(version: v1, ip: 10.42.0.69, hostname: service-c-79985dc75d-bh68k)

發(fā)送請求后块促,打開 Jaeger UI。

jaeger_pod="$(kubectl get pod -l app=jaeger -o jsonpath='{.items[0].metadata.name}')"
kubectl port-forward $jaeger_pod 16686:16686 &

Bingo!

訪問 Jaeger UI 就可以看到這個訪問的鏈路信息了感耙。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褂乍,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子即硼,更是在濱河造成了極大的恐慌逃片,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件只酥,死亡現(xiàn)場離奇詭異褥实,居然都是意外死亡,警方通過查閱死者的電腦和手機裂允,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門损离,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人绝编,你說我怎么就攤上這事僻澎∶蔡ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵窟勃,是天一觀的道長祖乳。 經(jīng)常有香客問我,道長秉氧,這世上最難降的妖魔是什么眷昆? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮汁咏,結(jié)果婚禮上亚斋,老公的妹妹穿的比我還像新娘。我一直安慰自己攘滩,他們只是感情好帅刊,可當(dāng)我...
    茶點故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著轰驳,像睡著了一般厚掷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上级解,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天冒黑,我揣著相機與錄音,去河邊找鬼勤哗。 笑死抡爹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的芒划。 我是一名探鬼主播冬竟,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼民逼!你這毒婦竟也來了泵殴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤拼苍,失蹤者是張志新(化名)和其女友劉穎笑诅,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體疮鲫,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡吆你,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了俊犯。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妇多。...
    茶點故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖燕侠,靈堂內(nèi)的尸體忽然破棺而出者祖,到底是詐尸還是另有隱情立莉,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布七问,位于F島的核電站桃序,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏烂瘫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一奇适、第九天 我趴在偏房一處隱蔽的房頂上張望坟比。 院中可真熱鬧,春花似錦嚷往、人聲如沸葛账。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽籍琳。三九已至,卻和暖如春贷祈,著一層夾襖步出監(jiān)牢的瞬間趋急,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工势誊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呜达,地道東北人。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓粟耻,卻偏偏與公主長得像查近,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子挤忙,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容

  • 隨著技術(shù)的發(fā)展以及應(yīng)用對時延霜威、帶寬、安全的追求册烈,一個明顯的技術(shù)趨勢是越來越多的應(yīng)用組件將會被部署到企業(yè)所管理的網(wǎng)絡(luò)...
    DeepNoMind閱讀 507評論 0 0
  • 一戈泼、0xcc開篇 2020年3月,得物技術(shù)團(tuán)隊在三個月的時間內(nèi)完成了整個交易體系的重構(gòu)茄厘,交付了五彩石項目矮冬,業(yè)務(wù)系統(tǒng)...
    得物技術(shù)閱讀 451評論 0 1
  • 什么是OpenTelemetry? OpenTelemetry合并了OpenTracing和OpenCensus項...
    美晶云噠閱讀 2,200評論 0 0
  • 概述 OpenTelemetry 的自身定位很明確:數(shù)據(jù)采集和標(biāo)準(zhǔn)規(guī)范的統(tǒng)一次哈,對于數(shù)據(jù)如何去使用胎署、存儲、展示窑滞、告警...
    f7e0844744f8閱讀 22,119評論 0 1
  • 前言 隨著微服務(wù)的往多層分布式方向的發(fā)展琼牧,隨著業(yè)務(wù)的增長恢筝,系統(tǒng)的膨脹和升級。問題排查巨坊,性能分析撬槽,架構(gòu)優(yōu)化越來越復(fù)雜...
    越獄的靈感閱讀 216評論 0 1