K8s 服務異常排障過程全解密

語言: CN / TW / HK

Kubernetes(K8s)是一個用於大規模執行分散式應用和服務的開源容器編排平臺。K8s 讓應用釋出更加快速安全,讓應用部署也更加靈活,但在帶來這些便利性的同時,也給應用排障增加了 K8s 平臺層面的複雜度,本篇文章將以常見的服務異常入手,來詳細拆解 K8s 服務訪問方式,以及如何利用現有的可觀測體系來對 k8s 平臺和應用服務進行快速排障。

01|服務的訪問方式

開啟 K8s 服務異常排障過程前,須對 K8s 服務的訪問路徑有一個全面的瞭解,下面我們先介紹目前常用的 K8s 服務訪問方式(不同雲原生平臺實現方式可能基於部署方案、效能優化等情況會存在一些差異,但是如要運維 K8s 服務,則需要在一開始就對訪問方式有一個瞭解)。

方式一:叢集內客戶端通過 ClusterIP 訪問叢集內服務

叢集內客戶端通過 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 訪問叢集內服務

叢集外客戶端通過 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 訪問叢集內服務

方式三相比前兩種方式,引入了 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

node

pod

pod

step 2:確定後端服務是否異常

然後我們可以通過 DeepFlow 提供的 Dashboard 檢視後端服務的黃金指標:請求、異常、時延,以快速判斷目前的服務是否在正常執行。

後端服務

後端服務

step 3:確定 DNS 是否異常

從前面服務的訪問方式一節可知,僅方式一/方式三的訪問過程經過 DNS 服務,因此只有這兩種場景才需要檢查 DNS 服務是否異常,方式一和三都需要檢查叢集內的 DNS 服務是否異常,方式三相比方式一還需要檢查 client 訪問的叢集外的 DNS 服務是否異常。對於 CoreDNS 本身,我們可以使用 Prometheus 提供的 Dashboard 來進行排障,對於排查應用服務訪問 DNS 異常,我們可以使用 DeepFlow 提供的 Dashboard 檢視 DNS 服務的請求、異常、時延指標。

coredns

coredns

dns_monitorging

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

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/