k8s通過service標簽實現藍綠發布

k8s通過service標簽實現藍綠發布

    • 通過`k8s service label`標簽實現`藍綠發布`
    • 方法1:使用kubelet完成藍綠切換
      • 1. 創建綠色版本
        • 1.1 創建綠色版本 Deployment
        • 1.2 創建綠色版本 Service
      • 2. 創建藍色版本
        • 2.1 創建藍色版本 Deployment
        • 2.2 創建藍色版本 Service
      • 3. 創建`藍綠切換SVC` (用于外部訪問)
      • 4. 創建 Ingress
      • 5. 切換藍綠版本
        • 5.1 將 `app-svc` 指向綠色版本:
        • 5.2 將 `app-svc` 切換到藍色版本:
      • 總結
    • 方法2:k8s 藍綠yaml 配置
      • `service.yaml` 文件
      • `deploy.yaml` 文件
        • 藍`v1-deploy.yaml` 文件
        • 綠`v2-deploy.yaml`文件
      • 部署與測試
        • 測試流量是否到v1版本
        • 切換入口流量從v1 到 v2
        • 測試流量是否到v2版本

通過k8s service label標簽實現藍綠發布

  • 兩個版本deploysvc,
  • svc版本標簽,
  • 然后選擇Service Label標簽對應的deploy版本

方法1:使用kubelet完成藍綠切換

在 Kubernetes 中,使用 kubectl 命令完成藍綠部署.


1. 創建綠色版本


1.1 創建綠色版本 Deployment
# 創建一個名為 "yewu-app-green-deploy" 的 Deployment
kubectl create deployment yewu-app-green-deploy \--image=yewu-app:v2  # 使用鏡像 "yewu-app:v2" 部署應用

1.2 創建綠色版本 Service
# 將名為 "yewu-app-green-deploy" 的 Deployment 暴露為一個 Service
## port是service的端口
## --target-port是pod(中的容器)的端口
## --type 指定Service 的類型為ClusterIP,用于通過節點的IP和指定端口訪問服務
## --name=green-svc 指定 Service 的名稱為 "green-svc"
## --save-config 保存當前命令的配置到資源的注解中,便于后續管理
kubectl expose deployment yewu-app-green-deploy --type=ClusterIP --name=green-svc --port=80 --target-port=8080 --save-config

2. 創建藍色版本


2.1 創建藍色版本 Deployment
# 創建一個名為 "yewu-app-blue-deploy" 的 Deployment
kubectl create deployment yewu-app-blue-deploy \--image=yewu-app:v1  # 使用鏡像 "yewu-app:v1" 部署應用

2.2 創建藍色版本 Service
# 將名為 "yewu-app-blue-deploy" 的 Deployment 暴露為一個 Service
## port是service的端口
## --target-port是pod(中的容器)的端口
## --type 指定Service 的類型為ClusterIP,用于通過節點的IP和指定端口訪問服務
## --name=blue-svc 指定 Service 的名稱為 "blue-svc"
## --save-config 保存當前命令的配置到資源的注解中,便于后續管理
kubectl expose deployment yewu-app-blue-deploy --type=ClusterIP --name=blue-svc --port=80 --target-port=8080 --save-config

3. 創建藍綠切換SVC (用于外部訪問)

創建一個外部 Service,用于切換藍綠版本:

# 創建一個 ClusterIP 類型的 Service,名稱為 "app-svc"
kubectl create service clusterip app-svc \--tcp=80:80  # 將 Service 的端口 80 映射到后端 Pod 的端口 80

4. 創建 Ingress

創建 Ingress 資源以暴露服務:

# 使用 kubectl 創建一個 Ingress 資源
kubectl create ingress app-ingress \--rule="your-domain.com/*=app-svc:80"# --rule 參數定義了 Ingress 的規則:# - your-domain.com 是主機名# - /* 表示匹配所有路徑# - app-svc:80 表示將流量轉發到名為 app-svc 的 Service 的 80 端口

5. 切換藍綠版本


