改善 Kubernetes 日誌以增強可觀測性

2024-07-16     InfoQ

作者 | Prithvish Kovelamudi

譯者 | 張衛濱

策劃 | Tina

核心要點

  • Kubernetes 的分布式特性使得從容器、Pod 和節點等不同數據源收集和集中日誌變得很具挑戰性。容器動態創建和銷毀的環境,以及大量和高度生成的日誌數據均使傳統的日誌管理方式難以勝任。
  • 採用專門為 Kubernetes 的動態和分布式特性設計的容器原生日誌管理工具至關重要。這些工具,如 Elastic Stack(包括 Beats 和 Logstash)、Fluentd 和 Prometheus,提供了日誌聚合、容器感知日誌以及與 Kubernetes 對象集成等特性。
  • 實現高效的日誌收集策略(比如 sidecar 模式)、利用 Kubernetes 原生的特性(如 Logs API、Kubelet 日誌和 DaemonSets)並探索雲供應商的解決方案(AWS CloudWatch Logs、GCP Stackdriver、Azure Monitor),可以簡化和集中化日誌收集,降低複雜性和性能開銷。
  • 利用先進的日誌分析技術,包括藉助像 Kibana 和 Grafana 這樣的工具以儀錶盤的形式可視化日誌,設置日誌告警和監控,並使用那些提供日誌解析、查詢和基於機器學習的日誌分析功能的工具執行深度的日誌分析。
  • 本文重點介紹了有效管理 Kubernetes 日誌的最佳實踐,例如,標準化和集中化的日誌格式,實現日誌收集、解析和分析的自動化,以及通過適當的訪問控制和加密來保護敏感的日誌數據,從而確保安全性。

引 言

在微服務和容器化應用程式的時代,有效管理和監控應用程式的健康狀況和性能變得至關重要。Kubernetes 是一個開源系統,用於自動化部署、擴展和管理容器化的應用程式,它已經成為企業尋求敏捷性和韌性的首選解決方案。

但是,由於 Kubernetes 的分布式架構、高日誌量和動態化等特徵,在 Kubernetes 中管理日誌仍然是一項重大的挑戰。恰當的日誌可以提供對應用程式行為的重要洞察力,幫助開發和運維團隊快速診斷問題並維持高可靠性。

本文將會探討在 Kubernetes 中日誌管理的高級策略和最佳實踐。從高效的日誌收集和聚合到富有洞察力的分析技術,我們將會深入研究如何增強可觀測性。

通過採用容器原生的日誌工具、集中式的日誌收集並利用 Kubernetes 原生的特性,你將學會如何簡化日誌管理流程並獲得可操作的知識,從而確保你的應用程式能夠順利運行。

我們深入了解一下在 Kubernetes 環境中實現無縫日誌管理的挑戰、策略和最佳實踐。

理解 Kubernetes 中

日誌管理的挑戰

在深入探討具體的策略之前,我們先了解一下在 Kubernetes 中日誌管理所面臨的挑戰。了解這些挑戰有助於認識計劃詳盡的日誌管理策略的重要性。

Kubernetes 的分布式特徵

Kubernetes 採用了分布式的架構,容器會在集群中的多個節點上運行。這種分布式的特徵會從容器、Pod、節點和 Kubernetes 控制平面等不同數據源生成日誌。從多個位置收集和集中日誌可能會很複雜,尤其是在大規模部署的環境中更是如此。設想一下,如果一個錯誤源於跨多個容器的服務,那麼該如何排除故障呢?如果沒有集中式的日誌,找到相應的容器可能要花費數小時的時間。

日誌的數量和生成速度

容器和微服務是輕量級的,會產生大量的日誌。動態 Kubernetes 環境中容器的快速創建和銷毀進一步加快了日誌數據生成速度。大量湧入的日誌可能會讓傳統的日誌管理系統不堪重負,從而帶來存儲、處理和分析方面的挑戰。事實上,根據 CNCF 的一項調查,微服務產生的日誌數據是單體應用的 10 倍。在具有可自動擴展的動態集群中,數百個容器每天可能會產生數 GB 的日誌,所以實時分析至關重要。

日誌格式和上下文

容器和微服務通常會以不同的格式生成日誌,這給數據的解析和分析帶來了困難。此外,由於 Kubernetes 部署動態化的特徵,要了解日誌的上下文(比如,日誌來自哪個容器或 Pod)也很困難。出現問題的 Pod 所生成的日誌可能不會直接表明涉及的服務或節點,因此很難找出根本原因。

合規性和安全性

