一文搞懂基于 OpenTelemetry 進(jìn)行 Kubernetes 全鏈路觀測(cè)
Hello folks,我是 Luga,今天我們來(lái)聊一下云原生生態(tài)核心技術(shù)—— 可觀測(cè)性,即 “基于 OpenTelemetry 進(jìn)行 Kubernetes 全鏈路觀測(cè)” 。
一、基于 OpenTelemetry 徹底改變我們的觀測(cè)意識(shí)
隨著組織越來(lái)越多地采用 Kubernetes 來(lái)部署和管理應(yīng)用程序,Kubernetes 已成為事實(shí)上的容器編排標(biāo)準(zhǔn)。在這樣的動(dòng)態(tài) Kubernetes 環(huán)境中,觀測(cè)資源對(duì)于確保平臺(tái)上運(yùn)行的應(yīng)用程序的健康至關(guān)重要。
然而,動(dòng)態(tài)的 Kubernetes 環(huán)境給觀測(cè)帶來(lái)了很大的復(fù)雜性。應(yīng)用程序不斷地進(jìn)行擴(kuò)展、部署和更新,傳統(tǒng)的依賴(lài)代理或輪詢(xún)的監(jiān)控技術(shù)無(wú)法滿(mǎn)足 Kubernetes 環(huán)境的需求,因?yàn)樗鼈儫o(wú)法跟上環(huán)境變化的速度和分布式架構(gòu)的復(fù)雜性。
如果無(wú)法及時(shí)提供實(shí)時(shí)觀測(cè)功能,將導(dǎo)致平均解決時(shí)間(MTTR)的增加。這將顯著影響應(yīng)用程序的整體可用性和性能,對(duì)業(yè)務(wù)本身產(chǎn)生負(fù)面影響。
為了克服傳統(tǒng)監(jiān)控解決方案的這些缺點(diǎn),技術(shù)團(tuán)隊(duì)依靠使用 OpenTelemetry 的創(chuàng)新方法來(lái)觀測(cè) Kubernetes 環(huán)境。通過(guò)采用 OpenTelemetry,我們可以使用標(biāo)準(zhǔn)化的方法來(lái)收集、處理和導(dǎo)出遙測(cè)數(shù)據(jù)。
OpenTelemetry 提供了一套統(tǒng)一的 API 和工具,使得在 Kubernetes 環(huán)境中收集和處理遙測(cè)數(shù)據(jù)變得更加簡(jiǎn)單和一致。它支持跨語(yǔ)言和跨平臺(tái),可以與不同的組件和工具集成。這使得管理員能夠?qū)崟r(shí)監(jiān)測(cè)應(yīng)用程序的性能指標(biāo)、日志和跟蹤數(shù)據(jù),并使用可視化工具進(jìn)行分析和故障排除。
通過(guò) OpenTelemetry,技術(shù)團(tuán)隊(duì)可以更好地了解 Kubernetes 環(huán)境中應(yīng)用程序的行為和性能,快速識(shí)別和解決潛在的問(wèn)題。這將有助于減少 MTTR,提高應(yīng)用程序的可用性,并確保業(yè)務(wù)能夠正常運(yùn)行。
二、當(dāng)前觀測(cè) Kubernetes 所面臨的挑戰(zhàn)
傳統(tǒng)觀測(cè) Kubernetes 環(huán)境面臨一些挑戰(zhàn),這些挑戰(zhàn)可能限制組織對(duì)其應(yīng)用程序和基礎(chǔ)設(shè)施的完整可見(jiàn)性和細(xì)粒度控制。
- 復(fù)雜性:Kubernetes 是一個(gè)高度復(fù)雜的容器編排平臺(tái),由多個(gè)組件和服務(wù)組成。傳統(tǒng)的觀測(cè)方法可能無(wú)法有效應(yīng)對(duì)這種復(fù)雜性,導(dǎo)致難以收集和分析相關(guān)的監(jiān)控?cái)?shù)據(jù)。
- 動(dòng)態(tài)性:Kubernetes 環(huán)境中的應(yīng)用程序和資源拓?fù)渫ǔJ莿?dòng)態(tài)變化的,包括 Pod 的創(chuàng)建、刪除、縮放等操作。傳統(tǒng)觀測(cè)方法可能無(wú)法及時(shí)跟蹤這些變化,導(dǎo)致監(jiān)控?cái)?shù)據(jù)的準(zhǔn)確性和一致性受到影響。
- 高度分布式:Kubernetes 環(huán)境中的應(yīng)用程序通常是分布式的,由多個(gè)容器和服務(wù)組成。傳統(tǒng)的觀測(cè)方法可能無(wú)法提供對(duì)分布式系統(tǒng)的全面可見(jiàn)性,導(dǎo)致難以追蹤和分析應(yīng)用程序的端到端性能和依賴(lài)關(guān)系。
- 多樣性:Kubernetes 生態(tài)系統(tǒng)中存在多種不同的組件和工具,用于不同的觀測(cè)需求,例如 Prometheus、Grafana、ELK 堆棧等。組織可能需要整合和管理這些不同的工具,以獲得全面的觀測(cè)能力。
- 彈性和可擴(kuò)展性:Kubernetes 環(huán)境的彈性和可擴(kuò)展性使得應(yīng)用程序的規(guī)模和負(fù)載模式可能隨時(shí)發(fā)生變化。傳統(tǒng)觀測(cè)方法可能無(wú)法有效應(yīng)對(duì)這種變化,導(dǎo)致監(jiān)控?cái)?shù)據(jù)的準(zhǔn)確性和時(shí)效性受到影響。
面對(duì)這些挑戰(zhàn),組織需要采用更先進(jìn)的觀測(cè)方法和工具,如 OpenTelemetry,以應(yīng)對(duì) Kubernetes 環(huán)境的復(fù)雜性和動(dòng)態(tài)性,提供更全面和準(zhǔn)確的觀測(cè)能力。這樣可以幫助組織更好地理解和管理其應(yīng)用程序和基礎(chǔ)設(shè)施,提高性能和可用性,并加快故障排除和問(wèn)題解決的速度。
OpenTelemetry 提供了一種方法,可以從應(yīng)用程序和 Kubernetes 環(huán)境中收集這些觀測(cè)參數(shù),包括輕松實(shí)現(xiàn)分布式跟蹤。這使得組織能夠快速識(shí)別和診斷問(wèn)題,從而提高故障排除的效率。
通過(guò) OpenTelemetry,組織可以獲得更全面的可見(jiàn)性,了解應(yīng)用程序的各個(gè)組件之間的相互依賴(lài)關(guān)系和性能表現(xiàn)。它提供了一種標(biāo)準(zhǔn)化的方式來(lái)收集和傳輸監(jiān)控?cái)?shù)據(jù),使組織能夠深入了解應(yīng)用程序的運(yùn)行狀況,并快速響應(yīng)潛在的問(wèn)題。
因此,使用 OpenTelemetry 可以幫助組織克服傳統(tǒng)觀測(cè)方法的局限性,提供更全面、細(xì)粒度的觀測(cè)能力,從而提高對(duì)分布式應(yīng)用程序的理解和故障診斷能力。
三、揭秘 OpenTelemetry 在觀測(cè) Kubernetes 中的關(guān)鍵作用
盡管有多種方法可以對(duì) Kubernetes 進(jìn)行觀測(cè),但與傳統(tǒng)的觀測(cè)選項(xiàng)相比,使用 OpenTelemetry 提供了更多的優(yōu)勢(shì)。然而,如果完全忽視對(duì)業(yè)務(wù)應(yīng)用程序的觀測(cè),可能會(huì)對(duì)其性能和可用性產(chǎn)生嚴(yán)重而可怕的影響。
忽視觀測(cè)意味著組織將無(wú)法準(zhǔn)確地了解應(yīng)用程序的運(yùn)行狀況和健康狀態(tài)。沒(méi)有及時(shí)的觀測(cè)數(shù)據(jù),組織將無(wú)法獲得關(guān)鍵的指標(biāo)和指示器,以評(píng)估應(yīng)用程序的性能表現(xiàn)和資源利用情況。這將使組織難以發(fā)現(xiàn)潛在的性能瓶頸、資源爭(zhēng)用或其他可能導(dǎo)致應(yīng)用程序性能下降和可用性問(wèn)題的因素。
而同時(shí),缺乏觀測(cè)將導(dǎo)致組織擁有更長(zhǎng)的平均解決時(shí)間(MTTR),因?yàn)榻M織將沒(méi)有必要的指標(biāo)來(lái)有效和高效地識(shí)別應(yīng)用程序中問(wèn)題的根本原因。通過(guò)監(jiān)控 Kubernetes Cluster 中的關(guān)鍵組件,可以顯著降低 MTTR。
組織可能會(huì)在沒(méi)有充分觀測(cè)其 Kubernetes 環(huán)境的情況下遇到一些問(wèn)題,例如 Kubernetes Pod 崩潰循環(huán)、持續(xù)的卷故障和作業(yè)故障。所有這些問(wèn)題都會(huì)導(dǎo)致 Kubernetes 環(huán)境和在這些資源上運(yùn)行的應(yīng)用程序出現(xiàn)嚴(yán)重的停機(jī)時(shí)間和性能問(wèn)題。
另一個(gè)需要通過(guò)充分觀測(cè)來(lái)改進(jìn)的關(guān)鍵方面是識(shí)別應(yīng)用程序的分布式組件和運(yùn)行這些服務(wù)的基礎(chǔ)設(shè)施之間的依賴(lài)關(guān)系所需的端到端可見(jiàn)性。如果對(duì)應(yīng)用程序的整體情況缺乏了解,組織就無(wú)法對(duì)可能出現(xiàn)的問(wèn)題進(jìn)行分析和深入研究,從而增加了縮小根本原因和減少平均解決時(shí)間(MTTR)的復(fù)雜性。
觀測(cè)還為異常檢測(cè)奠定了基礎(chǔ),這允許組織識(shí)別與應(yīng)用程序正常操作不符的行為。這一點(diǎn)在嘗試解決可能影響應(yīng)用程序性能的異常時(shí)變得尤為重要。
OpenTelemetry 提供的額外好處確保了觀測(cè)實(shí)施不當(dāng)造成的挑戰(zhàn)最小化,團(tuán)隊(duì)可以通過(guò)解決 MTTR 時(shí)間增加、可見(jiàn)性有限等問(wèn)題來(lái)充分利用這些功能。因此,使用 OpenTelemetry 觀測(cè) Kubernetes 是至關(guān)重要的。
四、最佳實(shí)踐:確定關(guān)鍵觀測(cè)目標(biāo)
在收集和分析來(lái)自 Kubernetes 環(huán)境的指標(biāo)時(shí),有一些關(guān)鍵指標(biāo)需要考慮。以下內(nèi)容提供了組織所需收集的關(guān)鍵指標(biāo)的良好基礎(chǔ)知識(shí)。
1.Node 指標(biāo)
此指標(biāo)提供有關(guān)各個(gè) Kubernetes Cluster節(jié)點(diǎn)性能和資源使用情況的詳細(xì)信息,包括 CPU、內(nèi)存和網(wǎng)絡(luò)使用情況。通過(guò)監(jiān)測(cè)節(jié)點(diǎn)指標(biāo),可以了解到節(jié)點(diǎn)的負(fù)載狀況,發(fā)現(xiàn)資源瓶頸并進(jìn)行容量規(guī)劃。
2.Pod 指標(biāo)
此指標(biāo)提供有關(guān)在節(jié)點(diǎn)上運(yùn)行的 Pod 資源使用和操作的信息,包括 CPU、內(nèi)存和網(wǎng)絡(luò)使用情況。通過(guò)監(jiān)測(cè) Pod 指標(biāo),可以了解到每個(gè) Pod 的資源消耗情況,識(shí)別資源密集型的 Pod 并進(jìn)行優(yōu)化。
3.Container 指標(biāo)
此指標(biāo)提供有關(guān) Pod 中運(yùn)行的各個(gè)容器性能和資源使用情況的詳細(xì)信息,包括 CPU、內(nèi)存和網(wǎng)絡(luò)使用情況。通過(guò)監(jiān)測(cè)容器指標(biāo),可以深入了解每個(gè)容器的資源消耗情況,找到資源泄漏或不良配置的容器并進(jìn)行調(diào)整。
4.API Server 指標(biāo)
此指標(biāo)包括請(qǐng)求延遲、響應(yīng)時(shí)間和錯(cuò)誤率,提供有關(guān) Kubernetes API 服務(wù)器功能和可用性的詳細(xì)信息。通過(guò)監(jiān)測(cè) API 服務(wù)器指標(biāo),可以了解API服務(wù)器的性能狀況,識(shí)別潛在的性能瓶頸和故障情況。
5.Etcd 指標(biāo)
此指標(biāo)包括磁盤(pán)使用情況、響應(yīng)時(shí)間和錯(cuò)誤率,提供有關(guān) Etcd Cluster 操作和狀態(tài)的詳細(xì)信息。通過(guò)監(jiān)測(cè) Etcd 指標(biāo),可以了解 Etcd Cluster 的健康狀況、性能瓶頸和故障情況。
通過(guò)收集和分析這些關(guān)鍵指標(biāo),組織可以獲得關(guān)于 Kubernetes 環(huán)境中 Node、Pod、Container、API Server 和 Etcd Cluster 的詳細(xì)信息。這將幫助組織實(shí)時(shí)監(jiān)測(cè)和優(yōu)化 Cluster 性能,提高應(yīng)用程序的可靠性和性能。
五、基于 OpenTelemetry 進(jìn)行 Kubernetes 的解決方案
在 Kubernetes 上部署一個(gè) OpenTelemetry 收集器,這個(gè)收集器將負(fù)責(zé)接收和處理跟蹤數(shù)據(jù)。一旦部署完成,我們可以使用 OpenTelemetry 提供的 OTEL 檢測(cè)庫(kù)(基于 Go 語(yǔ)言編寫(xiě)的應(yīng)用程序)將跟蹤數(shù)據(jù)發(fā)送到收集器。
一旦跟蹤數(shù)據(jù)到達(dá)收集器,它將被傳送到 Jaeger 收集器,進(jìn)一步處理和存儲(chǔ)。最后,我們可以使用 Jaeger 的用戶(hù)界面(UI)來(lái)可視化這些跟蹤數(shù)據(jù),以便更好地理解應(yīng)用程序的性能和行為。
下面的圖示展示了這個(gè)流程,包括應(yīng)用程序、OpenTelemetry 收集器和 Jaeger 之間的交互,以及跟蹤數(shù)據(jù)的流動(dòng)路徑。具體可參考:
在此方案中,我們的 OTEL 設(shè)置如下所示:
在實(shí)際的業(yè)務(wù)場(chǎng)景中,OpenTelemetry 可與 Kubernetes 結(jié)合使用,從 Kubernetes Cluster 上運(yùn)行的容器化應(yīng)用程序收集遙測(cè)數(shù)據(jù)。OpenTelemetry 提供了多個(gè) Kubernetes 特定的組件和集成,使我們可以輕松地在 Kubernetes 環(huán)境中收集和處理遙測(cè)數(shù)據(jù)。
這些包括:
1.Kubernetes 特定的工具
Kubernetes API 服務(wù)器、Etcd、Kubelet 等。這些儀器可用于生成用于 Pod 創(chuàng)建、刪除和擴(kuò)展等操作的遙測(cè)數(shù)據(jù)。
2.Kubernetes 元數(shù)據(jù)注入
自動(dòng)將 Kubernetes 特定的元數(shù)據(jù)(例如 Pod 名稱(chēng)、Pod 命名空間和容器 ID)注入到遙測(cè)數(shù)據(jù)中。這樣可以更輕松地將遙測(cè)數(shù)據(jù)與 Kubernetes 特定的元數(shù)據(jù)關(guān)聯(lián)起來(lái),并診斷與容器化應(yīng)用程序相關(guān)的問(wèn)題。
3.Kubernetes 感知采樣
根據(jù) Kubernetes 特定的元數(shù)據(jù)(例如 Pod 名稱(chēng)、命名空間或服務(wù)名稱(chēng))采樣遙測(cè)數(shù)據(jù)。這有助于減少發(fā)送到后端的遙測(cè)數(shù)據(jù)量并提高性能。
4.Kubernetes 部署
OpenTelemetry 可以部署為 Kubernetes 部署或守護(hù)進(jìn)程集,從而可以輕松在 Kubernetes 環(huán)境中擴(kuò)展和管理 OpenTelemetry 組件。
通過(guò)基于 OpenTelemetry 的 Kubernetes 解決方案,我們可以實(shí)現(xiàn)對(duì) Kubernetes Cluster 中應(yīng)用程序的端到端監(jiān)測(cè)和可觀察性,從而幫助我們更好地理解應(yīng)用程序的性能、排查問(wèn)題,并采取適當(dāng)?shù)膬?yōu)化措施,以提高應(yīng)用程序的可靠性和性能。
六、實(shí)施 OpenTelemetry 的核心步驟
通過(guò)實(shí)施 OpenTelemetry 來(lái)觀測(cè) Kubernetes 環(huán)境,團(tuán)隊(duì)組織可以收集和分析各種指標(biāo),并將這些指標(biāo)與從應(yīng)用程序的不同部分收集的其他指標(biāo)相關(guān)聯(lián),以更好地了解整體應(yīng)用程序的性能。
在實(shí)際的業(yè)務(wù)場(chǎng)景中,如下是正確實(shí)施 OpenTelemetry 來(lái)觀測(cè) Kubernetes 環(huán)境的四個(gè)易于遵循的核心步驟,具體可參考:
1.安裝 OpenTelemetry Collector
首先,我們需要正確安裝 OpenTelemetry Collector。Collector 是用于接收、處理和導(dǎo)出遙測(cè)數(shù)據(jù)的組件。我們可以根據(jù)官方文檔提供的指南,在 Kubernetes Cluster 上安裝和配置 Collector。
在 Kubernetes Cluster 中,可以將 OpenTelemetry 代理配置為一個(gè) DaemonSet,以確保代理在 Cluster 中的每個(gè)節(jié)點(diǎn)上都能運(yùn)行。通過(guò)以下命令可以安裝代理:
[leonli@LugaLab ~ ] % kubectl apply -f https://github.com/open-telemetry/opentelemetry-operator/releases/latest/download/opentelemetry-operator.yaml
當(dāng)然,這里,我們還可以使用 Helm Charts 進(jìn)行安裝 :https://github.com/open-telemetry/opentelemetry-helm-charts/tree/main/charts/opentelemetry-operator
2.配置 OpenTelemetry Collector
一旦安裝了 Collector,我們需要配置它以收集所需的指標(biāo)和數(shù)據(jù)。配置文件可以指定要收集的指標(biāo)類(lèi)型、導(dǎo)出器(用于將數(shù)據(jù)發(fā)送到后端)以及其他特定的收集器設(shè)置。通過(guò)仔細(xì)配置 Collector,我們可以根據(jù)組織的需求來(lái)定制數(shù)據(jù)收集和導(dǎo)出。
OTel 支持多種后端,包括 Prometheus、Jaeger 和 Zipkin。具體配置可參考如下示例:
receivers:
otlp:
protocols:
grpc:
exporters:
prometheus:
endpoint: "localhost:4444"
jaeger:
endpoint: "http://jaeger:14268/api/traces"
service:
pipelines:
traces:
receivers: [otlp]
processors: []
exporters: [jaeger, prometheus]
3.在 Kubernetes 應(yīng)用程序中啟用 OpenTelemetry 檢測(cè)
為了在 Kubernetes 應(yīng)用程序中啟用 OpenTelemetry 檢測(cè),我們通常需要在應(yīng)用程序代碼中添加 OpenTelemetry SDK。SDK 提供了用于在應(yīng)用程序中插入代碼以收集指標(biāo)、跟蹤請(qǐng)求和記錄日志的 API。通過(guò)在應(yīng)用程序中使用 OpenTelemetry SDK,我們可以捕獲關(guān)鍵的性能數(shù)據(jù)和上下文信息。
4.將數(shù)據(jù)發(fā)送到首選的后端
最后一步,我們需要配置 OpenTelemetry Collector 將收集到的數(shù)據(jù)發(fā)送到所首選的后端。后端可以是各種數(shù)據(jù)存儲(chǔ)和分析平臺(tái),如 Prometheus、Grafana、Jaeger 等。根據(jù)我們的需求和環(huán)境,選擇合適的后端,并配置收集器以將數(shù)據(jù)導(dǎo)出到該后端。
這里,以 Jaeger 后端為例,它提供了各種可視化選項(xiàng),使我們可以輕松理解 Kubernetes Cluster 中的請(qǐng)求流,并支持各種跟蹤格式,包括 OTel 等,具體可參考如下所示:
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
name: simple-prod
spec:
strategy: allInOne
allInOne:
image: jaegertracing/all-in-one:latest
options:
log-level: debug
在確?;?Kubernetes 的應(yīng)用程序的性能、可靠性和可用性方面,觀測(cè) Kubernetes 是至關(guān)重要的。OpenTelemetry 為觀測(cè) Kubernetes 環(huán)境提供了一個(gè)強(qiáng)大的框架,利用分布式跟蹤、指標(biāo)和日志記錄等功能。
通過(guò)遵循最佳實(shí)踐并利用適當(dāng)?shù)墓ぞ?,?OpenTelemetry 和其他工具,我們可以實(shí)時(shí)了解 Kubernetes Cluster 的狀態(tài),從而提升應(yīng)用程序的性能。
隨著 Kubernetes 的廣泛應(yīng)用,強(qiáng)大的觀測(cè)策略比以往任何時(shí)候都更為重要。通過(guò)實(shí)施 OpenTelemetry 和其他監(jiān)控工具,您可以避免潛在問(wèn)題,并確保 Kubernetes 環(huán)境的平穩(wěn)運(yùn)行。
這些監(jiān)控工具可以幫助我們收集和分析關(guān)鍵的指標(biāo)、跟蹤請(qǐng)求的路徑,并記錄關(guān)鍵事件和日志。通過(guò)實(shí)時(shí)觀測(cè) Kubernetes Cluster,我們可以及時(shí)發(fā)現(xiàn)潛在的問(wèn)題,追蹤性能瓶頸,并采取適當(dāng)?shù)拇胧﹣?lái)優(yōu)化和調(diào)整應(yīng)用程序。
總而言之,通過(guò)實(shí)施 OpenTelemetry 及其他類(lèi)似觀測(cè)工具,我們可以建立強(qiáng)大的觀測(cè)策略,從而確?;?Kubernetes 的應(yīng)用程序的性能和可靠性。這樣,我們將能夠及時(shí)發(fā)現(xiàn)和解決問(wèn)題,提高應(yīng)用程序的可用性,并為用戶(hù)提供更好的體驗(yàn)。