生產環境中基于Istio的Kubernetes多集群灰度發布架構實戰經驗分享

cover

生產環境中基于Istio的Kubernetes多集群灰度發布架構實戰經驗分享

在大規模分布式微服務架構中,如何在多集群環境下平滑、安全地發布新版本,一直是保證高可用、高可靠的關鍵需求。本文以真實生產環境案例為基礎,分享我們團隊基于Istio Service Mesh實現Kubernetes多集群灰度發布的端到端解決方案。


一、業務場景描述

  1. 我們擁有兩個地域獨立的Kubernetes集群(Cluster-A / Cluster-B),負責處理用戶請求。
  2. 需對某項核心服務(user-service)進行全鏈路新版本發布,且必須支持:
    • 無感知灰度:按一定比例(10% →30% →100%)切換流量;
    • 多集群一致:在各集群間同時按比例跑灰度,不可只有單集群生效;
    • 回滾安全:灰度過程中一旦出現異常,可即時回滾到老版本;
    • 監控與告警:灰度期間需監控流量、錯誤率,并及時觸發告警。

原有方案依賴Ingress+DNS權重,但配置復雜且不支持多集群統一管控,于是團隊選擇Istio作為Service Mesh層集中管理流量策略。

二、技術選型過程

為了滿足上述需求,評估了以下幾種方案:

  • 純Ingress權重:通過DNS或Ingress Controller做流量分發;管理分散、不支持跨集群統一策略。
  • Nginx+Lua:在L4層做灰度路由;靈活度不及Service Mesh,且需要大量自定義代碼。
  • Istio Service Mesh:提供內置流量管理(VirtualService/DestinationRule)、mTLS安全、可觀察性,且支持多集群Mesh拓撲。

最終選用Istio,主要理由:

  • 流量細粒度:支持基于百分比、Header、Cookie等多維度灰度策略。
  • 多集群Mesh:Istio Multi-Primary模式可在每個集群部署Control Plane,實現統一配置與流量管控。
  • 安全與可觀察:內置mTLS、Envoy Metrics與Tracing。

三、實現方案詳解

3.1 架構設計

采用Istio Multi-Primary多集群架構:

  • 每個K8s集群部署獨立Control Plane,使用同一Kubernetes API Server的ClusterRole與ClusterRoleBinding;
  • 利用Istio East-West Gateway打通集群間數據面通信;
  • Control Plane通過服務注冊與XDS推送實現統一配置下發。

架構圖示例:

Cluster-A           Cluster-B
+----------+        +----------+
| Istio CP |        | Istio CP |
| Pilot    | ‐‐‐‐‐‐‐ | Pilot    |
| Mixer    |        | Mixer    |
+----------+        +----------+|                    |
Envoy sidecar          Envoy sidecar|                    |East-West Gateway <==== East-West Gateway|                    |External Clients -----> Gateway

3.2 環境準備與Istio部署

  1. 下載Istio:
curl -L https://istio.io/downloadIstio | sh -
cd istio-1.15.0   # 假設版本
export PATH=$PWD/bin:$PATH
  1. 在每個集群創建命名空間與必備權限:
kubectl create namespace istio-system
kubectl apply -f manifests/istio-crd.yaml
kubectl apply -f manifests/istio-roles.yaml  # 包含ClusterRole
  1. 安裝Istio Control Plane(示例為Cluster-A):
istioctl install --set profile=default \--set values.global.multiCluster.clusterName=cluster-a \--set values.global.meshID=prod-mesh \-y

同理在Cluster-B中執行,修改clusterName為cluster-b。

  1. 部署East-West Gateway