日誌通常包含敏感數據或者需要監管的信息。日誌管理欠佳可能會導致數據泄露或違背行業標準。在缺乏保障措施的情況下記錄個人身份信息(personally identifiable information,PII)可能會導致 GDPR 或 CCPA 數據保護規則的處罰。

在 Kubernetes 中有效

收集日誌的策略

日誌收集是日誌管理流程中至關重要的第一步。以下列出了在 Kubernetes 環境中,確保高效、全面收集日誌的策略:

擁抱容器原生的日誌

由於其動態性和分布式特性,Kubernetes 引入了一系列新的日誌需求。我們應該採用專門為該環境設計的容器原生日誌工具和框架。這些工具能夠理解在 Kubernetes 中記錄日誌的獨特挑戰,並提供日誌聚合、容器感知日誌以及與 Kubernetes 集成的特性。

容器原生日誌解決方案的樣例包括 Elastic Stack,它包含了用於輕量級數據傳輸的 Beats 和用於數據處理的 Logstash;Fluentd,它提供了靈活的日誌路由,並且支持多個輸出目的地;以及 Prometheus,它為度量指標提供了原生支持,並且可以擴展到日誌收集。

採用 Sidecar 模式集中收集日誌

Sidecar 模式會在每個 Pod 中部署一個日誌代理作為 sidecar 容器。該代理從 Pod 的主應用程式容器收集日誌,並將日誌發送到一個中心化的位置。無論節點或 Pod 位於何處,這種方式都能確保在整個集群中以一致的方式收集日誌。

Sidecar 模式通過為所有的日誌提供一致的接口,簡化了日誌的收集,使日誌基礎設施的管理和擴展都變得更加容易。

利用 Kubernetes 的原生特性

Kubernetes 提供了便於進行日誌收集的原生特性,比如:

  • Kubernetes Logs API:Kubernetes API 伺服器會暴露在 Pod 中運行的容器的日誌。我們能夠以編程的方式使用該 API 檢索日誌,從而實現中心化的收集。
  • Kubelet Logging:在每個節點上運行的 Kubelet 可以進行配置,以便於收集容器日誌,並將其發送至本地日誌文件或遠程日誌伺服器。
  • 用於集群範圍內日誌收集的 DaemonSets:使用 DaemonSets 將日誌代理部署到集群中的所有節點,從而確保在每個節點收集日誌。

通過利用這些原生特性,我們可以簡化日誌的收集,降低日誌基礎設施的複雜性。使用原生組件也會最大程度地降低性能方面的開銷。

探索雲供應商的日誌解決方案

如果你的 Kubernetes 集群託管在雲平台上,可以探索雲供應商所提供的日誌解決方案,例如:

  • Amazon Web Services(AWS):AWS 提供了 CloudWatch Logs,這是一項託管服務,可以收集和存儲在 AWS 上運行的 Kubernetes 集群的日誌。
  • Google Cloud Platform(GCP):GCP 提供了 Stackdriver,這是一個監控和日誌平台,能夠與 GCP 上運行的 Kubernetes 集群無縫集成。
  • Microsoft Azure:Azure Monitor 為 Azure 上部署的 Kubernetes 集群提供了全面的日誌功能。

這些雲供應商解決方案提供了無縫集成、簡化設置以及一些額外的特性,如日誌分析和告警。

有效的日誌管理策略

有效的日誌管理涉及高效存儲、處理和索引日誌,以便於快速分析和檢索。以下是優化日誌管理的一些策略:

實現日誌聚合和流式處理

日誌聚合涉及到從多個來源收集日誌並將其集中到一個位置,通常被稱為日誌聚合層。這個層可以是一個日誌管理平台(如 Elastic Stack),也可以是基於雲的日誌服務。

通過聚合日誌,可以簡化管理流程,降低分析來自不同數據源的日誌的複雜性。日誌流能夠確保日誌實時轉發到聚合層,以便於實現及時分析和告警。

優化日誌存儲和保存

Kubernetes 中生成的大量日誌會迅速消耗存儲空間。我們要實現優化日誌存儲的策略,例如:

  • 日誌輪轉:定期輪轉日誌,防止日誌文件無限增長。
  • 日誌壓縮:壓縮舊的日誌,以減少存儲的消耗。
  • 日誌歸檔:將舊日誌歸檔到更便宜的長期存儲解決方案中。

除此之外,還應該定義日誌的保存策略,根據日誌的重要性和監管要求,列出日誌應該保留的時間。這可以確保你不會保留不必要的日誌,從而降低存儲成本並提高日誌的搜索性能。

增強日誌的搜索和索引

