Kubernetes監(jiān)控之優(yōu)秀實踐
什么是Kubernetes?
Kubernetes 是一個可移植的、可擴展的開源平臺,用于管理容器化的工作負載和服務,可促進聲明式配置和自動化。Kubernetes 擁有一個龐大且快速增長的生態(tài)系統(tǒng)。Kubernetes 的服務、支持和工具廣泛可用。Kubernetes由Google于2014年開源 ,它是基于Google自身在生產(chǎn)中運行容器的經(jīng)驗而構(gòu)建的。它現(xiàn)在由Cloud Native Computing Foundation(CNCF)管理,Kubernetes是大型企業(yè)中最流行的容器管理工具,在最近的CNCF調(diào)查中有83%的受訪者使用過。Kubernetes這個詞 源于希臘語,意為“舵手”或“飛行員”。
Kubernetes如何成為標準
要了解Kubernetes的價值,我們首先必須回顧一下多年來企業(yè)如何部署應用程序。在傳統(tǒng)部署中,應用程序在物理服務器上運行,這種方法容易導致資源分配問題。例如,如果在單個服務器上運行多個應用程序,則一個應用程序可能會消耗大部分資源,從而影響其他應用程序的性能。一種解決方案是在單獨的物理服務器上運行每個應用程序,但是這種方式帶來的成本過高,并且會導致資源利用不足。下一步是虛擬化,它通過在物理服務器的CPU之上運行多個虛擬機(VM)(每個虛擬機運行自己的組件,包括操作系統(tǒng)(OS)和應用程序)來解決物理服務器的局限性。VM提供了很多好處,包括改善服務器資源的利用率,降低硬件成本,簡化應用程序升級以及其他增強可擴展性。虛擬機有其缺點。例如,每個有自己的OS映像的VM都意味著額外的內(nèi)存和存儲要求。這增加了軟件開發(fā)生命周期的復雜性,并限制了應用程序在公有云和私有云以及數(shù)據(jù)中心之間的可移植性。
容器的好處
容器與虛擬機相似,因為它有自己的軟件,庫,內(nèi)存,配置文件等。但容器有許多優(yōu)點,最顯著的是有共享操作系統(tǒng)的能力(每個VM擁有自己獨立的OS映像),從而使它們相對輕量,快速且高效。容器的好處包括:
- 效率提高:借助容器,可以更快地部署,修補或擴展應用程序。
- 更好的可移植性:將容器中運行的應用程序輕松部署到多個操作系統(tǒng)和硬件平臺很容易。
- 一致的操作:基于容器的應用程序無論部署在何處都可以相同地方式運行。
- 更清晰的可觀察性:除了提供操作系統(tǒng)級別的指標之外,它們還顯示應用程序的運行狀況。
- 受益于應用程序開發(fā):容器支持敏捷和DevOps開發(fā)(以加快開發(fā),測試和生產(chǎn)周期)。
Kubernetes對容器的作用
由于容器比傳統(tǒng)的虛擬化更加高效,快速和輕便,因此有大型應用程序部署的企業(yè)可以將多個容器部署為一個或多個容器集群也就不足為奇了。但是,由于大型的分布式容器化應用程序通常難以協(xié)調(diào),因此該環(huán)境面臨著一系列挑戰(zhàn)。Kubernetes是一個開源容器編排工具,可跨主機群集自動執(zhí)行應用程序容器的部署,擴展和操作。最流行的容器調(diào)度工具Kubernetes與領先的容器化平臺Docker一起使用是最多的場景。但是Kubernetes還支持其他符合容器鏡像格式和運行時標準的容器系統(tǒng),該標準由開放容器倡議(OCI)設定,該組織是由Linux Foundation監(jiān)督的開源技術社區(qū)。Kubernetes的替代產(chǎn)品包括Docker Swarm和Apache Mesos。
Kubernetes如何工作
Kubernetes提供了一個框架來運行彈性的分布式系統(tǒng)。部署后,您將獲得一個Kubernetes集群—一組運行Kubernees管理的容器化應用程序的機器或節(jié)點。集群至少具有一個:
- 承載Pod的輔助節(jié)點。(每個pod是一組一個或多個容器。)
- 主節(jié)點,用于管理集群中的工作節(jié)點和Pod。
要使Kubernetes集群正常工作,您需要多個主組件,節(jié)點組件和附加組件。我們將在下面有關Kubernetes監(jiān)控的部分中討論這些組件。
Kubernetes的好處
盡管Kubernetes擁有很多優(yōu)點,但它的四個主要優(yōu)點包括速度,擴展,基礎設施抽象和效率?!禟ubernetes: Up and Running》(https://www.oreilly.com/library/view/kubernetes-up-and/9781491935668/)這本書由 Joe Beda,Brendan Burns和Kelsey Hightower撰寫。
- 速度:Kubernetes提供了您需要每小時或每天快速發(fā)布功能同時保持高可用性服務的工具。
- 擴展:Kubernetes的配置管理工具使擴展組成分布式應用程序的容器和支持這些容器的集群的擴展變得更加容易。
- 基礎架構(gòu)抽象:在多個公共云之間或在混合云環(huán)境中運行分布式應用程序具有挑戰(zhàn)性。Kubernetes有很多可簡化這些任務的插件。
- 效率:通過在整個集群中自動分配應用程序并確保更高的利用率,Kubernetes有助于提高效率和成本管理。
Kubernetes監(jiān)控涉及什么?
什么是Kubernetes監(jiān)控?它涉及什么?讓我們從需要在Kubernetes中監(jiān)控什么以及為什么開始。Kubernetes可以極大地簡化容器內(nèi)和跨云的應用程序部署,但是卻帶來了自己的復雜性。正如Google在其《站點可靠性工程指南》(https://landing.google.com/sre/sre-book/chapters/practical-alerting/)中所指出的那樣,監(jiān)控大型,復雜的系統(tǒng)面臨兩個主要挑戰(zhàn):正在監(jiān)控的組件數(shù)量龐大,以及需要對運維人員保持“合理的低維護的工作量”。這些要求需要一個監(jiān)控系統(tǒng),該系統(tǒng)不僅可以發(fā)出有關高級服務目標的警報,還可以檢查單個組件。為了擴展應用程序并提供可靠的服務,您需要深入了解應用程序在部署時的行為。要監(jiān)控Kubernetes集群中的應用程序性能,檢查容器,容器和服務的性能以及整個集群的特性至關重要。通過提供有關應用程序資源使用情況的信息,Kubernetes允許您評估應用程序性能以檢測和消除瓶頸。
Kubernetes組成部分:要監(jiān)控的內(nèi)容
Kubernetes集群架構(gòu)包括一個主節(jié)點和單獨的Kubernetes節(jié)點。主要組件包括:
etcd
存儲配置信息,集群中的每個節(jié)點均可使用。
API server(kube-apiserver)
驗證和配置API對象(例如Pod,服務,復制控制器等)的數(shù)據(jù)。
Scheduler(kube-scheduler)
管理工作負載利用率以及將pod分配到可用節(jié)點。
kube-controller-manager
一個守護程序,負責收集信息并將其發(fā)送到API服務器。
cloud-controller-manager
運行與云供應商進行交互的控制器。Kubernotes節(jié)點組件包括:
- 容器運行時(例如,Docker)
- kubelet:主要節(jié)點代理,通過API服務器監(jiān)控pod規(guī)范;它還在Kubernetes集群中注冊了一個節(jié)點并報告事件,pod狀態(tài)和資源利用率。
- Kubernetes代理(kube-proxy):在每個節(jié)點上運行的代理服務,有助于使服務對外部主機可用。
Kubernetes附加組件
您有很多Kubernetes附加組件可供選擇,但是這里有一些受歡迎的選擇。您可以在此處找到更全面的加載項列表。
- Kubernetes儀表板:Kubernetes集群的基于Web的UI,可用于監(jiān)控工作負載(deployments, pods, replica sets 等等)的運行狀況,并查看所有節(jié)點上匯總的CPU和內(nèi)存使用情況指標。它具有配置,發(fā)現(xiàn),負載平衡,存儲,監(jiān)控以及創(chuàng)建和管理工作負載的功能。
- 群集DNS:為Kubernetes服務提供DNS記錄的DNS服務器。
- ACI:通過Cisco Application Centric Infrastructure(ACI)(https://github.com/noironetworks/aci-containers)提供集成的容器網(wǎng)絡和網(wǎng)絡安全性。
- 集群級日志記錄:使用搜索/瀏覽UI將容器日志保存到中央日志存儲中。
Kubernetes監(jiān)控挑戰(zhàn)
將傳統(tǒng)的單片應用程序遷移到Kubernetes既耗時又容易出錯。但是,企業(yè)愿意冒險以在云中實現(xiàn)更大的敏捷性,創(chuàng)新,成本優(yōu)勢,可擴展性和業(yè)務增長。但是將單片應用程序遷移到微服務的公司缺乏對Kubernetes環(huán)境的可見性。這使得無法實時查看每個微服務的交互。
Kubernetes很復雜
集成工程師Dave Snyder指出,Kubernetes難以監(jiān)控的另一個原因是,Kubernetes集群要復雜得多,它有多個服務器以及私有和公有云服務。問題開始時,將有許多日志以及其他數(shù)據(jù)和組件需要排查。整體環(huán)境可能需要好幾個日志搜索,但是Kubernetes環(huán)境可能包含一個或多個有關正在排查的問題需要多個微服務的日志。
使用APM進行Kubernetes監(jiān)控
使用應用程序性能監(jiān)控解決方案進行的Kubernetes監(jiān)控使組織可以查看應用程序和業(yè)務性能,包括對容器化應用程序,Kubernetes集群,Docker容器和基礎架構(gòu)指標的更深入了解。這種可見性使企業(yè)可以增強容器級別的指標,并獲得有關CPU,數(shù)據(jù)包,內(nèi)存和網(wǎng)絡利用率的可見性。然后,用戶可以將這些指標和關聯(lián)的運行狀況規(guī)則以及它們在APM監(jiān)控的容器應用程序上的資源使用統(tǒng)計信息作為基準。通過將APM指標與基礎容器和服務器指標進行比較,公司可以快速了解其容器化應用程序的性能,并了解基礎架構(gòu)中的潛在障礙。例如,特定指標可以幫助識別占用帶寬的應用程序和容器級網(wǎng)絡錯誤。
Kubernetes環(huán)境中的全棧可見性
可見性使組織可以監(jiān)控在Kubernetes Pod中運行的容器化應用程序,并確定妨礙應用程序性能的容器問題。全面的Kubernetes監(jiān)控解決方案可提供對組織應用程序的每個組件(基礎架構(gòu),Kubernetes平臺,容器以及每個微服務和最終用戶設備)的端到端可見性。
什么是Kubernetes監(jiān)控最佳實踐?
Kubernetes提供了操作流程和復雜性,其中許多涉及應用程序性能監(jiān)控。隨著您將Kubernetes的使用擴展到生產(chǎn)環(huán)境中,這些挑戰(zhàn)變得更加重要。通過創(chuàng)建諸如Pod和Service之類的抽象級別,Kubernetes使您不必擔心應用程序在何處運行或它們是否具有足夠的資源來高效運行。但是要確保最佳性能,您仍然必須監(jiān)控應用程序,運行它們的容器,甚至Kubernetes本身。以下是一些重要的Kubernetes監(jiān)控最佳實踐:
使用Kubernetes DaemonSets
在運行Kubernetes時,您可能希望在所有節(jié)點上運行單個pod,例如,在運行諸如AppDynamics代理或開源數(shù)據(jù)收集器Fluentd之類的監(jiān)控進程時,以收集日志。DaemonSet是一個Kubernetes工作負載對象,可確保特定的Pod在集群中的每個節(jié)點或節(jié)點的某些子集上運行。通過使用DaemonSet,您要告訴Kubernetes確保每個節(jié)點上都有一個pod實例。
Tags和Labels Matter很重要
使用Kubernetes管理容器編排,標簽對于監(jiān)控變得至關重要,因為標簽是您與容器和容器進行交互的唯一方法。為了使度量標準盡可能有用,必須使用邏輯且一致的方案定義標簽。
知道要監(jiān)控的指標
根據(jù)Kubernetes.io,應該密切跟蹤Kubernetes指標的幾種關鍵類型:
- 運行Pod及其部署
- 資源指標,包括CPU,內(nèi)存使用情況和磁盤I/O
- 容器原生指標
- 應用指標
使用服務發(fā)現(xiàn)
由于Kubernetes根據(jù)調(diào)度策略動態(tài)調(diào)度應用程序,因此您可能不知道應用程序在何處運行,但是無論如何您都必須對其進行監(jiān)控。您將希望使用具有服務發(fā)現(xiàn)功能的監(jiān)控系統(tǒng),該系統(tǒng)會自動使指標收集適應移動的容器。這種方法使您可以連續(xù)監(jiān)控應用程序而不會中斷。
Kubernetes監(jiān)控工具
Kubernetes有很多好處,但也增加了復雜性。例如,其要在多個數(shù)據(jù)中心甚至不同的云供應商之間分布容器化應用程序的能力,就需要一種全面的監(jiān)控解決方案來跨多個不同來源收集和匯總指標。持續(xù)監(jiān)控系統(tǒng)和應用程序的運行狀況至關重要,許多免費的商業(yè)解決方案可提供對Kubernetes集群及其托管的應用程序的實時監(jiān)控。這是用于Kubernetes監(jiān)控的幾個開源工具:
Prometheus
這個針對Kubernetes和Docker的流行的監(jiān)控和警報工具提供了詳細,可行的指標和分析。Prometheus由SoundCloud開發(fā)并捐贈給CNCF社區(qū),專門設計用于監(jiān)控在容器中運行的應用程序和微服務。但是,Prometheus并不是儀表板,通常與Grafana結(jié)合使用(見下文)以可視化數(shù)據(jù)。
Grafana
Grafana是用于分析和度量可視化的開源平臺,包括四個儀表板:集群,節(jié)點,Pod/容器和部署。Kubernetes管理員通常會安裝Grafana并利用Prometheus數(shù)據(jù)源來創(chuàng)建信息豐富的儀表板。
Jaeger
Jaeger是一個跟蹤系統(tǒng),用于對復雜的分布式系統(tǒng)中的事務進行故障排除和監(jiān)控。它解決了分布式上下文傳播,分布式事務監(jiān)控,等待時間優(yōu)化等中出現(xiàn)的軟件問題。
Dashboard
Kubernetes儀表板是Kubernetes集群的Web UI插件,可讓您監(jiān)控工作負載的運行狀況。
Kubewatch
該附加組件監(jiān)控Kubernetes pod中發(fā)生的更改,并將通知發(fā)送到Slack Channel。Kubewatch用Golang編寫,它使用Kubernetes客戶端庫與Kubernetes API服務器進行交互,并使用Slack客戶端庫與Slack進行交互。
Weave Scope
Weave Scope是Kubernetes和Docker的可視化和監(jiān)控工具,它提供了應用程序和整個基礎架構(gòu)的自頂向下視圖。由Weaveworks開發(fā),Weave Scope生成Kubernetes集群中的進程,容器和主機的映射。它的圖形用戶界面還允許您在容器上管理和運行診斷命令。
EFK Stack
EFK Stack實際上是三個可以很好地協(xié)同工作的工具的混合物:Elasticsearch,F(xiàn)luentd和Kibana。Fluentd是一個數(shù)據(jù)收集器,它從Kubernetes集群節(jié)點上運行的Pod中刪除日志。它將這些日志路由到Elasticsearch搜索引擎,Elasticsearch搜索引擎提取數(shù)據(jù)并將其存儲在中央存儲庫中。Kibana是Elasticsearch的數(shù)據(jù)可視化插件,是EFK Stack的UI,允許用戶可視化收集的日志和指標并創(chuàng)建自定義儀表板。
InfluxDB
InfluxData的InfluxDB是時間序列數(shù)據(jù)的高性能存儲。它專為監(jiān)控記錄的大量存儲而構(gòu)建,可通過集群提供水平可伸縮性和高可用性。InfluxDB是長期存儲Kubernetes監(jiān)控數(shù)據(jù)以用于歷史記錄或建模的很好的解決方案。