# eastwest-gateway.yaml
apiVersion: v1
kind: Service
metadata:name: istio-eastwestgatewaynamespace: istio-system
spec:selector:istio: eastwestgatewayports:- port: 15443name: tlstype: LoadBalancer
---
apiVersion: apps/v1
kind: Deployment
metadata:name: istio-eastwestgatewaynamespace: istio-system
spec:replicas: 2selector:matchLabels:istio: eastwestgatewaytemplate:metadata:labels:istio: eastwestgatewayspec:containers:- name: istio-proxyimage: docker.io/istio/proxyv2:1.15.0ports:- containerPort: 15443args:- proxy- router- --domain- "$(POD_NAMESPACE).svc.cluster.local"

3.3 灰度策略實現

以user-service為例:發布v2版本,初始10%灰度。

  1. 部署v2版本Deployment:
apiVersion: apps/v1
kind: Deployment
metadata:name: user-service-v2namespace: user
spec:replicas: 5selector:matchLabels:app: user-serviceversion: v2template:metadata:labels:app: user-serviceversion: v2spec:containers:- name: user-serviceimage: myrepo/user-service:v2ports:- containerPort: 8080
  1. 定義DestinationRule:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:name: user-servicenamespace: user
spec:host: user-service.user.svc.cluster.localsubsets:- name: v1labels:version: v1- name: v2labels:version: v2trafficPolicy:tls:mode: ISTIO_MUTUAL
  1. 定義VirtualService,實現10%灰度:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:name: user-servicenamespace: user
spec:hosts:- user-service.user.svc.cluster.localhttp:- route:- destination:host: user-service.user.svc.cluster.localsubset: v2weight: 10  # v2 接收10%- destination:host: user-service.user.svc.cluster.localsubset: v1weight: 90timeout: 10s
  1. 驗證與監控:
  • 使用 istioctl proxy-config routes 查看灰度規則。
  • 在Prometheus/Grafana中監控 istio_requests_totalistio_request_duration_seconds
  1. 動態調整灰度比例:直接修改VirtualService中weight值,并 kubectl apply 即可生效,無需重啟服務。

四、踩過的坑與解決方案

  1. 多集群ServiceEntry配置遺漏

    • 問題:未統一在兩個集群中創建對方服務的ServiceEntry,導致東-西通信失敗。
    • 解決:在Cluster-A中配置Cluster-B ServiceEntry,反之亦然。
  2. mTLS握手錯誤

    • 問題:Envoy報錯 x509: certificate signed by unknown authority
    • 解決:確保兩個集群Control Plane互信同一CA或在PeerAuthentication中正確指定workloadSelector。
  3. DNS解析超時

    • 問題:跨集群DNS解析延遲。
    • 解決:在VirtualService中指定 useRequestConnectionPoolDir: false 并使用 ServiceEntry 指定IP列表。
  4. 灰度回滾失效

    • 問題:回滾后舊規則依然生效,流量無法恢復到100% v1。
    • 解決:同一資源(VirtualService)僅保留一份配置,回滾時直接將 v1 權重調至100,避免遺留多條規則。

五、總結與最佳實踐

  • 保持Control Plane版本一致:多集群間Istio版本必須同步,避免XDS協議兼容性問題。
  • 統一配置管理:使用GitOps(Argo CD/Flux)管理VirtualService等資源,實現配置審計與回滾。
  • 監控與告警:結合Grafana Dashboards與Alertmanager,對流量分布、錯誤率、延遲進行實時告警。
  • 服務標簽規范:統一使用 versionenv 等Label,便于流量策略的動態調整。
  • 安全優先:通過PeerAuthentication精細化控制mTLS策略,確保集群間通信安全。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/91988.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/91988.shtml
英文地址,請注明出處:http://en.pswp.cn/web/91988.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Kubernetes(k8s)之認識Pod

01了解Pod Pod是Kubernetes創建或部署的最小/最簡單的基本單位,一個Pod代表集群上正在運行的一個進程。 一個Pod封裝一個應用容器(也可以有多個容器),存儲資源、一個獨立的網絡IP以及管理控制容器運行方式的策略選項。它可能由單個容器或多個容器共享組成的資源。 Kubern…

Nginx服務做負載均衡網關

