Deployment Strategies - Canary Strategy
Canary 部署(金絲雀部署)是一種漸進式部署策略,用於將新版本的應用程式逐步推出到生產環境中,並在此過程中觀察其行為和性能表現。 這種策略的靈感來自於金絲雀在礦井中的應用,即在全面實施之前先進行小範圍測試,以降低風險。
Nginx Ingress 金絲雀部署功能介紹
在 NGINX Ingress Controller 中,Canary Strategy 是一種基於第七層協議(HTTP/HTTPS)的流量分流功能,用於將部分用戶流量分配到新的應用版本上進行測試。
這種策略通過分析 HTTP 標頭、Cookie 或路由規則等應用層特徵,靈活控制流量的分配。開發者可以根據業務需求將一定比例的流量、特定用戶群組或特定請求導向 Canary 版本,而其他流量則繼續訪問穩定版本。
這樣的方式允許在不影響大多數用戶的情況下,驗證新版本的穩定性和性能,確保應用的高可用性與安全性。
註解說明
註解 | 功能描述 | 範例值 |
---|---|---|
nginx.ingress.kubernetes.io/canary | 啟用 Canary 模式,當設為 "true" 時,Ingress 資源會作為 Canary 配置運行。 | "true" |
nginx.ingress.kubernetes.io/canary-weight | 定義導向 Canary 版本的流量百分比,範圍為 0-100 ,用於基於比例的流量分配。 | "10" (10% 流量導向 Canary 版本) |
nginx.ingress.kubernetes.io/canary-by-header | 根據特定的 HTTP 標頭(Header)來進行 Canary 流量分配,需搭配以下標頭值或正則表達式使用。 | "x-canary" |
nginx.ingress.kubernetes.io/canary-by-header-value | 定義當標頭的值符合此值時,流量將被導向 Canary 版本,適合精確匹配。 | "1" 或 "true" |
nginx.ingress.kubernetes.io/canary-by-header-pattern | 使用正則表達式匹配 HTTP 標頭的值,當匹配成功時,將流量導向 Canary 版本,適合更靈活的條件判斷。 | ^(canary-user)$ |
nginx.ingress.kubernetes.io/canary-by-cookie | 根據指定的 Cookie 名稱進行 Canary 流量分配,當用戶的 Cookie 符合指定名稱時,流量將被導向 Canary 版本。 | "canary_cookie" |
以上設定的優先級別由高到低分別為:canary-by-header > canary-by-cookie > canary-weight
Canary Strategy 更新服務的步驟
Canary Strategy 更新服務的步驟通常包括以下幾個階段,這些步驟能幫助您平穩地將流量切換到新版本並進行測試:
1. 設定 Canary 版本
在 Kubernetes 中,您需要將應用程式部署為 Canary 版本。這通常會涉及以下配置:
- 創建新的 Deployment 或更新現有 Deployment:部署新版本的應用程式,這通常是以新版本的 Docker 映像檔來更新。
- 配置 Ingress 控制器:使用 NGINX Ingress 或其他支持 Canary 部署的控制器,通過設置
nginx.ingress.kubernetes.io/canary
註解來標記 Canary 版本。您還可以設置流量分配比例(canary-weight
)來控制將多少流量導向新版本。
2. 流量分配
您可以根據配置的流量分配策略(例如設置 nginx.ingress.kubernetes.io/canary-weight
)將流量分配給 Canary 版本。這樣您可以控制有多少比例的用戶會訪問 Canary 版本。
- 如果您設置了
canary-weight
為 10%,則 10% 的流量會被導向 Canary 版本,而 90% 的流量仍然會被導向穩定版本。
此外,您可以通過 HTTP Header、Cookie 或其他標識符來進行流量的有條件分配。例如,某些用戶可能基於其 Cookie 或 Header 被導向 Canary 版本,這有助於進行 A/B 測試。
3. 監控新版本
隨著流量逐步切換到 Canary 版本,您需要密切監控新版本的運行狀況。關鍵指標包括:
- 應用程式的性能:CPU 和內存的使用情況。
- 錯誤率:API 或應用程式的錯誤率。
- 回應時間:用戶的回應時間是否在可接受的範圍內。
這些指標能幫助您及早發現新版本的問題,從而決定是否繼續推進流量切換。
4. 調整流量比例
根據 Canary 版本的表現,您可以逐步增加其流量配額。如果 Canary 版本表現穩定且無錯誤,則可以逐步提高 canary-weight
的比例,直到最終將所有流量切換到新版本。
- 例如,從最初的 10% 開始,然後增加到 20%、50%、最終 100%。
5. 完全切換至新版本
當 Canary 版本完全穩定,並且經過充分測試後,您可以將所有流量切換到新版本。這時,您可以更新 Deployment 或 Ingress 配置,將所有流量導向新版本,並停用舊版本。
- 通常,您會進行一個 rollback 機制,確保在發生意外情況時,可以將流量快速回退到穩定版本。
6. 清理舊版本
在 Canary 部署成功後,您可以選擇刪除或更新舊版本的 Pod,以減少資源消耗並保持集群的乾淨與高效。