快速搜索和檢索相關日誌對於高效排除故障非常重要。我們可以通過如下方式增強日誌的搜索和索引能力:

  • 為日誌添加標籤:使用標籤對日誌進行分類,使其更易於搜索和過濾。
  • 結構化日誌:鼓勵使用 JSON 或鍵 - 值對這樣的結構化日誌格式,以便更容易地解析日誌數據並創建索引。
  • 日誌索引工具:使用具有高級索引功能的日誌管理平台,以加快日誌日誌搜索的速度。

通過改進日誌的搜索和索引,我們可以減少故障的排查時間,更快地了解應用程式的行為。

分布式系統中的日誌架構示例

深入分析日誌的策略

在 Kubernetes 中分析日誌需要提取出有價值的見解,以提高應用程式的性能、識別潛在的問題並確保系統的健康。如下的這些策略有助於高效分析日誌:

使用儀錶盤可視化日誌

通過儀錶盤對日誌進行可視化,這樣能夠快速瀏覽系統的健康狀況和性能。創建可顯示重要日誌指標和趨勢的自定義儀錶盤,這樣可以及時發現異常並識別出問題。

例如,你可以使用 Kibana,它能夠為 Elasticsearch 中索引的日誌數據提供可自定義的儀錶盤。我們可以跟蹤錯誤率、響應時間和資源使用情況。Grafana 則非常適合將日誌和其他指標結合起來,提供一個全面的可觀測性儀錶盤。

日誌的可視化 Grafana 儀錶盤示例

設置日誌告警和監控

積極的日誌監控和告警可以幫助我們避免潛在的問題。請根據特定的日誌模式或異常情況設置日誌告警規則。例如,你可以為關鍵錯誤、安全漏洞或日誌量的激增配置告警。

將日誌管理平台與通知工具(如 Slack 或 PagerDuty)進行集成,以確保在出現關鍵問題時立即通知正確的團隊成員。

執行日誌分析

日誌分析涉及到深入挖掘日誌數據,以發現對系統的見解和趨勢。請使用提供高級分析功能(如日誌解析、日誌查詢和基於機器學習的日誌分析)的日誌管理平台。

例如,你可以針對特定的日誌模式或錯誤進行搜索,從而識別出某個問題的根本原因。機器學習算法能夠探測日誌數據中的異常情況,有助於將潛在的問題在影響用戶之前就識別出來。

為日誌添加標籤或標記

使用相關的元數據為日誌添加標籤,以提供更好的上下文並簡化過濾。這樣能夠根據應用程式、容器或嚴重性條件更快地搜索、過濾和分類日誌。利用 Kubernetes 原生的標籤或註解實現自動化標記。我們可以根據內部要求(如環境、版本或發布階段)應用自定義的標籤。

日誌管理和存儲解決方案

收集日誌只是第一步。要了解數據流的意義,最好有一個中心化的存儲解決方案。這就是像 Elasticsearch 和 Loki 這樣強大的日誌存儲解決方案能夠發揮作用的地方了。

  • Elasticsearch 和 Kibana 的強大組合:我們可以將 Elasticsearch 想像為一個巨大、有序的日誌倉庫。它能夠高效地存儲和索引數據,從而實現強大的過濾和搜索功能。與可視化工具 Kibana 組合,Elasticsearch 可以將日誌轉化為富有洞察力的儀錶盤和報告。
  • Loki 用於擴展日誌存儲:如果可擴展性是你比較關注的問題,那麼 Loki 可能就是你的救世主。這種可水平擴展的日誌存儲解決方案專門用於處理來自 Kubernetes 等雲原生環境的海量日誌數據。

另外,還有託管的日誌服務,它們負責整個日誌管理的基礎設施,為那些喜歡當甩手掌柜的人提供了便捷的可選方案。

Kubernetes 日誌管理的最佳實踐

遵循如下的最佳實踐可以簡化 Kubernetes 日誌的管理,並確保從數據中獲得最大的收益。標準化和集中化:

  • 一致性是關鍵!在所有的應用程式中統一日誌格式,以簡化分析和問題排查。此外,爭取使用集中式的日誌平台,將所有的日誌匯總到一個易於訪問的位置。
  • 自動化是你的益友:儘可能實現自動化。這包括使用像 Prometheus 這樣的工具實現日誌收集、解析和分析任務的自動化。讓機器來做這些繁重的工作,這樣你就可以專注於更高層次的任務了。
  • 安全方面的考量因素:日誌通常會包含敏感信息。不要讓它們落入壞人的手裡!對日誌數據要實現適當的訪問控制和加密,以確保只有授權用戶才能訪問這些數據。

案例研究:在 Kubernetes 環境中

使用 Elastic Stack 進行高效的日誌聚合

公司概況