1. 概述 內部Nginx服務器做服務網關&#xff0c;代理后端應用服務&#xff0c;卸載ssl域名證書&#xff0c;將接收的https請求&#xff0c;轉發至后端http服務。華為防火墻負責NAT&#xff0c;啟用服務器負載均衡功能&#xff0c;將公網虛擬IP端口映射到內部多臺Nginx服務器上…

十三、請求響應-請求:日期參數和JSON參數

日期參數代碼&#xff1a;日期參數 //日期時間參數RequestMapping("/dataParam")public String dataParam(DateTimeFormat(pattern "yyyy-MM-dd HH:mm:ss") LocalDateTime updateTime){System.out.println(updateTime);return "OK";}結果JSON參…

可信數據庫大會現場,TDengine 時序數據庫展示核電場景下的高性能與 AI 創新

設備在升級&#xff0c;場站在擴建&#xff0c;但數據系統卻還在“跟不上”。這正是許多核電企業在推進數字化轉型過程中最真實的感受。高頻采集、長周期存儲、精度要求高……這些構成了對數據庫系統的“煉獄級考驗”。在這樣一個背景下&#xff0c;國產數據庫的能力邊界正在被…

ctflearn-POST practice

靶場地址&#xff1a;165.227.106.113/post.php 解題&#xff1a; 一.分析題目 提示&#xff1a; 知道要用POST請求提交表單&#xff0c;看一下源碼信息 得到可能需要用post請求方式去提交表單&#xff0c;并且傳數據admin和password&#xff0c;這邊提供兩種方式 方法一&…

FPGA實現OV7670攝像頭圖像處理至VGA顯示器

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;本項目基于FPGA技術&#xff0c;結合OV7670攝像頭傳感器進行視頻捕獲&#xff0c;經SDRAM存儲&#xff0c;并通過VGA顯示器展示。同時&#xff0c;集成了中值濾波算法提高圖像清晰度。該項目涉及數字圖像處理系…

使用python寫一套完整的智能體小程序

創建一個簡單的智能體&#xff08;Agent&#xff09;程序在人工智能和自動化任務中&#xff0c;智能體&#xff08;Agent&#xff09;是指能夠感知環境并通過決策和行動來實現目標的實體。Python 提供了豐富的庫和框架&#xff0c;可以用于構建智能體程序&#xff0c;例如使用 …

電商項目_性能優化_海量數據讀寫、存儲、檢索

海量數據讀寫方式選擇高并發讀寫場景分析無論任何業務系統&#xff0c;無非就是兩個操作&#xff1a;寫和讀。 在海量數據和高并發的場景下&#xff0c;寫和讀就會成為系統性能的瓶頸。下面分析不同業務場景下面臨的問題&#xff1a;側重“高并發讀”的系統場景1&#xff1a;搜…

RabbitMQ面試精講 Day 9:優先級隊列與惰性隊列

【RabbitMQ面試精講 Day 9】優先級隊列與惰性隊列 文章標簽 RabbitMQ,優先級隊列,惰性隊列,消息隊列,面試技巧,系統架構 文章簡述 本文是"RabbitMQ面試精講"系列第9天&#xff0c;深入解析優先級隊列與惰性隊列的實現原理與實戰應用。文章詳細講解優先級隊列的排…

[硬件電路-121]:模擬電路 - 信號處理電路 - 模擬電路中常見的難題

模擬電路設計是電子工程中極具挑戰性的領域&#xff0c;其核心難題源于信號的連續性、元件的非理想特性以及環境干擾的復雜性。以下是模擬電路中常見的難題及其技術本質與解決方案&#xff1a;1. 噪聲與干擾&#xff1a;信號的“隱形殺手”技術本質&#xff1a;模擬信號對微小電…

Java 大視界 -- Java 大數據在智能交通智能停車誘導與車位共享優化中的應用(381)

