如何发现 Kubernetes 中服务和工作负载的异常
大家好,我是來自阿里云的李煌東,今天由我為大家分享 Kubernetes 監(jiān)控公開課的第二節(jié)內(nèi)容:如何發(fā)現(xiàn) Kubernetes 中服務(wù)和工作負(fù)載的異常。
本次分享由三個(gè)部分組成:
一、Kubernetes 異常定位存在痛點(diǎn);
二、針對這些痛點(diǎn),Kubernetes 監(jiān)控如何更快、更準(zhǔn)、更全的發(fā)現(xiàn)異常;
三、網(wǎng)絡(luò)性能監(jiān)控、中間件監(jiān)控等典型案例解析。
Kubernetes 異常定位存在痛點(diǎn)
當(dāng)下的互聯(lián)網(wǎng)架構(gòu)中,越來越多的公司采用微服務(wù) + Kubernetes 這樣的架構(gòu),這樣的架構(gòu)有如下特點(diǎn):
這三個(gè)痛點(diǎn)分別歸納為成本、效率、體驗(yàn)三個(gè)方面。針對這些痛點(diǎn),接下來我們一起看下 Kubernetes 監(jiān)控的數(shù)據(jù)體系,看下怎么來更好的解決成本、效率、體驗(yàn)三大問題。
Kubernetes 監(jiān)控如何發(fā)現(xiàn)異常
下圖金子塔自頂向下表示信息的密度或者詳細(xì)程度,越往下面信息越詳細(xì)。我們從底部開始講,Trace 是我們通過eBPF技術(shù)以無入侵、多協(xié)議、多語言的方式采集應(yīng)用層協(xié)議數(shù)據(jù),如 HTTP、MySQL、Redis,協(xié)議數(shù)據(jù)會進(jìn)一步解析成容易理解的請求詳情、響應(yīng)詳情、各個(gè)階段的耗時(shí)信息。
再上一層是指標(biāo),指標(biāo)主要由黃金指標(biāo)、網(wǎng)絡(luò)、Kubernetes 體系中的指標(biāo)。其中黃金指標(biāo)和網(wǎng)絡(luò)指標(biāo)是基于 eBPF 采集的,所以同樣他們是沒有入侵的,支持各種協(xié)議的,有了黃金指標(biāo),我們就能知道服務(wù)整體上是否有異常、是否有慢、是否影響用戶;網(wǎng)絡(luò)指標(biāo)主要是對socket的支持,如丟包率、重傳率、RTT 等,主要用來監(jiān)控網(wǎng)絡(luò)是否正常的指標(biāo)。Kubernetes 體系中的指標(biāo)是指原來 Kubernetes 監(jiān)控體系中的 cAdvisor/MetricServer/Node Exporter/NPD 這些指標(biāo)。
再上一層是事件,事件直接明確地告訴我們發(fā)生了什么,可能我們遇到最多的是 Pod 重啟、拉鏡像失敗等。我們對 Kubernetes 事件進(jìn)行了持久化存儲,并保存一段時(shí)間,這樣方便定位問題。然后,我們的巡檢和健康檢查也是支持以事件的形式報(bào)出來。
最頂層是告警,告警是監(jiān)控系統(tǒng)的最后一環(huán),當(dāng)我們發(fā)現(xiàn)某些特定異??赡軐I(yè)務(wù)有損后,我們就需要對指標(biāo)、事件進(jìn)行告警配置。告警目前支持 PromQL,智能告警支持對歷史數(shù)據(jù)進(jìn)行智能算法檢測,從而發(fā)現(xiàn)潛在的異常事件。告警的配置支持動(dòng)態(tài)閾值,通過調(diào)節(jié)靈敏度的方式來配置告警,從而避免寫死閾值。
有了 Trace、指標(biāo)、事件、告警之后,我們用拓?fù)鋱D將這些數(shù)據(jù)和 Kubernetes 實(shí)體都關(guān)聯(lián)起來,每個(gè)節(jié)點(diǎn)對應(yīng) Kubernetes 實(shí)體中的服務(wù)和工作負(fù)載,服務(wù)之間調(diào)用用線表示。有了拓?fù)鋱D,我們就像拿到一張地圖,能快速識別拓?fù)鋱D中的異常,并對異常進(jìn)行進(jìn)一步的分析,對上下游、依賴、影響面進(jìn)行分析,從而對系統(tǒng)有了更全面的掌控。
最佳實(shí)踐&場景分析
接下來我們講下發(fā)現(xiàn) Kubernetes 中服務(wù)和工作負(fù)載的異常的最佳實(shí)踐。
首先還是先有指標(biāo),指標(biāo)能反應(yīng)服務(wù)的監(jiān)控狀態(tài),我們應(yīng)盡可能地收集各種指標(biāo),并且越全越好,不限于黃金指標(biāo)、USE 指標(biāo)、Kubernetes 原生指標(biāo)等;然后,指標(biāo)是宏觀數(shù)據(jù),需要做根因分析我們得有 Trace 數(shù)據(jù),多語言、多協(xié)議的情況下要考慮采集這些 Trace 的成本,同樣盡可能地支持多一點(diǎn)協(xié)議、多一點(diǎn)語言;最后,用一張拓?fù)鋵⒅笜?biāo)、Trace、事件匯總起來、串聯(lián)起來,形成一張拓?fù)鋱D,用來做架構(gòu)感知分析、上下游分析。
通過這三種方法的分析,服務(wù)和工作負(fù)載的異常通常暴露無遺了,但我們不應(yīng)該就此停止前進(jìn)的腳步,加入這個(gè)異常下次再來,那么我們這些工作得重來一遍,最好的辦法是針對這類異常配置對應(yīng)的告警,自動(dòng)化地管理起來。
我們用幾個(gè)具體的場景來詳細(xì)介紹:
(一)網(wǎng)絡(luò)性能監(jiān)控
網(wǎng)絡(luò)性能監(jiān)控以重傳為例,重傳的意思是說發(fā)送方認(rèn)為發(fā)生了丟包現(xiàn)象,就重發(fā)這些數(shù)據(jù)包。以圖中的傳輸過程為例:
代碼和日志是觀察不出來的,這種情形下最終很難找到根因。為了能快速定位這個(gè)問題,我們需要一組網(wǎng)絡(luò)性能指標(biāo)來提供定位依據(jù),包含以下指標(biāo),P50、P95、P99 指標(biāo)來表示延時(shí),然后我們需要流量、重傳、RTT、丟包這些指標(biāo)來表征網(wǎng)絡(luò)情況。
以某個(gè)服務(wù) RT 高為例:首先我們看到拓?fù)涞倪吺羌t的,紅的判斷邏輯是根據(jù)延時(shí)、錯(cuò)誤來判斷的,當(dāng)發(fā)現(xiàn)這個(gè)紅邊的時(shí)候,點(diǎn)擊上面的邊,就可以看對應(yīng)的黃金指標(biāo)了。
點(diǎn)擊底部最左邊這個(gè)按鈕,可以查看當(dāng)前服務(wù)的網(wǎng)絡(luò)數(shù)據(jù)列表,我們可以按平均響應(yīng)時(shí)間、重傳、RTT 排下序,可以看到第一個(gè)服務(wù)調(diào)用延時(shí)比較高,快到一秒的返回時(shí)間,同時(shí)也看到重傳比較高,相比于其他服務(wù)高很多。這里其實(shí)是通過工具去注入了重傳高這么一個(gè)故障,看起來更明顯一些。這樣分析下來我們就知道可能是網(wǎng)絡(luò)的問題,就可以進(jìn)一步排查了。有經(jīng)驗(yàn)的開發(fā)一般會拿著網(wǎng)絡(luò)指標(biāo)、服務(wù)名、ip、域名這些信息去找網(wǎng)絡(luò)的同事排查,而不是只是告訴對方說我服務(wù)很慢,這樣對方知道的信息太少,就不會積極去排查,因?yàn)閯e人也不知道從哪里開始,當(dāng)我們提供了相關(guān)數(shù)據(jù),對方就有了參考,會順藤摸瓜進(jìn)一步推進(jìn)。
(二)DNS 解析異常
第二個(gè)場景是 DNS 解析異常。DNS 通常是協(xié)議通信的第一步,比如 HTTP 請求,第一步就是先拿到 IP,也就是我們平常說的服務(wù)發(fā)現(xiàn)過程,第一步出現(xiàn)問題,整個(gè)調(diào)用就直接失敗了,這就是所謂關(guān)鍵路徑不能掉鏈子。在 Kubernetes 集群中所有的 DNS 都走 CoreDNS 的解析,所以 CoreDNS 上容易出現(xiàn)瓶頸,一旦出現(xiàn)問題,影響面也是非常大的,可能整個(gè)集群都不可用了。舉個(gè)兩個(gè)月前發(fā)生的鮮活的例子,著名的 CDN 公司 Akamai 就發(fā)生了一個(gè) DNS 故障,導(dǎo)致眾多網(wǎng)站像 Airbnb 網(wǎng)站無法訪問,事故持續(xù)了長達(dá)一個(gè)小時(shí)。
在 Kubernetes 集群中 DNS 解析比較核心的幾個(gè)場景有三個(gè):
這里對 CoreDNS 常見的問題進(jìn)行了歸納,大家可以參考下,排查下自己的集群上有沒有類似問題:
接下來,我們看下 Kubernetes CoreDNS 中可能會發(fā)生問題的地方,首先應(yīng)用和 CoreDNS 之間的網(wǎng)絡(luò)可能有問題;第二是 CoreDNS 本身問題,比如 CoreDNS 返回 SERVFAIL、REFUSE 這些錯(cuò)誤碼,甚至因?yàn)?Corefile 配置錯(cuò)了,導(dǎo)致返回值是錯(cuò)的;第三點(diǎn)是跟外部 DNS 通信的時(shí)候,發(fā)生網(wǎng)絡(luò)中斷、性能問題;最后一個(gè)是外部 DNS 不可用。
針對這些問題點(diǎn)總結(jié)出以下步驟來盤查:
第一、從客戶端側(cè),先看下請求內(nèi)容和返回碼,如果是返回是錯(cuò)誤碼說明是服務(wù)端有問題。如果是慢解析,可以看下時(shí)間瀑布流看下時(shí)間耗費(fèi)在哪個(gè)階段。
第二、看網(wǎng)絡(luò)是否正常,看流量、重傳、丟包、RTT 這幾個(gè)指標(biāo)就夠了。
第三、查看服務(wù)端,看下流量、錯(cuò)誤、延時(shí)、飽和度這幾個(gè)指標(biāo),再看下 CPU、內(nèi)存、磁盤等這幾個(gè)資源指標(biāo),也能定位出是否有問題。
第四、看下外部 DNS,同理我們可以通過請求 Trace、返回碼、網(wǎng)路流量、重傳等指標(biāo)來定位。
接下來我們看下拓?fù)?。首先看到紅色的線表示有異常的 DNS 解析調(diào)用,點(diǎn)擊這個(gè)我們能看到調(diào)用的黃金指標(biāo);點(diǎn)擊查看列表,彈出詳情頁面,可查看請求的詳情,是請求這個(gè)域名,請求過程中經(jīng)歷發(fā)送、等待、下載三個(gè)過程,看起來指標(biāo)正常,接下來我們點(diǎn)擊看響應(yīng),發(fā)現(xiàn)響應(yīng)是域名不存在。那么這時(shí)候我們可以進(jìn)一步看下外部 DNS 是否有問題,步驟也是一樣的,后面我會在 demo 中展示,所以這里就不展開先了。
(三)全鏈路壓測
第三個(gè)典型場景是全鏈路壓測,對于大促這種場景峰值是平常的數(shù)倍,怎么保障大促的穩(wěn)定,需要通過一系列的壓測來驗(yàn)證系統(tǒng)能力、系統(tǒng)穩(wěn)定性評估、做容量規(guī)劃、識別系統(tǒng)瓶頸。一般會有這么幾個(gè)步驟:先預(yù)熱下,這時(shí)候驗(yàn)證下鏈路是否正常的,逐步加流量直到峰值,然后開始摸高,也就是看下能支持的最大 TPS 是多少,接著再加流量,這時(shí)候主要就是看服務(wù)是否能正常限流了,因?yàn)橐呀?jīng)找過最大 TPS 了,再加大力量就是破壞性流量了。那么在這個(gè)過程中,我們需要關(guān)注哪些點(diǎn)呢?
首先針對我們多語言、多協(xié)議的微服務(wù)架構(gòu),比如這里的 Java、Golang、Python 應(yīng)用,這里有 RPC、MySQL、Redis、Kafka 應(yīng)用層協(xié)議,我們得有各種語言、各種協(xié)議的黃金指標(biāo),用來驗(yàn)證系統(tǒng)能力;針對系統(tǒng)的瓶頸、容量規(guī)劃這塊,我們需要 use 指標(biāo),去看各種流量級別情況下資源的飽和度,來確定是不是要擴(kuò)容,每增加一次流量,對應(yīng)看下 use 指標(biāo),對應(yīng)調(diào)整容量,逐步優(yōu)化;對于復(fù)雜架構(gòu),需要有一張全局的大圖來幫助梳理上下游依賴、全鏈路架構(gòu),確定爆炸報(bào)警,比如這里的 CheckoutService 就是個(gè)關(guān)鍵的服務(wù),這個(gè)點(diǎn)如果出現(xiàn)問題,影響面會很大。
第一、各種語言、協(xié)議通信的黃金指標(biāo),通過查看列表進(jìn)一步看調(diào)用的詳情
第二、點(diǎn)擊節(jié)點(diǎn)詳情下鉆查看 cpu、memory 等 use 資源指標(biāo)
第三、整個(gè)拓?fù)鋱D是能反映整個(gè)架構(gòu)的形態(tài)的,有了全局的架構(gòu)視角,就能識別哪個(gè)服務(wù)容易成為瓶頸、爆炸半徑有多大,是否需要做高可用保障。
(四)訪問外部 MySQL
第四個(gè)場景是訪問外部 MySQL,先看下訪問外部 MySQL 有哪些常見的問題:
接下來看下拓?fù)鋱D,中間框住的應(yīng)用依賴了外部的 MySQL 服務(wù),點(diǎn)擊拓?fù)渚€可以進(jìn)一步看黃金指標(biāo),點(diǎn)擊查看列表可以進(jìn)一步看請求的詳情、響應(yīng)等。同時(shí)我們也可以看下網(wǎng)絡(luò)性能指標(biāo),這個(gè) table 是將當(dāng)前拓?fù)渲械木W(wǎng)絡(luò)數(shù)據(jù)根據(jù)來源和目標(biāo)進(jìn)行歸類,可以分別查看請求數(shù)、錯(cuò)誤數(shù)、平均響應(yīng)時(shí)間、socket 重傳、socket rtt,點(diǎn)擊上面箭頭可以對應(yīng)地排序。
(五)多租戶架構(gòu)
第五個(gè)典型案例是多租戶架構(gòu)。多租戶指的是不同的租戶、工作負(fù)載、不同團(tuán)隊(duì),公用一個(gè)集群,通常一個(gè)租戶對應(yīng)一個(gè)命名空間,同時(shí)保證資源的邏輯隔離或者物理隔離,互不影響、互不干擾。常見的場景有:企業(yè)內(nèi)部用戶,一個(gè)團(tuán)隊(duì)對應(yīng)一個(gè)租戶,同一個(gè)命名空間內(nèi)網(wǎng)絡(luò)不受限制,用網(wǎng)絡(luò)策略去控制不同命名空間之間的網(wǎng)絡(luò)流量。第二種是 SaaS 提供商多租戶架構(gòu),每個(gè)用戶對應(yīng)一個(gè)命名空間,同時(shí)租戶和平臺分別處于不同的命名空間。雖然 Kubernetes 的命名空間特性給多租戶架構(gòu)帶來了便利,但也給可觀測帶來兩個(gè)挑戰(zhàn):第一命名空間非常多,查找信息變得很繁瑣,增加了管理成本、理解成本。第二是租戶之間有流量隔離的要求,在命名空間比較多的情況下往往無法做到準(zhǔn)確、全面的發(fā)現(xiàn)異常流量。第三是對多協(xié)議、多語言的 Trace 支持。曾經(jīng)遇到過一個(gè)客戶,一個(gè)集群里面有 400 多個(gè)命名空間,管理起來非常痛苦,而且應(yīng)用是多協(xié)議、多語言的,要支持 Trace,得一個(gè)個(gè)改造。
這是我們產(chǎn)品的集群首頁,Kubernetes 的實(shí)體以命名空間的方式劃分,支持查詢來定位到我想看的集群。氣泡圖上展示對應(yīng)命名空間上的實(shí)體數(shù),以及有異常的實(shí)體數(shù),比如框子里 3 個(gè)命名空間里存在有異常的 pod,點(diǎn)進(jìn)去可以進(jìn)一步看異常。首頁下面是按黃金指標(biāo)排序的性能概覽,也就是場景的 Top 功能,這樣能快速查看哪幾個(gè)命名空間是有異常的。
在拓?fù)鋱D中,如果命名空間比較多,可以通過過濾功能查看想看的命名空間,或者通過搜索方式快速定位到想看的命名空間。由于節(jié)點(diǎn)是以命名空間分組的,能通過命名空間之間的線來查看命名空間的流量,這樣就能方便地查看有來自哪些命名空間的流量、是否有異常流量等等。
我們將上述場景介紹總結(jié)如下:
從這幾個(gè)場景中又進(jìn)一步列舉常見的 case:網(wǎng)絡(luò)、服務(wù)的可用性檢測,健康檢查;中間件架構(gòu)升級可觀測性保障;新業(yè)務(wù)上線驗(yàn)證;服務(wù)性能優(yōu)化;中間件性能監(jiān)控;方案選型;全鏈路壓測等。
產(chǎn)品價(jià)值
經(jīng)過以上內(nèi)容介紹,我們將 Kubernetes 的產(chǎn)品價(jià)值總結(jié)如下:
本節(jié)課的內(nèi)容到這里就結(jié)束了,歡迎大家前往釘釘搜索群號(31588365)加入答疑交流群進(jìn)行交流。
目前 Kubernetes 監(jiān)控已經(jīng)全面免費(fèi)公測,點(diǎn)擊下方鏈接,立即開啟試用!
https://www.aliyun.com/activity/middleware/container-monitoring?spm=5176.20960838.0.0.42b6305eAqJy2n
總結(jié)
以上是生活随笔為你收集整理的如何发现 Kubernetes 中服务和工作负载的异常的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 「 活动 」连续 3 天,企业容器应用实
- 下一篇: 前后端、多语言、跨云部署,全链路追踪到底