iT邦幫忙

2025 iThome 鐵人賽

DAY 23
1
Build on AWS

AWS 雲原生,學起來比泡咖啡還快系列 第 23

DAY23 - EKS後的下一步? 一個關於監控演進的故事:從小餐廳到跨國連鎖企業

  • 分享至 

  • xImage
  •  

小李的餐廳夢想

小李是個程式設計師,但他有個夢想 - 開一家餐廳。這個故事要從他的小餐廳說起,因為餐廳的經營演進,竟然完美地反映了軟體系統監控的發展歷程。

2010年,小李在台北巷弄裡開了一家只有10個座位的小麵店。那時候,他一個人身兼老闆、廚師、服務生,每天忙得團團轉,但心裡很踏實 - 因為所有事情都在他的掌控之中。客人點什麼、廚房缺什麼、今天賺了多少錢,他都一清二楚。

這就像早期的單體應用程式。所有功能都在一個系統裡,出了問題很容易找到原因,修復也很直接。那時候的監控很簡單:看看 CPU 使用率、記憶體夠不夠、硬碟有沒有滿,就像小李看看瓦斯夠不夠、食材新不新鮮、收銀機裡有多少錢一樣直觀。

生意好了,問題來了

三家分店的挑戰

生意越來越好,小李決定擴張。2015年,他在台北開了三家分店:信義店、西門店、還有士林店。每家店都有自己的廚房、服務生、收銀台。

剛開始,小李以為管理三家店就是把原來的模式複製三遍。但很快他就發現,事情沒那麼簡單。

有一天晚上,小李接到信義店店長的電話:「老闆,我們的牛肉麵賣完了,但客人還在排隊。」

「那就跟西門店調貨啊!」小李說。

「可是西門店說他們也快賣完了,而且士林店今天休息,我們不知道明天的食材夠不夠。」

小李這才意識到,當餐廳變成多家分店後,他再也無法像以前那樣一眼看穿所有狀況。每家店的庫存、營業額、客流量都是分散的資訊,他需要一個新的方法來掌握全局。

這就是分散式系統帶來的第一個挑戰:資訊分散。以前所有資料都在一個地方,現在分散在不同的節點上。就像小李需要知道三家店的即時狀況一樣,系統管理員需要監控分散在不同伺服器上的應用程式。

那個讓人頭痛的週末

更糟的事情發生在一個週末。士林店的收銀系統突然當機,但奇怪的是,信義店和西門店都正常運作。客人無法結帳,但廚房還在正常出餐,造成了巨大的混亂。

小李趕到士林店,發現問題出在網路連線。原來三家店共用一個中央的會員系統和庫存管理系統,士林店的網路出問題後,無法連接到中央系統,所以收銀機不知道該怎麼處理會員折扣和庫存扣減。

「為什麼其他兩家店沒問題?」小李問技術人員。

「因為網路問題只影響士林店,但中央系統還是正常的。這就是部分故障 - 系統的一部分壞了,但其他部分還在運作。」

這讓小李學到了分散式系統的第二個重要概念:部分故障。在單店時代,要嘛整個店正常,要嘛整個店有問題。但在多店模式下,可能出現一家店有問題,其他店正常的情況,這讓問題診斷變得複雜許多。

時間同步的重要性

還有一次,小李發現帳目對不上。明明三家店的日營業額加起來應該是 15 萬,但中央系統顯示只有 12 萬。

經過調查才發現,原來是時間同步的問題。士林店的收銀機時間慢了 3 小時,所以晚上 9 點的交易被記錄成晚上 6 點,跨日的帳務處理就出錯了。

「時間怎麼會這麼重要?」小李不解。

技術人員解釋:「在分散式系統中,時間同步非常關鍵。如果各個節點的時鐘不一致,就無法正確地排序事件,也無法準確地分析問題發生的順序。」

從那之後,小李要求所有分店的系統都必須定期校時,就像所有伺服器都需要使用 NTP 服務來同步時間一樣。

