iT邦幫忙

2026 iThome 鐵人賽

DAY 28
0

Day27 說了 Harbor 跨站複寫,讓不同站點都能取得需要的 image。接著就有另一個問題:服務部署在兩個站點,使用者的請求要送去哪裡?其中一站無法提供服務時,流量又怎麼切換?

今天會透過站點 A 與 B 的情境,說明 DNS-based GSLB 與 Istio 的分工,並且透過單站服務下線來觀察流量會怎麼被傳輸。

建置兩個站點的用意

Kubernetes 能在叢集裡管理多個 Pod,而雙站點則可以讓服務分散到不同機房或區域,降低單一站點因為電力、網路或基礎設施故障造成的影響,如果某站點真的發生問題時,也可以有另一站作為備援繼續處理請求,讓服務不因此中斷。

不過,維護範圍也會增加:

  • 部署與維運:兩站的設定、image、憑證、監控與部署 / 復原流程都要維護。
  • 資料與狀態:資料庫、檔案儲存與登入 session 的跨站使用方式。
  • 容量:一站退出後,另一站要有能力負擔流量。

DNS-based GSLB 怎麼選站?

GSLB 是 Global Server Load Balancing,用來處理多站點的一項技術,而不同產品有不同做法,今天的文章會透過 DNS-based 這一種方式的 GSLB 來說明。

假設 A、B 兩個站點都能提供 api.example.com 的服務,則大概可以把過程分成兩段:

  • DNS 查詢:用戶端透過 DNS resolver 查詢網域。查詢依 DNS 委派或 CNAME 等設定到達 GSLB,由它依站點健康與選站規則回覆位址。
  • HTTP/HTTPS 請求:用戶端拿到位址後,建立連線,將請求送到該站入口。

DNS 選站完成後,HTTP 請求直接連到選中的站點,DNS-based GSLB 負責的是回應 DNS 解析結果。

https://ithelp.ithome.com.tw/upload/images/20261012/20124323n7s0r6yOFg.png

例如這次回覆 A,請求就進入 A,之後 A 的健康檢查失敗,而 B 仍可服務,選站規則可以讓後續 DNS 回答改選 B。

DNS 權重影響的是 DNS 回答的選擇。resolver 快取、用戶數與連線重用,都會影響實際流量,所以 DNS 權重與 HTTP 請求比例可能有落差。

Active/Active 與 Active/Standby 怎麼選?

沿用 A、B 兩站,可以採兩種常見安排:

  • Active/Active:平常兩站都提供服務,依權重、位置或其他規則選站。一站退出後,將後續選站結果導向其他健康站點。
  • Active/Standby:平常優先使用 A,B 作為備援;A 無法提供服務時,依規則改用 B。也常稱為 Active/Passive。

Active/Active 能持續使用兩站資源,要安排好資料寫入與狀態一致性。Active/Standby 的日常流量比較集中,備援站則要定期驗證;需要擴容或啟動元件時,準備時間也會影響恢復速度,納入選站前要確認服務已就緒。

這些名稱要搭配範圍來看。某個 API Gateway 有兩台主備設備,說明的是那一層設備的安排;跨站服務如何切換,則由跨站健康判斷與流量規則處理。

進入站點後,Istio 做什麼?

GSLB 選擇用戶端接下來連到哪一站。進入該站後,就回到 Day21 說過的 Istio 入口與路由:

  • Istio ingress gateway:實際接收與轉送請求的代理,由 Envoy 執行。
  • Gateway:描述入口接受的連接埠、網域與 TLS 等設定。
  • VirtualService:描述 Host、路徑與路由目的地,例如把 /api 送到 api-a。
  • Service/EndpointSlice:Service 提供服務的邏輯目的;EndpointSlice 記錄對應的 endpoints 與就緒資訊,供服務探索使用。

Gateway、VirtualService 是設定資源,請求由 ingress gateway 的 Envoy 依設定處理。Istio 整理路由與服務探索資訊後下發給 Envoy,Envoy 可以選擇對應的 Pod 轉送請求。