某家專門從事實時金融交易和服務的中型金融科技公司在管理其基於 Kubernetes 的應用程式的大量日誌方面面臨重大挑戰。其現有的日誌管理解決方案難以跟上數據的規模和速度,影響了其有效監控、分析和響應系統行為的能力。

挑戰

隨著公司的發展,其服務的複雜性和 Kubernetes 集群中微服務的數量也在不斷增長。開發和運維團隊發現,由於以下原因,跟蹤和分析日誌變得越來越困難:

  • 各種服務的日誌格式不一致。
  • 難以關聯應用程式技術棧中不同組成部分的日誌。
  • 搜索和檢索相關日誌數據的延遲較高。 解決方案的實現

該公司實現了流行的日誌聚合方案 Elastic Stack 來解決這些挑戰。其實現包含如下幾個核心組件:

  • 與 Kubernetes 集成:Filebeat 使用 DaemonSets 進行部署,以確保集群中的每個節點都能將日誌轉發到 Logstash。
  • 對日誌進行充實:配置 Logstash 流水線,利用額外的元數據解析和豐富日誌,從而實現更簡單直接的關聯和分析。
  • 集中化的日誌:所有的日誌均集中在 Elasticsearch 中,從而實現高效存儲、搜索和分析。
  • 實時可觀測性:設置了 Kibana 儀錶盤,以便實時了解應用程式的性能、錯誤率和系統健康狀況。 結果

Elastic Stack 的實現改變了公司的日誌管理能力:

  • 改進了日誌關聯:增強的元數據使團隊能夠快速關聯各服務的日誌,顯著縮短了識別和解決問題的時間。
  • 增強了搜索能力:Elasticsearch 的強大搜索功能使團隊能夠在數秒內對數十億條日誌條目執行複雜的查詢。
  • 實時監控和告警:Kibana 儀錶盤提供了系統健康狀況的全面視圖,集成的告警機制會主動通知團隊潛在的問題。
  • 可擴展性和靈活性:該解決方案可以輕鬆地隨公司服務的增長而擴展,在處理日誌量增加的同時不會降低性能。 結 論

掌握 Kubernetes 中的日誌管理對於在微服務架構中實現強大的可觀測性並維護系統的可靠性至關重要。Kubernetes 具有分布式、高日誌量和動態化的特徵,這給它帶來了獨特的挑戰。但是,只要採取正確的策略,這些挑戰就能轉化為獲取更深入洞察力的機遇。

通過理解日誌管理的複雜性、採用高效的收集策略(如容器原生的日誌工具和集中式 sidecar 模式)並充分利用 Kubernetes 的原生功能,我們可以建立一個綜合性的基礎。有效的日誌分析策略(如儀錶盤可視化、主動報警和高級分析)能夠確保原始的日誌數據可以轉化為具有可操作性的指南。

結合標籤、與其他遙測數據進行關聯和合規性等最佳實踐,可以確保我們的日誌框架與應用程式的增長和性能目標保持一致。無論是排除故障、識別性能瓶頸,還是提供安全性和合規性,戰略性的日誌管理都能幫助團隊優化運維。

優化的日誌管理方式可以幫助團隊避免潛在的問題,確保應用程式性能平穩,並改善決策。實施這些策略可以提升 Kubernetes 的日誌實踐,從而實現穩健、可靠和韌性的基礎架構。

通過實現本文所述的策略,你就能很好地掌握 Kubernetes 環境中的日誌管理,確保系統平穩運行並提高應用程式性能。

關於作者

Prithvish Kovelamudi,是一位經驗豐富的軟體工程師,擁有 9 年以上的工作經驗,他目前在 Marqeta 負責構建高度可擴展的雲計算平台。Prithvish 曾在英特爾公司的加速計算部門長期任職,研究雲計算平台的基礎技術。他熱衷於與技術社區分享自己的知識,目前正在撰寫各種技術出版物。

查看英文原文:

Elevating Kubernetes Logging for Enhanced Observability (https://www.infoq.com/articles/kubernetes-logging-enhanced-observability/)

剝離幾百萬行代碼,複製核心算法去美國?TikTok 最新回應來了

微軟偷偷決定不開源 Linux 及 macOS 版 WebView2,網友:等了四年,我還是用 Electron?!

大廠期權歸屬前遭暴力裁員,80 余萬期權泡湯;去哪兒宣布每周兩天「不坐班」;蘿蔔快跑是人類遠程代駕?客服:無人操控 | Q資訊

微軟中國 CTO 韋青:親身經歷大模型落地的體會與思考

文章來源: https://twgreatdaily.com/94df72e4f34545ca2bc53e8007dfd9ca.html