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