站內 Pod 的 readiness 影響可選的服務 endpoints;跨站健康檢查則影響站點是否繼續被納入選擇。兩者各有自己的觀察範圍。

故障發生後,為什麼會有切換時間差?

假設 A 的 API 發生問題,B 仍可正常服務。這個故障切換過程叫 failover,會受到下面幾件事影響:

  • 健康檢查:多久檢查一次、等待多久、連續失敗幾次才判定異常。
  • 選站規則:判定 A 異常後,後續 DNS 查詢回覆哪些站點。
  • DNS 快取:resolver 與用戶端可能仍保存先前取得的 A 位址。
  • 既有連線:keep-alive、HTTP/2 等連線可能持續連到原站點。
  • 用戶端行為:失敗後等待多久、何時重連,以及重試時是否重新解析 DNS。

https://ithelp.ithome.com.tw/upload/images/20261012/20124323vV6MTu8Cmo.png

TTL 控制 DNS 紀錄的快取時間。較短的 TTL 通常能讓舊結果較快到期,也會增加 DNS 查詢次數。

例如 TTL 設為 30 秒,實際恢復時間仍受到上述因素影響。DNS 回答更新後,既有連線會持續到結束或失敗,後續由用戶端重新建立連線。

健康檢查也要選好內容:TCP 檢查觀察連接埠能否接受連線;HTTP 檢查則指定 Host、路徑與預期狀態碼。路徑要能反映服務能力,並避免每次都執行昂貴的業務操作。

切到 B 之後,服務要能接著使用

流量能到 B,接著要看 B 是否具備完整的服務條件:

  • 資料:同步方式、同步延遲,以及能接受多少資料落差。
  • session:登入狀態保存在哪裡,切站後能否繼續使用。
  • 容量:B 能承接多少請求,資料庫與外部相依服務是否也有足夠容量。
  • 重試:安排次數與等待時間;寫入操作要處理重複執行的風險。

資料同步越即時、備援容量越完整,通常需要更多成本;可以依服務允許的恢復時間與資料落差選擇安排。

A 修復後,重新讓它接回流量的過程叫 failback。可以先確認服務、資料與容量已恢復,再逐步納入,或安排手動切回。是否自動恢復選站,取決於產品與設定。

驗證時,可以記錄故障發生、健康狀態更新、請求成功率與恢復時間,讓切換流程有實際數據可看。

一次單站服務下線的觀察

我在一個雙站專案裡,先把外部與內網流量分開整理:

  • 外部請求:經單一 DMZ 入口,再進入兩站的企業 API Gateway,由 Gateway 以 Round Robin 分送到兩站的 Istio。DMZ 是外部入口所在的網路區段。
  • 內網業務請求:業務前端位於叢集外,直接呼叫 Istio 入口。

https://ithelp.ithome.com.tw/upload/images/20261012/20124323kZ0X6Ie3vW.png

這個案例的跨站分流由 API Gateway 處理,與前面用來說明概念的 DNS-based GSLB 情境分開看。

後來透過內網開發環境的 API Gateway執行測試,暫時把 A 站某個服務的副本降到 0,維持 10 分鐘,B 站服務持續就緒。

九個完整下線分鐘裡,約一半請求成功,另一半收到 HTTP 503;A 站服務恢復後,觀察區間的請求回到全部成功。

這次能確認的是:在當時的路徑與設定下,單站服務下線時仍有部分請求失敗。後續可以配合入口 log 或 trace,確認故障端點何時退出分流,以及健康檢查與重試如何運作。

這次測的是 API Gateway 到服務的路徑,以及 A 站的一個服務下線。外部 DMZ、機房故障與 DNS/GSLB 切換,要各自安排驗證;詳細測試方式留到後面的 k6 文章。

整理雙站架構時,我會先畫出實際流量路徑,再標示每一層的健康判斷與切換責任。這樣看到錯誤時,就比較清楚要從哪一段開始確認。

參考資料


上一篇
Day 27 - Harbor 是什麼?從 image 管理到跨站同步
下一篇
Day 29 - 服務故障的問題查找方向
系列文
初見 Kubernetes - 純網站後端開發踏入 K8s 世界的經驗分享 共 29 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言