5.1 將 app-svc 指向綠色版本:
# 更新名為 "app-svc" 的 Service 的 selector,使其指向綠色版本的 Deployment
kubectl patch svc app-svc \-p '{"spec":{"selector":{"app":"yewu-app-green-deploy"}}}'# -p 參數指定了一個 JSON 格式的部分更新內容# 將 Service 的 selector 更新為匹配標簽 "app=yewu-app-green-deploy"

5.2 將 app-svc 切換到藍色版本:
# 更新名為 "app-svc" 的 Service 的 selector,使其指向藍色版本的 Deployment
kubectl patch svc app-svc \-p '{"spec":{"selector":{"app":"yewu-app-blue-deploy"}}}'# -p 參數指定了一個 JSON 格式的部分更新內容# 將 Service 的 selector 更新為匹配標簽 "app=yewu-app-blue-deploy"

總結

先完成藍綠部署,然后通過修改 app-svcselector 來切換流量。


方法2:k8s 藍綠yaml 配置


service.yaml 文件

# 定義 API 版本為 v1
apiVersion: v1
# 定義資源類型為 Service
kind: Service
# 定義 Service 的元數據
metadata:# 定義 Service 的名稱為 demoname: demo# 定義 Service 所在的命名空間為 defaultnamespace: default# 定義 Service 的標簽,app 標簽值為 demolabels:app: demo
# 定義 Service 的規格
spec:# 定義 Service 的端口配置ports:# 定義一個端口配置- # 定義端口為 80port: 80# 定義目標端口為 httptargetPort: http# 定義協議為 TCPprotocol: TCP# 定義端口名稱為 httpname: http# 注意這里我們匹配 app 和 version 標簽,當要切換流量的時候,我們更新 version 標簽的值,比如:v2# 定義 Service 的選擇器selector:# 定義選擇器的 app 標簽值為 demoapp: demo# 定義選擇器的 version 標簽值為 v1version: v1

deploy.yaml 文件


v1-deploy.yaml 文件
# 定義 API 版本為 apps/v1
apiVersion: apps/v1
# 定義資源類型為 Deployment
kind: Deployment
# 定義 Deployment 的元數據
metadata:# 定義 Deployment 的名稱為 demo1-deploymentname: demo1-deployment# 定義 Deployment 所在的命名空間為 defaultnamespace: default# 定義 Deployment 的標簽,app 標簽值為 demolabels:# 定義 app 標簽值為 demoapp: demo# 定義 version 標簽值為 v1version: v1
# 定義 Deployment 的規格
spec:# 定義副本數量為 1replicas: 1# 定義修訂歷史限制為 3revisionHistoryLimit: 3# 定義更新策略strategy:# 定義滾動更新策略rollingUpdate:# 定義最大 surge 百分比為 30%maxSurge: 30%# 定義最大不可用百分比為 30%maxUnavailable: 30%# 定義選擇器selector:# 定義選擇器的標簽匹配規則matchLabels:# 定義 app 標簽值為 demoapp: demo# 定義 version 標簽值為 v1version: v1# 定義 Pod 模板template:# 定義 Pod 的元數據metadata:# 定義 Pod 的標簽labels:# 定義 app 標簽值為 demoapp: demo# 定義 version 標簽值為 v1version: v1# 定義 Pod 的規格spec:# 定義容器列表containers:# 定義一個容器- # 定義容器名稱為 demo1name: demo1# 定義容器使用的鏡像為 mritd/demoimage: mritd/demo# 定義存活探針livenessProbe:# 定義 HTTP GET 請求httpGet:# 定義請求路徑為 /path: /# 定義請求端口為 80port: 80# 定義請求協議為 HTTPscheme: HTTP# 定義初始延遲秒數為 30initialDelaySeconds: 30# 定義超時秒數為 5timeoutSeconds: 5# 定義周期秒數為 30periodSeconds: 30# 定義成功閾值為 1successThreshold: 1# 定義失敗閾值為 5failureThreshold: 5# 定義就緒探針readinessProbe:# 定義 HTTP GET 請求httpGet:# 定義請求路徑為 /path: /# 定義請求端口為 80port: 80# 定義請求協議為 HTTPscheme: HTTP# 定義初始延遲秒數為 30initialDelaySeconds: 30# 定義超時秒數為 5timeoutSeconds: 5# 定義周期秒數為 10periodSeconds: 10# 定義成功閾值為 1successThreshold: 1# 定義失敗閾值為 5failureThreshold: 5# 定義容器端口列表ports:# 定義一個端口- # 定義端口名稱為 httpname: http# 定義容器端口為 80containerPort: 80# 定義協議為 TCPprotocol: TCP

