K8s 服務異常排障過程全解密
Kubernetes(K8s)是一個用於大規模執行分散式應用和服務的開源容器編排平臺。K8s 讓應用釋出更加快速安全,讓應用部署也更加靈活,但在帶來這些便利性的同時,也給應用排障增加了 K8s 平臺層面的複雜度,本篇文章將以常見的服務異常入手,來詳細拆解 K8s 服務訪問方式,以及如何利用現有的可觀測體系來對 k8s 平臺和應用服務進行快速排障。
01|服務的訪問方式
開啟 K8s 服務異常排障過程前,須對 K8s 服務的訪問路徑有一個全面的瞭解,下面我們先介紹目前常用的 K8s 服務訪問方式(不同雲原生平臺實現方式可能基於部署方案、效能優化等情況會存在一些差異,但是如要運維 K8s 服務,則需要在一開始就對訪問方式有一個瞭解)。
方式一:叢集內客戶端通過 ClusterIP 訪問叢集內服務
叢集內客戶端通過 ClusterIP 訪問叢集內服務
從訪問邏輯拓撲
來分析,叢集內客戶端 POD 訪問的是叢集內服務的 svc_name,然後在 svc 層進行 DNAT,將請求轉發到對應的後端 POD。這個過程對應的訪問實現拓撲
則要複雜不少:
-
step 1: client_pod 根據 DNS 配置,請求 DNS 伺服器解析 svc_name,DNS 伺服器會返回 svc_name 對應的 ClusterIP
-
step 2: client_pod 請求 ClusterIP,Node 根據 kube-proxy 配置的 IPVS/IPTABLES 完成 DNAT
-
step 3: 根據 DNAT 的結果,Node 將請求轉發給對應的 server_pod,server_pod 可能與 client_pod 在同一個 Node,也可能在不同 Node,此差異主要體現在網路轉發層面
方式二:叢集外客戶端通過 NodePort 訪問叢集內服務
叢集外客戶端通過 NodePort 訪問叢集內服務
相比方式一
,訪問邏輯拓撲
上 client 訪問的區別是從 svc_name 替換為 nodeip:port。訪問實現拓撲
主要過程如下:
-
step 1: client 直接請求 svc 對外暴露的 nodeip:port,如果是 LoadBalance 型別的服務,在此之前還會訪問 LB(因為並不是 K8s 服務的中的特別能力,所以此處並無特別說明),請求轉發到對應的 Node 上,Node 也會根據kube-proxy 配置的 IPVS/IPTABLES 完成 DNAT
-
step 2: 與
方式一
的 step 3 一致
方式三:叢集外客戶端通過 Ingress 訪問叢集內服務
叢集外客戶端通過 Ingress 訪問叢集內服務
方式三
相比前兩種方式,引入了 Ingress 的概念,因此複雜度增加了非常多。訪問邏輯拓撲
中外部 client 可以直接請求 url 而不是 ip 了,請求 url 會先到達 Ingress,由 Ingress 完成反向代理,轉發給後端的 svc,svc 再完成 DNAT 轉發給後端 POD。訪問實現拓撲
會根據 ingress-controller 部署形式不同而有差異,ingress-controller 非 hostnetwork 部署下文簡稱部署模式一
,ingress-controller hostnetwork 部署下文簡稱部署模式二
-
step 1:外部 client 請求 DNS 伺服器解析 url 的域名,DNS 服務會返回 ingress-controller 服務所在的 IP (如果前面有掛 LB,則訪問的是 LB 的 IP,否則返回的是 ingress-controller 服務的 nodeip:port)
-
step 2:此時
部署模式一
,則需要按方式二
訪問 ingress-controller(為避免畫圖過於複雜,未畫出 ingress_controller_pod 分佈在不同 Node 場景);部署模式二
,請求到達 Node 後,則直接轉給 ingress_controller_pod -
step 3:此為
部署模式一
特有的步驟,參考方式二
-
step 4/5/6:請求經過 ingress_controller_pod 後,已經確定需要轉發的後端 svc,則按
方式一
進行轉發即可(為避免畫圖過於複雜,未畫出 server_pod 分佈在同 Node 場景)
歡迎預約 DeepFlow & SOFAStack 線上直播 《淺談可觀測性儲存問題的解決之道》
02|服務異常的排障思路
瞭解服務的訪問方式後,在遇到服務異常時,基於一套整體的排障思路來開展工作,更能事半功倍,接下來詳細聊聊如何進行排障。
服務異常的排障思路
step 1:確定 Node/POD 是否異常
首先我們可以通過 Prometheus 提供的 Dashboard 來檢查部署的例項的基礎狀態,通過直接檢視應用的 CPU/記憶體/頻寬等指標,確認目前部署例項的負載都在正常範圍內。
node
pod
step 2:確定後端服務是否異常
然後我們可以通過 DeepFlow 提供的 Dashboard 檢視後端服務的黃金指標:請求、異常、時延,以快速判斷目前的服務是否在正常執行。
後端服務
step 3:確定 DNS 是否異常
從前面服務的訪問方式一節可知,僅方式一/方式三的訪問過程經過 DNS 服務,因此只有這兩種場景才需要檢查 DNS 服務是否異常,方式一和三都需要檢查叢集內的 DNS 服務是否異常,方式三相比方式一還需要檢查 client 訪問的叢集外的 DNS 服務是否異常。對於 CoreDNS 本身,我們可以使用 Prometheus 提供的 Dashboard 來進行排障,對於排查應用服務訪問 DNS 異常,我們可以使用 DeepFlow 提供的 Dashboard 檢視 DNS 服務的請求、異常、時延指標。
coredns
dns_monitorging
如 DNS 服務無異常,則可直接用 ClusterIP 訪問服務,如果能正常訪問,那可以確定是 DNS 的問題,並且這個問題很大可能就是配置錯誤。
step 4:確定 SVC 是否異常
因為 SVC 的功能實際是 kube-proxy 同步配置到 IPVS/IPTABLES 來實現的,所以我們可以參考 step 1 的排查步驟,把 kube-proxy 視作應用 POD,通過 Prometheus 提供的 Dashboard 檢視 kube-proxy 是否正常。
如果能確定應用服務執行正常,可以嘗試直接訪問後端 POD,如果能正常訪問,則可以繼續分析 SVC 問題,很大可能是 IPVS/IPTABLES 配置錯誤。
step 5:確定 Ingress 是否異常
在服務訪問方式中方式三的場景下,如果需要檢查 Ingress 的狀態,可以檢視基於 ingress-controller 服務的狀態/負載/請求日誌等構建的 Dashboard。這一類 Dashboard 除了 Prometheus/DeepFlow 有提供之外,各個 API 閘道器的廠商也有提供,可以用 DeepFlow + 廠商提供的 Dashboard 結合進行分析,廠商會更關注閘道器本身的分析,DeepFlow 則更關注全鏈路分析,快速定位問題點。
ingress
step 6:追蹤訪問路徑異常點
上述排障過程,都是獨立的一個個點檢查,如果都沒問題,則可以去追蹤報障的某一次訪問路徑是否有異常。如果能直接定位訪問路徑,確認問題點就會變得更簡單。比如我們發現訪問路徑如果存在斷路,則分析斷路位置即可;如果追蹤的是時延高的問題,則分析追蹤到的每一段路徑的時延即可。訪問路徑需要能覆蓋從應用->系統->網路各個層面,目前提供這樣全鏈路追蹤能力的元件不多,可以使用 DeepFlow 自動化的分散式追蹤能力來進行排查。
追蹤訪問路徑
03|什麼是 DeepFlow
DeepFlow[1] 是一款開源的高度自動化的可觀測性平臺,是為雲原生應用開發者建設可觀測效能力而量身打造的全棧、全鏈路、高效能資料引擎。DeepFlow 使用 eBPF、WASM、OpenTelemetry 等新技術,創新的實現了 AutoTracing、AutoMetrics、AutoTagging、SmartEncoding 等核心機制,幫助開發者提升埋點插碼的自動化水平,降低可觀測性平臺的運維複雜度。利用 DeepFlow 的可程式設計能力和開放介面,開發者可以快速將其融入到自己的可觀測性技術棧中。
GitHub 地址:https://github.com/deepflowys/deepflow
訪問 DeepFlow Demo[2],體驗高度自動化的可觀測性新時代。
04|參考文件
-
0、https://deepflow.yunshan.net/docs/zh/about/overview/
-
1、https://grafana.com/grafana/dashboards/1860-node-exporter-full/
-
2、https://grafana.com/grafana/dashboards/15661-1-k8s-for-prometheus-dashboard-20211010/
-
3、https://grafana.com/grafana/dashboards/9614-nginx-ingress-controller/
-
4、https://grafana.com/grafana/dashboards/14981-coredns/
-
5、https://kubernetes.io/docs/concepts/services-networking/service/
-
6、https://kubernetes.io/docs/concepts/services-networking/dns-pod-service/
-
7、https://www.nginx.com/products/nginx-ingress-controller/
-
8、https://github.com/haproxytech/kubernetes-ingress#readme
-
9、https://kubernetes.io/docs/concepts/services-networking/service-topology/
-
10、https://mp.weixin.qq.com/s/mp5coRHPAdx5nIfcCnPFhw
引用連結
[1] DeepFlow: https://github.com/deepflowys/deepflow
[2] DeepFlow Demo: https://deepflow.yunshan.net/docs/zh/install/overview/