Java 大視界 -- Java 大數據在智能交通智能停車誘導與車位共享優化中的應用&#xff08;381&#xff09;引言&#xff1a;正文&#xff1a;一、智能停車的 “老大難”&#xff1a;不只是 “車位少” 那么簡單1.1 車主與車位的 “錯位困境”1.1.1 信息滯后的 “睜眼瞎”1.1.2 車…

基于落霞歸雁思維框架的自動化測試實踐與探索

基于落霞歸雁思維框架的自動化測試實踐與探索 在當今快速發展的軟件開發領域&#xff0c;自動化測試已成為提高軟件質量和開發效率的關鍵環節。本文將結合落霞歸雁的思維框架——“觀察現象 → 找規律 → 應用規律 → 實踐驗證”&#xff0c;探討如何將其應用于自動化測試領域&…

Unity Shader編程進階:掌握高階渲染技術 C# 實戰案例

Unity Shader編程完全入門指南&#xff1a;從零到實戰 C# 本文將深入探討Unity Shader編程的高級技術&#xff0c;包括自定義光照模型、后處理效果、GPU實例化、表面著色器深度應用等&#xff0c;幫助開發者提升渲染效果與性能優化能力。 提示&#xff1a;內容純個人編寫&#…

(論文速讀)Text-IF:基于語義文本引導的退化感知交互式圖像融合方法

論文信息論文題目&#xff1a;Text-IF: Leveraging Semantic Text Guidance for Degradation-Aware and Interactive Image Fusion&#xff08;Text-IF:利用語義文本指導退化感知和交互式圖像融合&#xff09;會議&#xff1a;CVPR2024摘要&#xff1a;圖像融合的目的是將不同源…

python創建一個excel文件

以下是使用Python根據指定名稱創建Excel文件的兩種實現方法&#xff0c;根據需求選擇適合的方案&#xff1a;方法一&#xff1a;使用pandas庫&#xff08;適合結構化數據&#xff09; # 安裝依賴&#xff08;命令行執行&#xff09; # pip install pandas openpyxlimport panda…

C++高頻知識點(十四)

文章目錄66. 程序什么時候應該使用多線程&#xff0c;什么時候單線程效率高&#xff1f;67. 死鎖的原因和避免死鎖的避免預防死鎖&#xff1a;破壞持有并等待條件68. TCP擁塞控制四個階段輪換過程描述69. C的內存管理70. 構造函數可以是虛函數嗎&#xff0c;析構函數呢66. 程序…

淺窺Claude-Prompting for Agents的Talk

Prompting for Agents先說一句&#xff1a;顏值這么高&#xff0c;你倆要出道啊。此圖基本就是claude倡導的agent prompt結構了&#xff0c;可以看到經過一年時間的演變&#xff0c;基本都是follow這個結構去寫prompt。我比較喜歡用Role→react→task→histroy→few shot→rule…

【MySQL04】:基礎查詢

MySQL的基本查詢表的增刪查改 insert(插入) insert [info] table_name [(colume, [,colume] ...)] values (value_list) ...對于value_list我們通過,作為分隔符 插入替換我們使用on duplicate key update, 表示如果存在主鍵沖突, 會進行更新, 這個字段后面還有寫更新的字段repl…

NGINX反向代理golang后端服務

nginx配置參考&#xff08;/etc/nginx/sites-available路徑下創建配置文件&#xff09; server {listen 80; # 監聽80端口server_name ip; # 你的域名或IPlocation / {root /var/www/test_page/;index index.html; # 默認文件try_files $uri $uri/ /index.html; # 單頁…

【秋招筆試】2025.08.03蝦皮秋招筆試-第二題

?? 點擊直達筆試專欄 ??《大廠筆試突圍》 ?? 春秋招筆試突圍在線OJ ?? 筆試突圍在線刷題 bishipass.com 02. 城市規劃的連通網絡 問題描述 A先生是一名城市規劃師,他負責設計一個智能城市的通信網絡。城市被劃分為一個 n m n \times m n