v2-deploy.yaml文件
# 定義 API 版本為 apps/v1
apiVersion: apps/v1
# 定義資源類型為 Deployment
kind: Deployment
# 定義 Deployment 的元數據
metadata:# 定義 Deployment 的名稱為 demo1-deploymentname: demo1-deployment# 定義 Deployment 所在的命名空間為 defaultnamespace: default# 定義 Deployment 的標簽,app 標簽值為 demolabels:# 定義 app 標簽值為 demoapp: demo# 定義 version 標簽值為 v1version: v1
# 定義 Deployment 的規格
spec:# 定義副本數量為 1replicas: 1# 定義修訂歷史限制為 3revisionHistoryLimit: 3# 定義更新策略strategy:# 定義滾動更新策略rollingUpdate:# 定義最大 surge 百分比為 30%maxSurge: 30%# 定義最大不可用百分比為 30%maxUnavailable: 30%# 定義選擇器selector:# 定義選擇器的標簽匹配規則matchLabels:# 定義 app 標簽值為 demoapp: demo# 定義 version 標簽值為 v1version: v1# 定義 Pod 模板template:# 定義 Pod 的元數據metadata:# 定義 Pod 的標簽labels:# 定義 app 標簽值為 demoapp: demo# 定義 version 標簽值為 v1version: v1# 定義 Pod 的規格spec:# 定義容器列表containers:# 定義一個容器- # 定義容器名稱為 demo1name: demo1# 定義容器使用的鏡像為 mritd/demoimage: mritd/demo# 定義存活探針livenessProbe:# 定義 HTTP GET 請求httpGet:# 定義請求路徑為 /path: /# 定義請求端口為 80port: 80# 定義請求協議為 HTTPscheme: HTTP# 定義初始延遲秒數為 30initialDelaySeconds: 30# 定義超時秒數為 5timeoutSeconds: 5# 定義周期秒數為 30periodSeconds: 30# 定義成功閾值為 1successThreshold: 1# 定義失敗閾值為 5failureThreshold: 5# 定義就緒探針readinessProbe:# 定義 HTTP GET 請求httpGet:# 定義請求路徑為 /path: /# 定義請求端口為 80port: 80# 定義請求協議為 HTTPscheme: HTTP# 定義初始延遲秒數為 30initialDelaySeconds: 30# 定義超時秒數為 5timeoutSeconds: 5# 定義周期秒數為 10periodSeconds: 10# 定義成功閾值為 1successThreshold: 1# 定義失敗閾值為 5failureThreshold: 5# 定義容器端口列表ports:# 定義一個端口- # 定義端口名稱為 httpname: http# 定義容器端口為 80containerPort: 80# 定義協議為 TCPprotocol: TCP
  • 上面定義的資源對象中,最重要的就是Service 中 label selector的定義:
  selector:app: demoversion: v1

部署與測試

  • 部署v1 v2 deploy服務 和 service服務
# 使用 kubectl 工具應用多個 YAML 配置文件
# -f service.yaml: 應用服務配置文件
# -f v1-deploy.yaml: 應用版本1的部署配置文件
# -f v2-deploy.yaml: 應用版本2的部署配置文件
kubectl apply -f service.yaml -f v1-deploy.yaml -f v2-deploy.yaml

測試流量是否到v1版本
# 登陸任意一個pod,向 demo service 發起請求
while sleep 0.3; do curl http://demo; done# 輸出日志
Host: demo1-deployment-b5bd596d8-dw27b, Version: v1
Host: demo1-deployment-b5bd596d8-dw27b, Version: v1

切換入口流量從v1 到 v2
# 使用 kubectl 工具更新服務的配置
# patch service demo: 對名為 demo 的服務進行補丁操作
# -p '{"spec":{"selector":{"version":"v2"}}}': 指定補丁內容,將服務的選擇器更新為 version=v2
kubectl patch service demo -p '{"spec":{"selector":{"version":"v2"}}}'