小李的監控覺醒

經歷了這些挫折後,小李決定建立一套完整的監控系統。他聘請了一位有經驗的餐飲管理顧問老王。

老王告訴他:「你需要的不只是知道每家店賺了多少錢,你需要知道為什麼賺這麼多,或為什麼賺這麼少。」

老王教小李建立了三套監控機制:

第一套:數字指標
每家店每小時回報:客流量、營業額、食材消耗量、員工出勤狀況。這就像系統監控中的 metrics - 用數字來量化系統的狀態。

第二套:事件記錄
每當發生特殊事件,比如設備故障、客訴、員工請假,都要詳細記錄時間、原因、處理方式。這就像系統的 logs - 記錄所有重要事件的詳細資訊。

第三套:流程追蹤
追蹤一個客人從進店到離店的完整體驗:排隊多久、點餐多久、出餐多久、用餐多久。這就像分散式追蹤 - 跟蹤一個請求在系統中的完整路徑。

「這三套資訊結合起來,你就能快速找到問題的根源。」老王說,「比如營業額下降(指標異常),你可以查看是否有設備故障(事件記錄),或者是出餐時間變長(流程追蹤)。」

平衡的藝術

老王還教了小李一個重要概念:「你不可能同時做到所有事情都完美。」

他畫了一個三角形:「一致性、可用性、容錯性,你只能選兩個。」

「什麼意思?」小李問。

「比如說,你想要所有分店的菜單價格都一致(一致性),而且所有分店都要正常營業(可用性)。但如果總部的系統壞了,分店就收不到最新的價格更新。這時候你有兩個選擇:要嘛停止營業等系統修好(犧牲可用性),要嘛繼續用舊價格營業(犧牲一致性)。」

小李恍然大悟:「所以我們選擇繼續營業,用舊價格,等系統修好再統一調整。」

「沒錯,這就是在分散式系統中做選擇。沒有完美的解決方案,只有最適合的權衡。」

那個忙碌的母親節

小李永遠記得 2016 年的母親節。那天是他開店以來最忙的一天,三家店同時爆滿,訂位電話響個不停。

早上 11 點,災難開始了。

先是信義店的廚師打電話:「老闆,我們的牛肉湯底用完了,但中央廚房說還要一小時才能送到。」

接著西門店也來電:「收銀系統很慢,客人結帳要等很久,開始有人抱怨了。」

然後士林店:「我們的冷氣壞了,客人都在流汗,有人要求退費。」

以前的小李可能會慌張地到處救火,但現在他冷靜地打開監控儀表板。

螢幕上清楚顯示:

  • 信義店:食材庫存紅燈,預計 12:30 斷貨
  • 西門店:收銀系統回應時間從平常的 2 秒變成 15 秒
  • 士林店:室內溫度 32 度,客人滿意度評分直線下降

更重要的是,系統還顯示了關聯分析:收銀系統變慢是因為母親節促銷活動導致會員查詢量暴增,資料庫負載過高。

小李立刻做出決策:

  1. 緊急調度西門店的牛肉湯底支援信義店
  2. 暫時關閉會員積點功能,減輕資料庫負載
  3. 士林店提供免費飲料作為補償,並緊急聯絡維修廠商

結果,危機在 30 分鐘內化解,三家店都順利度過了母親節高峰。

「這就是分散式監控的威力,」老王後來總結,「你不只看到問題,還能看到問題之間的關聯,做出最有效的決策。」

分散式監控的最佳實踐

1. 監控數據的分層收集

# 分層監控策略
monitoring_layers:
  infrastructure:
    - cpu_usage: "基礎設施層"
    - memory_usage: "硬體資源"
    - network_io: "網路狀況"
    - disk_io: "儲存效能"
    
  platform:
    - service_discovery: "服務註冊狀態"
    - load_balancer: "負載均衡器狀態"
    - message_queue: "訊息佇列深度"
    - database_pool: "連接池使用率"
    
  application:
    - business_metrics: "業務指標"
    - user_experience: "用戶體驗"
    - error_rates: "錯誤率"
    - response_times: "回應時間"

