服務(wù)網(wǎng)格自動故障檢測及流量切換方案
本文分享自天翼云開發(fā)者社區(qū)《服務(wù)網(wǎng)格自動故障檢測及流量切換方案》,作者:s****n
隨著云原生技術(shù)的發(fā)展,越來越多的應(yīng)用采用容器,微服務(wù)技術(shù),以istio為代表的服務(wù)網(wǎng)格就是其中最廣泛使用的一種。它在業(yè)務(wù)容器創(chuàng)建時,自動向業(yè)務(wù)服務(wù)的pod中注入proxy容器邊車,將流入和流出業(yè)務(wù)容器的網(wǎng)絡(luò)流量全部劫持到proxy容器,經(jīng)由proxy容器處理后再進(jìn)行下一步轉(zhuǎn)發(fā)。
Proxy容器的處理規(guī)則通過istiod控制面下發(fā),主要分為流量控制、安全、可觀測性三大類。以可觀測性為例的大量規(guī)則都僅對流經(jīng)的數(shù)據(jù)進(jìn)行統(tǒng)計,監(jiān)控,鏈路追蹤等附加操作,不影響和改變業(yè)務(wù)本身的請求。但是當(dāng)proxy容器自身或其依賴的服務(wù)出現(xiàn)問題時,因其流量劫持動作,往往會造成整個服務(wù)不可用。
目前處理此類問題的方法,以人工干預(yù)為主,當(dāng)服務(wù)不可用時,通過告警通知運(yùn)維人員,運(yùn)維人員進(jìn)行現(xiàn)場問題定位及處理。在有proxy邊車的場景下,若proxy問題不能快速解決,運(yùn)維人員也經(jīng)常需要手動去除proxy容器邊車,先恢復(fù)業(yè)務(wù)流量再做細(xì)致排查。如果能自動化檢測proxy故障并進(jìn)行及時處理,會大大提供微服務(wù)框架下的服務(wù)可用性,減少故障帶來的損失及人力排查成本
實(shí)現(xiàn)方案如下:
整體結(jié)構(gòu):
具體方法:
1.在istio控制面加入故障檢測及流量阻斷模塊‘hot-switch’.
2.在istio的邊車代理proxy內(nèi)部加入故障檢測命令,并與控制面故障檢查模塊通信,具體檢測命令例如:
a.Watch相關(guān)pod的proxy容器狀態(tài),當(dāng)容器狀態(tài)為fail時,表示proxy容易已經(jīng)不再存活;
b.通過檢查proxy容器的15021 health端口,若返回值false,則proxy存活但不健康等等;
3.自動檢測確認(rèn)代理proxy問題后,hot-switch通過進(jìn)入pod執(zhí)行iptables相關(guān)命令,停止proxy的流量劫持,將流量模式由proxy控制管理,改為直通業(yè)務(wù)容器
a.在pod啟動前,proxy進(jìn)行流量劫持的過程:首先運(yùn)行 Init 容器,Init 容器用于設(shè)置 iptables 將進(jìn)入 pod 的流量劫持到 Envoy sidecar proxy。
具體命令類似 :Istio-iptables -p 15001 -z 15006 -u 1337 -m REDIRECT -i '*' -x "" -b * -d "15090,15201,15020"
envoy sidecar proxy 啟動之后從pilot獲得動態(tài)的規(guī)則,來對進(jìn)出流量進(jìn)行控制,流量劫持后的鏈路如下
b.檢測確認(rèn)proxy問題后,通過iptables的反向命令,清除流量劫持規(guī)則,可用命令為 istio-clean-iptables
該方案無需人工參與,可自動檢測問題,快速處理,在網(wǎng)格邊車出現(xiàn)故障的時候也能通過一定程度的服務(wù)降級,最大程度保障服務(wù)的基本可用性
*博客內(nèi)容為網(wǎng)友個人發(fā)布,僅代表博主個人觀點(diǎn),如有侵權(quán)請聯(lián)系工作人員刪除。