測試流量是否到v2版本
# 登陸任意一個pod,向 demo service 發起請求
while sleep 0.3; do curl http://demo; done# 輸出日志
Host: demo2-deployment-b5bd596d8-dw27b, Version: v2
Host: demo2-deployment-b5bd596d8-dw27b, Version: v2

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

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

相關文章

智慧酒店企業站官網-前端靜態網站模板【前端練習項目】

最近又寫了一個靜態網站,智慧酒店宣傳官網。 使用的技術 html css js 。 特別適合編程學習者進行網頁制作和前端開發的實踐。 項目包含七個核心模塊:首頁、整體解決方案、優勢、全國案例、行業觀點、合作加盟、關于我們。 通過該項目,小伙伴們…

Epplus 8+ 許可證設置

Epplus 8 之后非商業許可證的設置變了如果還用普通的方法會報錯 Unhandled exception. OfficeOpenXml.LicenseContextPropertyObsoleteException: Please use the static ‘ExcelPackage.License’ property to set the required license information from EPPlus 8 and later …

CST1016.基于Spring Boot+Vue高校競賽管理系統

計算機/JAVA畢業設計 【CST1016.基于Spring BootVue高校競賽管理系統】 【項目介紹】 高校競賽管理系統,基于 DeepSeek Spring AI Spring Boot Vue 實現,功能豐富、界面精美 【業務模塊】 系統共有兩類用戶,分別是學生用戶和管理員用戶&a…

2025年第十六屆藍橋杯省賽C++ 研究生組真題