2. 監控數據的時間同步

// 分散式系統時間同步的重要性
type DistributedEvent struct {
    NodeID    string
    Timestamp time.Time
    Event     string
}

func AnalyzeDistributedEvents(events []DistributedEvent) {
    // 問題:不同節點的時鐘可能不同步
    // 解決方案:使用 NTP 同步 + 邏輯時鐘
    
    for _, event := range events {
        // 調整時間偏移
        adjustedTime := adjustForClockSkew(event.Timestamp, event.NodeID)
        
        // 使用邏輯時鐘排序事件
        logicalClock := getLogicalClock(event.NodeID)
        
        fmt.Printf("Node: %s, Time: %v, Logical: %d, Event: %s\n", 
                   event.NodeID, adjustedTime, logicalClock, event.Event)
    }
}

連鎖帝國的誕生

從三家店到三十家店

2018年,小李的餐廳事業蒸蒸日上。他不再滿足於只有三家分店,決定大舉擴張,在全台開設 30 家分店。但這次,他採用了一個全新的經營模式。

以前,每家分店都是一個完整的餐廳 - 有廚房、服務生、收銀台、清潔人員。現在,小李決定把這些功能拆分開來:

  • 中央廚房:專門負責備料和半成品製作
  • 配送中心:負責把食材配送到各分店
  • 客服中心:統一處理客訴和訂位
  • 財務中心:處理所有分店的帳務
  • 行銷部門:負責促銷活動和會員管理
  • 清潔公司:外包的清潔服務
  • 維修團隊:專門處理設備維修

每家分店變得很精簡,主要就是接單、簡單加工、出餐。這就像微服務架構 - 把原本一個大系統拆分成許多小的、專門的服務。

一碗牛肉麵的奇幻旅程