2025年第十六屆藍橋杯省賽C 研究生組真題 1.說明2.題目A:數位倍數(5分)3.題目B:IPv6(5分)4.題目C:變換數組(10分)5.題目D:最大數字(10分&#xff…

空調開機啟動后發出噼里啪啦的異響分析與解決

背景 當空調使用時由于制冷或制熱運轉時(關機后可能也會出現),塑料件熱脹冷縮引起,可能會出現“咔咔”的聲音;空調冷媒在空調內管路流動時會出現輕微的“沙沙”的聲音;也有可能是新裝的空調擺風軸出現響聲…

BERT、T5、ViT 和 GPT-3 架構概述及代表性應用

BERT、T5、ViT 和 GPT-3 架構概述 1. BERT(Bidirectional Encoder Representations from Transformers) 架構特點 基于 Transformer 編碼器:BERT 使用多層雙向 Transformer 編碼器,能夠同時捕捉輸入序列中每個詞的左右上下文信息…

選導師原理

總述 一句話總結:是雷一定要避,好的一定要搶。方向契合最好,不契合適當取舍。 首先明確自身需求: 我要學東西!青年導師,好溝通,有沖勁,高壓力。 我要擺爛!中老年男性教…

【過程控制系統】PID算式實現,控制系統分類,工程應用中控制系統應該注意的問題

目錄 1-1 試簡述過程控制的發展概況及各個階段的主要特點。 1-2 與其它自動控制相比,過程控制有哪些優點?為什么說過程控制的控制過程多屬慢過程? 1-3 什么是過程控制系統,其基本分類是什么? 1-4 何為集散控制系統…

2025年第十六屆藍橋杯省賽真題解析 Java B組(簡單經驗分享)

之前一年拿了國二后&#xff0c;基本就沒刷過題了&#xff0c;實力掉了好多&#xff0c;這次參賽只是為了學校的加分水水而已&#xff0c;希望能拿個省三吧 >_< 目錄 1. 逃離高塔思路代碼 2. 消失的藍寶思路代碼 3. 電池分組思路代碼 4. 魔法科考試思路代碼 5. 爆破思路…

JAVA EE_文件操作和IO

人們大多數時候的焦慮&#xff0c;大概是太想要一個那不確定的答案了吧。 一一 陳長生. 1.認識文件 現實中&#xff0c;我們把一張一張有內容的紙整合在一起稱為文件&#xff0c;計算機中&#xff0c;通過硬盤這種I/O設備進行數據保存時&#xff0c;它會獨立成一個一個的單位保…

UNITY 屏幕UI自適應

1.主要就是根據屏幕的選擇根據尺寸 和UI的錨點和中心點來選擇&#xff0c;也可以通過代碼來動態修改 2.參考視頻&#xff1a;Unity UGUI屏幕自適應看這個就夠了_嗶哩嗶哩_bilibili

05-RabbitMQ 面試題-mk

文章目錄 1.RabbitMQ 核心組件及功能詳解2.RabbitMQ-如何保證消息不丟失?3.RabbitMQ消息的重復消費問題如何解決的?4.RabbitMQ中死信交換機 ? (RabbitMQ延遲隊列有了解過嘛)5.RabbitMQ如果有100萬消息堆積在MQ , 如何解決(消息堆積怎么解決)6.RabbitMQ的高可用機制有了解過嘛…

產品需求設計評審會:三步精準定位需求核心

“不謀全局者&#xff0c;不足謀一域&#xff1b;不謀萬世者&#xff0c;不足謀一時。”——陳澹然 強調了從全局和長遠的角度去謀劃事情的重要性&#xff0c;與產品設計中先從宏觀層面定位需求&#xff0c;而不是陷入細節的理念相契合。 今日清晨&#xff0c;我參加了一場產品…

java中常用的集合 - 面試篇

HashMap 一、基礎常量以及結構 //數組默認初始容量static final int DEFAULT_INITIAL_CAPACITY 1 << 4; // aka 16//數組容量最大值static final int MAXIMUM_CAPACITY 1 << 30;//默認擴容因子static final float DEFAULT_LOAD_FACTOR 0.75f;//鏈表長度閾值 樹…

PDF解析示例代碼學習

以下是結合多種技術實現的PDF解析詳細示例&#xff08;Python實現&#xff09;&#xff0c;涵蓋文本、表格和掃描件處理場景&#xff1a; 一、環境準備與依賴安裝 # 核心依賴庫 pip install pdfplumber tabula-py pytesseract opencv-python mysql-connector-python 二、完整…

Docker容器網絡與NAT

一、背景 之前分享關于NAT網絡地址轉換的相關文章&#xff0c;docker中的網絡正好使用到了NAT&#xff0c;順帶著把這個分享一下&#xff0c;分析docker容器的網絡數據包流出、數據流入原理分析。 知識回顧: docker運行一個容器之后&#xff0c;會給這個容器一個獨立的netns網絡…

Spring Boot 熱部署詳解,包含詳細的配置項說明

Spring Boot 熱部署詳解 1. 熱部署簡介 熱部署&#xff08;Hot Deployment&#xff09;允許在應用運行時修改代碼或配置文件&#xff0c;無需重啟應用即可使更改生效。Spring Boot 通過 spring-boot-devtools 模塊實現這一功能&#xff0c;其核心依賴于 LiveReload 技術和自動…

詳細解讀 box-sizing: border-box;

代碼解讀 * {box-sizing: border-box; } 解釋&#xff1a; * - 這是CSS的通用選擇器&#xff0c;表示匹配文檔中的所有元素 box-sizing: border-box; - 設置元素的盒模型計算方式為border-box 盒模型說明&#xff1a; 默認情況下&#xff0c;CSS使用content-box盒模型&…

《一文講透》第7期:KWDB 巧用標簽與索引優化查詢性能

引言 在工業物聯網快速發展的今天&#xff0c;各類智能傳感器設備已廣泛應用于智能制造、能源電力、智慧城市等關鍵領域。這些設備以極高的采樣頻率持續產生監測數據&#xff0c;使得單條產線每秒產生數十萬條傳感器數據已成為行業常態&#xff0c;這對數據存儲系統的寫入吞吐…

哈希擴展——一致性哈希

目錄 一、什么是一致性哈希 二、一致性哈希原理 2.1 hash 環 三、服務器擴容場景 3.1 服務器增加 3.2 服務器減少 3.3 使用虛擬節點 四、 一致性哈希的使用場景 一、什么是一致性哈希 一致性哈希是一種哈希算法&#xff0c;用于將數據分布到不同的節點或存儲區域&…