有一天,小李想了解一個客人點一碗牛肉麵的完整流程,結果發現比他想像的複雜太多:

  1. 客人用手機 App 點餐(訂單服務
  2. 系統檢查客人是否為會員(會員服務
  3. 確認分店是否有足夠食材(庫存服務
  4. 計算價格和優惠(定價服務
  5. 處理付款(支付服務
  6. 通知廚房開始製作(廚房管理服務
  7. 更新庫存數量(庫存服務
  8. 發送製作完成通知(通知服務
  9. 記錄交易資料(財務服務
  10. 更新會員積點(會員服務
  11. 收集客戶滿意度(客服服務

「天啊,一碗麵要經過這麼多步驟?」小李驚訝地說。

老王笑了:「這就是微服務的特色。每個服務都很專精,但要完成一個完整的業務流程,需要很多服務協作。好處是每個服務可以獨立升級、獨立擴展,但壞處是...」

「壞處是什麼?」

「任何一個環節出問題,整個流程就可能卡住。」

蝴蝶效應的威力

老王的話很快就得到了驗證。

那是一個平常的週二下午,小李正在辦公室處理文件,突然接到客服中心的電話:「老闆,很多客人反映無法完成點餐,系統一直顯示『處理中』。」

小李立刻查看監控系統,發現一個奇怪的現象:

  • 訂單服務:正常運作
  • 會員服務:正常運作
  • 庫存服務:正常運作
  • 定價服務:正常運作
  • 支付服務:回應時間異常,從平常的 1 秒變成 30 秒

「支付服務怎麼了?」小李問技術主管小陳。

小陳查了一下:「支付服務本身沒問題,但它依賴的銀行 API 回應很慢。」

「那為什麼會影響到整個點餐流程?」

「因為訂單服務要等支付確認才能完成,支付服務要等銀行回應才能確認。現在銀行 API 慢了,整個鏈條都卡住了。」

這就是微服務架構中的「級聯故障」。一個看似不重要的服務出問題,可能導致整個系統癱瘓。就像交通堵塞一樣,一個路口塞車,可能影響整個城市的交通。

偵探遊戲

為了解決這類問題,小李和小陳開發了一套「服務地圖」系統。這個系統可以即時顯示所有服務之間的依賴關係,就像一張複雜的地鐵路線圖。

當某個服務出問題時,系統會自動標示出可能受影響的其他服務,並且用不同顏色顯示影響程度:

  • 綠色:正常運作
  • 黃色:輕微影響
  • 橘色:明顯影響
  • 紅色:嚴重影響

「這樣我們就能快速找到問題的根源,」小陳解釋,「而且可以預測哪些服務可能會受到影響。」

有了這套系統,小李團隊處理問題的速度大幅提升。以前可能要花一小時才能找到問題根源,現在通常 5 分鐘就能定位。

追蹤一碗麵的身世

小李想要更深入了解問題,所以他們開發了一個「訂單追蹤」功能。每個訂單都有一個獨特的編號,系統會記錄這個訂單在各個服務中的處理時間。

有一天,一位客人抱怨點餐花了 5 分鐘才完成,小李決定追蹤這個訂單的完整路徑:

訂單編號:20240315-001234

  1. 客人點餐 → 訂單服務 (0.1 秒)
  2. 訂單服務 → 會員服務檢查身份 (0.3 秒)
  3. 會員服務 → 資料庫查詢會員資料 (0.2 秒)
  4. 訂單服務 → 庫存服務檢查食材 (1.2 秒)
  5. 庫存服務 → 資料庫查詢庫存 (1.0 秒)
  6. 訂單服務 → 定價服務計算價格 (0.1 秒)
  7. 訂單服務 → 支付服務處理付款 (180 秒) ← 問題在這裡!
  8. 支付服務 → 銀行 API 確認付款 (175 秒)
  9. 支付服務 → 風險控制檢查 (3 秒)
  10. 訂單服務 → 通知服務發送確認 (0.5 秒)

「原來問題出在銀行 API,」小李恍然大悟,「客人等了 3 分鐘,其實有 2 分 55 秒都在等銀行回應。」

這種追蹤方式讓小李能夠精確定位問題,而不是盲目地猜測。就像醫生用 X 光片看到骨折的確切位置,而不是只知道「腿痛」一樣。

四個黃金指標

老王教了小李一個重要概念:「不管你有多少個服務,每個服務都要關注四個關鍵指標。」

「哪四個?」

「延遲、流量、錯誤、飽和度。」老王在白板上畫了四個圓圈。

https://aws.amazon.com/tw/what-is/sre/

「延遲就是回應時間,客人點餐到確認需要多久?流量就是處理量,一小時能處理多少訂單?錯誤就是失敗率,有多少比例的訂單失敗?飽和度就是資源使用率,系統負載有多重?」

「這四個指標就像人的體溫、血壓、心跳、呼吸,」老王繼續說,「只要這四個指標正常,服務基本上就是健康的。如果有異常,你就知道該往哪個方向調查。」

小李把這四個指標應用到每個服務上,建立了一套標準化的監控體系。不管是支付服務、庫存服務還是通知服務,都用同樣的標準來衡量健康狀況。

3. 服務網格監控

# Istio 服務網格監控配置
apiVersion: install.istio.io/v1alpha1
kind: IstioOperator
metadata:
  name: control-plane
spec:
  values:
    telemetry:
      v2:
        prometheus:
          configOverride:
            metric_relabeling_configs:
            - source_labels: [__name__]
              regex: 'istio_request_duration_milliseconds'
              target_label: __name__
              replacement: 'http_request_duration_ms'
            
    # 自動注入 sidecar 進行監控
    sidecarInjectorWebhook:
      enableNamespacesByDefault: true
      
  components:
    pilot:
      k8s:
        resources:
          requests:
            memory: "128Mi"
            cpu: "10m"

微服務監控的實戰策略

1. 黃金指標 (Golden Signals)

// Google SRE 提出的四個黃金指標
type GoldenSignals struct {
    Latency     float64  // 延遲:請求處理時間
    Traffic     float64  // 流量:每秒請求數
    Errors      float64  // 錯誤:錯誤率
    Saturation  float64  // 飽和度:資源使用率
}

// 為每個微服務收集黃金指標
func MonitorMicroservice(serviceName string) GoldenSignals {
    return GoldenSignals{
        Latency:    calculateP95Latency(serviceName),
        Traffic:    calculateRPS(serviceName),
        Errors:     calculateErrorRate(serviceName),
        Saturation: calculateResourceUsage(serviceName),
    }
}

// 實際應用範例
services := []string{"auth", "order", "payment", "inventory"}
for _, service := range services {
    signals := MonitorMicroservice(service)
    
    // 設置告警閾值
    if signals.Latency > 1000 {  // P95 > 1s
        alert(fmt.Sprintf("%s service latency too high: %.2fms", service, signals.Latency))
    }
    
    if signals.Errors > 0.01 {   // 錯誤率 > 1%
        alert(fmt.Sprintf("%s service error rate too high: %.2f%%", service, signals.Errors*100))
    }
}

2. RED 指標 (Rate, Errors, Duration)

# RED 指標監控實現
class REDMetrics:
    def __init__(self, service_name):
        self.service_name = service_name
        self.prometheus = PrometheusClient()
    
    def get_rate(self, time_window="5m"):
        """請求速率 - Rate"""
        query = f'rate(http_requests_total{{service="{self.service_name}"}}[{time_window}])'
        return self.prometheus.query(query)
    
    def get_errors(self, time_window="5m"):
        """錯誤率 - Errors"""
        error_query = f'rate(http_requests_total{{service="{self.service_name}",status=~"5.."}}}[{time_window}])'
        total_query = f'rate(http_requests_total{{service="{self.service_name}"}}[{time_window}])'
        
        errors = self.prometheus.query(error_query)
        total = self.prometheus.query(total_query)
        
        return errors / total if total > 0 else 0
    
    def get_duration(self, percentile=95):
        """回應時間 - Duration"""
        query = f'histogram_quantile(0.{percentile}, rate(http_request_duration_seconds_bucket{{service="{self.service_name}"}}[5m]))'
        return self.prometheus.query(query)

# 使用範例
payment_service = REDMetrics("payment-service")
print(f"Payment Service RED Metrics:")
print(f"Rate: {payment_service.get_rate()} RPS")
print(f"Errors: {payment_service.get_errors()*100:.2f}%")
print(f"Duration P95: {payment_service.get_duration(95)*1000:.2f}ms")

從救火隊到預防專家

小張的加入

2020年,小李的餐廳帝國已經有 50 家分店,但他發現自己和團隊每天都在「救火」。今天這家店的收銀機壞了,明天那家店的冷氣不冷,後天又有分店的網路斷線。

「我們不能再這樣下去了,」小李對老王說,「我們需要從被動應對變成主動預防。」

老王推薦了一位朋友小張,她曾經在 Google 工作,專門負責系統可靠性工程(SRE)。

小張來到公司的第一天,就問了一個讓小李印象深刻的問題:「你們的服務水準協議是什麼?」

「什麼是服務水準協議?」小李困惑地問。

「就是你們承諾給客人什麼樣的服務品質。比如,你們保證客人點餐後多久能拿到餐點?你們保證一個月內會有幾次系統故障?」

小李從來沒想過這個問題。以前他只是盡力做好,但從來沒有量化過「好」的標準。

錯誤預算的概念

小張教了小李一個革命性的概念:「錯誤預算」。

「什麼意思?」小李問。

「假設你們承諾 99.9% 的時間系統都能正常運作,那麼一個月就有 0.1% 的時間可以出錯,這就是你們的錯誤預算。」

小張在白板上算給小李看:「一個月有 43,200 分鐘,0.1% 就是 43.2 分鐘。也就是說,你們一個月可以『故障』43 分鐘,這是可以接受的。」

「那如果我們用完了這 43 分鐘呢?」

「那就暫停所有新功能的開發,專心修復系統,直到系統穩定為止。」

這個概念讓小李大開眼界。以前他總是追求 100% 完美,但小張告訴他,追求 100% 完美的成本是無限大的,而且客人也不需要 100% 完美。

「99.9% 的可靠性對餐廳來說已經足夠了,」小張說,「重要的是要量化這個目標,並且持續監控是否達成。」

從反應式到預測式

小張帶來的最大改變是思維模式的轉換。

以前,小李的團隊是這樣工作的:

  1. 等問題發生
  2. 客人抱怨
  3. 緊急修復
  4. 問題解決,繼續等下一個問題

現在,小張教他們這樣工作:

  1. 監控系統指標
  2. 發現異常趨勢
  3. 在問題影響客人之前就解決
  4. 分析根本原因,防止類似問題再次發生

「我們要從救火隊變成預防專家,」小張說。

舉個例子,以前收銀系統當機,他們才知道有問題。現在,他們監控收銀系統的回應時間,當回應時間從平常的 1 秒增加到 3 秒時,就會收到警告。這時候系統還沒當機,客人也還沒抱怨,但他們已經開始調查和處理了。

自動化的力量

小張還帶來了另一個重要概念:自動化。

「人會犯錯,電腦不會,」她說,「所以能自動化的事情就不要讓人來做。」

她幫小李建立了很多自動化機制:

自動重啟:當某個服務回應時間超過 10 秒,系統會自動重啟該服務。

自動擴容:當某家分店的訂單量超過平常的 150%,系統會自動增加廚房人力配置。

自動告警:當任何指標異常,系統會自動發送通知給相關負責人。

自動修復:當發現常見問題(比如磁碟空間不足),系統會自動清理暫存檔案。

「但是,」小張強調,「自動化不是萬能的。重要的決策還是需要人來做。自動化只是幫我們處理那些重複性、低風險的工作。」

混沌實驗

小張還引入了一個聽起來很可怕的概念:「混沌工程」。

「我們要故意製造一些小問題,看看系統能不能自己恢復,」她說。

「什麼?故意製造問題?」小李嚇了一跳。

「對,比如我們故意讓某家分店的網路斷線 5 分鐘,看看其他分店是否受影響,看看系統是否能自動切換到備用方案。」

「這不是很危險嗎?」

「在可控的範圍內製造小問題,總比在不可控的情況下遇到大問題要好。」小張解釋,「就像疫苗一樣,注射少量的病毒讓身體產生抗體,這樣真正遇到病毒時就不會生病。」

經過幾次混沌實驗,小李發現了很多平時沒注意到的問題,也讓系統變得更加穩定。

事後檢討的文化

小張還建立了一個重要的文化:「無責備的事後檢討」。

每當發生重大問題,團隊會召開檢討會議,但重點不是追究誰的責任,而是分析問題的根本原因,並且制定預防措施。

「人都會犯錯,」小張說,「重要的是從錯誤中學習,讓同樣的錯誤不再發生。如果我們一味地責備,大家就會隱瞞問題,這樣我們就學不到任何東西。」

這種文化讓團隊更願意主動報告問題,也讓系統持續改進。

SRE 團隊的監控職責

🎯 SRE 團隊的日常工作

On-call 輪值 (25%):
├── 監控告警回應
├── 事故處理和根因分析
├── 緊急修復和回滾
└── 事故後檢討 (Post-mortem)

系統改進 (50%):
├── 監控系統優化
├── 自動化工具開發
├── 可靠性工程項目
└── 效能調優和容量規劃

協作支援 (25%):
├── 協助開發團隊設計可靠系統
├── 代碼審查 (關注可靠性)
├── 培訓和知識分享
└── 監控最佳實踐推廣

雲端的完美解決方案

遇見 AWS EKS

2022年,小李的餐廳事業已經擴展到全亞洲,有超過 200 家分店。傳統的 IT 基礎設施已經無法支撐這樣的規模,維護成本也越來越高。

這時候,小張建議他們遷移到雲端,特別是使用 AWS 的 EKS(Elastic Kubernetes Service)。

「為什麼是 EKS?」小李問。

「因為它完美地解決了我們之前遇到的所有問題,」小張說,「還記得我們從單店到多店,再到微服務架構的演進嗎?EKS 就是為這種複雜的微服務架構而生的。」

小張在白板上畫了一個圖:「EKS 就像一個超級智能的城市管理系統,它不只管理我們的服務,還提供了完整的監控、自動化、和故障恢復能力。」

三層監控的完美實現

小張解釋 EKS 如何實現他們需要的三層監控:

第一層:基礎設施監控
「就像監控每家分店的水電、空調、網路一樣,EKS 會自動監控所有伺服器的 CPU、記憶體、磁碟、網路狀況。而且這些都是自動的,我們不需要手動設置。」

第二層:平台監控
「EKS 會監控 Kubernetes 集群的健康狀況,包括節點是否正常、Pod 是否運行、服務是否可達。這就像監控我們的配送系統、通訊系統是否正常一樣。」

第三層:應用監控
「我們可以監控每個微服務的效能,追蹤客人訂單的完整路徑,分析業務指標。這就像我們之前做的服務監控,但更加智能和自動化。」

Container Insights:全方位的透視能力

小張特別興奮地介紹 Container Insights:「這就像給我們的整個系統裝上了 X 光機,可以看到每個容器、每個服務的內部狀況。」

她展示了一個儀表板:「你看,這裡顯示了所有分店系統的即時狀況。綠色表示正常,黃色表示需要注意,紅色表示有問題。而且它會自動收集所有的指標,我們不需要手動配置。」

小李看著螢幕上密密麻麻的圖表和數字,感到既興奮又有點眼花撩亂:「這些數據這麼多,我們怎麼知道該關注什麼?」

「這就是 Container Insights 的聰明之處,」小張說,「它會自動幫我們篩選重要的資訊,並且用視覺化的方式呈現。比如這個熱力圖,顏色越深表示負載越重,我們一眼就能看出哪些服務需要關注。」

X-Ray:追蹤的藝術

「還記得我們之前追蹤一碗牛肉麵的完整流程嗎?」小張問,「X-Ray 就是專門做這件事的工具,而且比我們之前的系統強大太多。」

她打開另一個畫面,顯示了一個複雜的流程圖:「這是一個客人下訂單的完整路徑。你看,從客人點擊『確認訂單』開始,請求經過了 15 個不同的服務,X-Ray 記錄了每個步驟的時間。」

小李仔細看著圖表:「這個支付服務怎麼花了 3 秒?其他服務都只要幾十毫秒。」

「沒錯!X-Ray 幫我們找到了瓶頸。我們可以點進去看詳細資訊。」小張點擊支付服務的節點,「原來是銀行 API 回應慢,我們可以考慮增加重試機制或者切換到更快的支付通道。」

「這太神奇了,」小李感嘆,「以前我們要花好幾個小時才能找到的問題,現在幾分鐘就能定位。」

Prometheus 和 Grafana:監控的黃金組合

小張繼續介紹:「除了 AWS 原生的監控工具,EKS 還完美支援開源的監控工具,比如 Prometheus 和 Grafana。」

「這兩個工具有什麼特別的?」小李問。

「Prometheus 就像一個超級勤奮的資料收集員,它會定期去每個服務那裡收集指標資料。Grafana 則是一個藝術家,它把這些枯燥的數字變成美麗的圖表和儀表板。」

小張展示了一個 Grafana 儀表板:「你看,這個儀表板顯示了我們所有服務的健康狀況。這些圖表不只是好看,更重要的是它們能幫我們快速理解系統的狀態。」

儀表板上有各種圖表:

  • 即時的訂單處理量
  • 各個服務的回應時間趨勢
  • 錯誤率的變化
  • 系統資源使用情況

「而且最棒的是,」小張說,「我們可以設置告警規則。當任何指標異常時,系統會自動通知我們,甚至可以自動執行一些修復動作。」

自動化的極致

小李最感興趣的是 EKS 的自動化能力。

「還記得我們之前手動擴容的痛苦嗎?」小張問,「在 EKS 中,這些都是自動的。」

她解釋了幾個自動化功能:

自動擴展:當訂單量增加時,系統會自動增加更多的服務實例來處理負載。當負載降低時,又會自動減少實例來節省成本。

自動修復:當某個服務實例出問題時,EKS 會自動重啟或替換它,整個過程不需要人工介入。

自動更新:當有新版本的服務要部署時,EKS 可以自動進行滾動更新,確保服務不中斷。

自動備份:重要的資料會自動備份到多個地點,確保資料安全。

「這就像有一個超級智能的管家,」小李說,「它知道什麼時候該做什麼事,而且從不出錯。」

「沒錯,」小張笑著說,「而且這個管家還會學習。它會分析歷史資料,預測未來的需求,提前做好準備。」

從小麵店到全球連鎖的啟示

十年後的回顧

2024年,小李站在他位於台北 101 的辦公室裡,俯瞰著這座城市。他的餐廳事業已經遍布全球 30 個國家,擁有超過 1000 家分店。

回想起 2010 年那個只有 10 個座位的小麵店,小李感慨萬千。那時候的他,絕對想不到監控系統會變得如此重要,也想不到技術會如此深刻地改變他的事業。

「還記得你第一次跟我說要建立監控系統時,我覺得那只是浪費錢,」小李對老王說,「現在我才明白,監控不只是技術工具,更是經營哲學。」

老王笑了:「是啊,從單店到分店,從分店到微服務,從微服務到 EKS,每一步都是必然的演進。技術在變,但核心原則沒變 - 我們需要了解我們的系統,才能管理好我們的系統。」

監控的本質

小張也加入了對話:「其實監控的本質很簡單,就是『知道發生了什麼』。但隨著系統變得越來越複雜,『知道』這件事也變得越來越困難。」

她指著窗外的城市:「你看這座城市,有交通監控、電力監控、水務監控、通訊監控。每個系統都有自己的監控,但更重要的是,這些監控系統之間要能協調合作,才能讓整座城市正常運作。」

「我們的 EKS 監控系統也是一樣,」小張繼續說,「Container Insights 監控基礎設施,X-Ray 追蹤請求流程,Prometheus 收集自定義指標,Grafana 提供視覺化介面。每個工具都有自己的專長,但結合起來就能提供完整的可觀測性。」

故事的意義

這個故事告訴我們,監控系統的演進不是突然發生的,而是隨著業務需求的變化而自然演進的。從小李的單店到全球連鎖,從簡單的人工管理到複雜的 EKS 監控系統,每一步都有其必然性。

重要的不是技術本身,而是技術背後的思維方式:

  • 從被動應對到主動預防
  • 從經驗判斷到數據驅動
  • 從人工操作到自動化運維
  • 從單點監控到全面可觀測性

AWS EKS 提供了一個完整的平台,讓我們能夠實現這些理念。但工具只是工具,真正重要的是我們如何使用這些工具來解決實際問題,如何建立一個持續改進的文化。


上一篇
DAY22 - Ingress Controller:幫服務掛上招牌
下一篇
DAY24 - 小李的 EKS 監控實戰:CloudWatch 可觀測性套件安裝指南
系列文
AWS 雲原生,學起來比泡咖啡還快25
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言