Contour 學習筆記(二):使用級聯功能實現藍綠部署和金絲雀釋出
上篇文章介紹了 Contour 分散式架構的工作原理,順便簡單介紹了下 IngressRoute 的使用方式。本文將探討 IngressRoute 更高階的用法,其中級聯功能是重點。
1. IngressRoute 大入門
上篇文章在 examples/example-workload
目錄下建立了一個示例應用,我們來回顧一下它的 IngressRoute
配置:
apiVersion: contour.heptio.com/v1beta1 kind: IngressRoute metadata: labels: app: kuard name: kuard namespace: default spec: virtualhost: fqdn: kuard.local routes: - match: / services: - name: kuard port: 80
- virtualhost : 該欄位是 root IngressRoute,表示此域的頂級入口點。
- fqdn : 該欄位指定了完整的域名,可以通過在 HTTP 請求頭中指定
Host:
欄位來訪問該服務。
這是最簡單是使用方法,看起來沒什麼特別的,我們來稍作修改一下:
apiVersion: contour.heptio.com/v1beta1 kind: IngressRoute metadata: labels: app: kuard name: kuard namespace: default spec: virtualhost: fqdn: kuard.local routes: - match: /test services: - name: kuard port: 80
將 match: /
改為 match: /test
,然後重新應用新規則。這時如果你訪問 url kuard.local/test
是不通的,因為 kuard 服務本身並沒有 /test
這個路徑,我們可以強制將路徑重寫為 /
:
apiVersion: contour.heptio.com/v1beta1 kind: IngressRoute metadata: labels: app: kuard name: kuard namespace: default spec: virtualhost: fqdn: kuard.local routes: - match: /test prefixRewrite: "/" services: - name: kuard port: 80
重新 apply 之後,再次訪問 url kuard.local/test
就通了。
這裡可以和標準的 ingress
物件對比一下,IngressRoute
的優勢在於它可以分別對每個路由設定 rewrite 規則,而 Nginx Ingress Controller 只能設定全域性的 rewrite 規則,因為它用的是 annotations
。雖然可以通過其他手段來實現,但相對來說會比較麻煩。
2. 級聯功能介紹
下面我們來看看 IngressRoute
的級聯功能,這是個非常有特色的功能,你可以通過級聯多個路由規則,上層 IngressRoute 的配置被下層繼承。例如,我們可以將 url 路徑 /
的路由規則級聯到其他的 IngressRoute
中,其他的 IngressRoute
可以來自不同的 namespace。
舉個例子,我們可以先建立一個這樣的 IngressRoute:
$ cat > delegate-from-main.yaml <<EOF
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
name: delegate-from-main
spec:
routes:
- match: /
services:
- name: kuard
port: 80
EOF
$ kubectl apply -f delegate-from-main.yaml
$ kubectl get ingressroute delegate-from-main -o jsonpath='{.status.currentStatus}'
orphaned
該 IngressRoute 的狀態為 orphaned
,因為它沒有包含一個合法的 fqdn。接下來需要建立一個 root IngressRoute 來和它進行級聯:
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
labels:
app: kuard
name: kuard
namespace: default
spec:
virtualhost:
fqdn: kuard.local
routes:
- match: /
delegate:
name: delegate-from-main
namespace: default
這時如果再檢查 IngressRoute delegate-from-main 的狀態,就會發現它從 orphaned
狀態變成了 valid
狀態,kuard.local
也能夠順利訪問。
瞭解了級聯功能的用法之後,下面就來看看它的應用場景。
- 場景一:可以使用級聯功能來做藍綠部署和灰度釋出,只需要在上層 IngressRoute 中稍作修改,切換到另一個下層 IngressRoute,就可以切換流量的處理規則。
- 場景二:管理員可以利用級聯功能將部分 ingress 的許可權放行到其他的
namespace
中,在這些 namespace 中,使用者可以自由更新與 root IngressRoute 級聯的相關的 IngressRoute。例如,如果管理員想防止其他使用者配置非法的域名或路徑,可以將該部分的配置許可權放到 root IngressRoute 中,其他namespace
中的下層 IngressRoute 中只能配置各自的路徑相關資訊。
接下來主要探討場景一。
3. 藍綠部署
藍綠部署簡單來講就是在生產環境中有兩套系統:一套是正在提供服務的系統,標記為“綠色”;另一套是準備釋出的系統,標記為“藍色”。兩套系統都是功能完善的,並且正在執行的系統,只是系統版本和對外服務情況不同。
最初,沒有任何系統,沒有藍綠之分。
然後,第一套系統開發完成,直接上線,這個過程只有一個系統,也沒有藍綠之分。
後來,開發了新版本,要用新版本替換線上的舊版本,在線上的系統之外,搭建了一個使用新版本程式碼的全新系統。 這時候,一共有兩套系統在執行,正在對外提供服務的老系統是綠色系統,新部署的系統是藍色系統。
藍色系統不對外提供服務,用來做啥?
用來做釋出前測試,測試過程中發現任何問題,可以直接在藍色系統上修改,不干擾使用者正在使用的系統。(注意,兩套系統沒有耦合的時候才能百分百保證不干擾)
藍色系統經過反覆的測試、修改、驗證,確定達到上線標準之後,直接將使用者切換到藍色系統:
切換後的一段時間內,依舊是藍綠兩套系統並存,但是使用者訪問的已經是藍色系統。這段時間內觀察藍色系統(新系統)工作狀態,如果出現問題,直接切換回綠色系統。
當確信對外提供服務的藍色系統工作正常,不對外提供服務的綠色系統已經不再需要的時候,藍色系統正式成為對外提供服務系統,成為新的綠色系統。 原先的綠色系統可以銷燬,將資源釋放出來,用於部署下一個藍色系統。
通過 IngressRoute 的級聯功能可以很方便地實現藍綠部署策略,首先建立一個上層的 root IngressRoute(假設名為 root-blog
),然後將域名 yangcs.net/blogs
的路由策略級聯到下層的 IngressRoute(名為 blog
)。我們會同時部署”藍色“版本和”綠色“版本的應用,此時只有”綠色“版本接收流量。
---
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
name: root-blog
namespace: root-ingressroute
spec:
virtualhost:
fqdn: yangcs.net
tls:
secretName: yangcs-net
routes:
- match: /blog
delegate:
name: blog
namespace: marketing
---
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
name: blog
namespace: marketing
spec:
routes:
- match: /blog
services:
- name: green
port: 80
---
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
name: blog2
namespace: marketing
spec:
routes:
- match: /blog
services:
- name: blue
port: 80
在對藍色版本進行測試驗證之後,就可以將使用者切換到藍色應用了:
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
name: root-blog
namespace: root-ingressroute
spec:
virtualhost:
fqdn: yangcs.net
tls:
secretName: yangcs-net
routes:
- match: /blog
delegate:
name: blog2
namespace: marketing
4. 金絲雀釋出
金絲雀釋出(Canary)也是一種釋出策略,和國內常說的灰度釋出
是同一類策略。它和藍綠有點像,但是它更加規避風險。你可以階段性的進行,而不用一次性從藍色版本切換到綠色版本。
採用金絲雀部署,你可以在生產環境的基礎設施中小範圍的部署新的應用程式碼。一旦應用簽署釋出,只有少數使用者被路由到它,可以最大限度的降低影響。
如果沒有錯誤發生,把剩餘的 V1 版本全部升級為 V2 版本。如果有錯誤發生,則直接回退到老版本,釋出失敗。下圖示範了金絲雀部署:
其實金絲雀釋出的名稱來源於一個典故。在 17 世紀,英國礦井工人發現,金絲雀對瓦斯這種氣體特別敏感,空氣中哪怕有極其微量的瓦斯,金絲雀也會停止唱歌。當瓦斯含量超過一定限度時,人類毫無察覺,但金絲雀卻會毒發身亡。當時在採礦裝置相對簡陋的條件下,工人們每次下井都會帶上一隻金絲雀作為”瓦斯檢測指標“,以便在危險情況下緊急撤離。對映到這裡就是先發布一小部分來試探整體是否能夠正常執行,如果能正常執行則進行完全部署的釋出方式,目前仍然是不少成長型技術組織的主流釋出方式。
IngressRoute 可以通過分配權重來實現金絲雀釋出,和藍綠部署一樣,首先建立一個上層的 root IngressRoute(名為 root-blog
),然後將域名 yangcs.net/blogs
的路由策略級聯到下層的 IngressRoute(名為 blog
)。在下層的 IngressRoute 中將流量按不同權重轉發到不同的後端服務。
apiVersion: contour.heptio.com/v1beta1
kind: IngressRoute
metadata:
name: blog
namespace: marketing
spec:
routes:
- match: /blog
services:
- name: green
port: 5
- name: blue
port: 95
如果沒有錯誤發生,就將 green 的權重調整為 100
,blue 的權重調整為 0
。至此就完成了金絲雀釋出。
本文主要介紹了 IngressRoute
級聯功能的用法,探討了如何使用級聯功能來實現藍綠部署和金絲雀釋出,後面的文章將會陸續探討其他的流量治理功能。
5. 參考資料
- 藍綠部署、金絲雀釋出(灰度釋出)、A/B測試的準確定義
微信公眾號
掃一掃下面的二維碼關注微信公眾號,在公眾號中回覆◉加群◉即可加入我們的雲原生交流群,和孫巨集亮、張館長、陽明等大佬一起探討雲原生技術
相關推薦
Contour 學習筆記(二):使用級聯功能實現藍綠部署和金絲雀釋出
上篇文章介紹了 Contour 分散式架構的工作原理,順便簡單介紹了下 IngressRoute 的使用方式。本文將探討 IngressRoute 更高階的用法,其中級聯功能是重點。 1. IngressRoute 大入門 上篇文章在 examples/example-workload 目錄下建立了一個示例應
Deep Learning 學習筆記(二):神經網路Python實現
多層神經網路的Python實現。 程式碼先貼上,程式設計的東西不解釋。 程式碼中出現的SupervisedLearningModel、NNLayer和SoftmaxRegression,請參考上一篇筆記:Deep Learning 學習筆記(一)——softmax
C#語言學習筆記(二):變量、數據類型和運算符
tex ear 布爾值 全部 exchange result 轉換成 lis int 變量、數據類型 給變量賦值,如果想指定float,在數字後面加上F/f;如果想指定decimal,在數字後面加上m。 0-9:48-57 A-Z:65-90 a-
ES6學習筆記(二):教你玩轉類的繼承和類的物件
繼承 程式中的繼承: 子類可以繼承父類的一些屬性和方法 class Father { //父類 constructor () { } money () { console.log(100) } } class Son extends Father { //子類繼承父類 } l
javascript學習筆記(二):定義函數、調用函數、參數、返回值、局部和全局變量
兩個 cnblogs bsp 結果 value ava ase com 調用 定義函數、調用函數、參數、返回值 關鍵字function定義函數,格式如下: function 函數名(){ 函數體 } 調用函數、參數、返回值的規則和c語言規則類似。 1 <!DOC
CSS學習筆記(二):特性
code 背景色 左移 line tex lin 安裝 其中 cas 一、顏色特性 1. 前景色:color 用種方式指定前景色,3種方式分別是rgb顏色,#16進制編碼,顏色名稱: color: rgb(100,100,100); color: #ee3e80; col
Unity3D之Mecanim動畫系統學習筆記(二):模型導入
leg character ... sdk ocs 物體 mat 版本 sset 我們要在Unity3D中使用上模型和動畫,需要經過下面幾個階段的制作,下面以一個人形的模型開發為準來介紹。 模型制作 模型建模(Modelling) 我們的美術在建模時一般會制作一個稱為
kubernetes學習筆記(二):bashborad安裝配置
tag log struct recommend ide col create part describe 官方推薦方法: 連接:https://kubernetes.io/docs/tasks/access-application-cluster/web-ui-dashb
python3學習筆記(二):Python初識
區別 說明 from 學習筆記 情況 不能 col 需要 學習 一、算法 在開始認真地編程之前,首先來解釋下什麽是計算機程序設計。簡單地說,它就是告訴計算機要做什麽。計算機可以做很多事情,但是它不會自己思考,需要我們告訴它具體細節,並且使用計算機能夠理解的語言把算法告
Linux學習筆記(二):實戰-根據微服務端口號關閉進程
java 地方 img linux學習 區分 殺死進程 項目組 cannot home 前言 現在項目組基本都用Springboot,每個服務占用一個端口號,有時需要選擇性的關閉,但在任務管理器上他們的名稱都是java.exe,無法區分,這才學以致用。 killPort.s
Guava學習筆記(二):基礎(Joiner,Objects,Splitter及Strings)
nonnull obj expect null dto 字符 情況 core cte 添加Maven依賴 JoinerTest import com.google.common.base.Joiner; import org.junit.Assert; import org
opencv 視覺項目學習筆記(二): 基於 svm 和 knn 車牌識別
its ++ eas -a rect() repr poi obj std 車牌識別的屬於常見的 模式識別 ,其基本流程為下面三個步驟: 1) 分割: 檢測並檢測圖像中感興趣區域; 2)特征提取: 對字符圖像集中的每個部分進行提取; 3)分類: 判斷圖像快是不是車牌或者 每
安卓開發學習筆記(二):Android Stuidio無法引用Intent來創建對象,出現cannot resolve xxx
編譯器 port stact 消失 click first 紅色 xxx font 筆者在進行安卓開發時,發現自己的代碼語法完全沒有問題。尤其是創建intent對象的時候,語法完全是正確的,但是Android Stuidio卻顯示報錯,Intent類顯示為紅色,如圖所示:
Django學習筆記(二):使用Template讓HTML、CSS參與網頁建立
Django學習筆記(二):使用Template讓HTML、CSS參與網頁建立 通過本文章實現: 瞭解Django中Template的使用 讓HTML、CSS等參與網頁建立 利用靜態檔案應用網頁樣式 一、Template的使用 Template是Django利用渲染器將模板檔案與資料內容結合
Javaweb學習筆記(二):servlet初體驗、HTTP協議
目錄 1.Servlet體驗 1.1servlet的繼承體系 1.2手動開發動態web資源 1.3工具開發動態資源 2.HTTP協議 2.1概念 2.2請求資訊 2.2.1請求行 2.2.2請求頭 2.2.3空行與實體內容 2.3HttpServlet
學習筆記(二):使用K近鄰演算法檢測Web異常操作
使用全量比較,而不是最頻繁和最不頻繁的比較。 1.資料蒐集 我們使用詞集的模型,將全部命令去重後形成一個大型向量空間,每個命令代表一個特徵,首先通過遍歷全部命令,生成對應詞集。 with open(filename) as f: fo
Spring MVC 學習筆記(二):@RequestMapping用法詳解
一、@RequestMapping 簡介 在Spring MVC 中使用 @RequestMapping 來對映請求,也就是通過它來指定控制器可以處理哪些URL請求,相當於Servlet中在web.xml中配置 <servlet>
d3.js學習筆記(二):完整的柱狀圖示例
本示例採用d3的3.x版本庫,示例程式碼如下: d3.fullAxisExample = function() { var width = 240; var height = 240; //在 body 裡新增一個 SVG 畫布
微信小程式——學習筆記(二):邏輯層(1)
邏輯層將資料進行處理後傳送給檢視層,同時接受檢視層的事件反饋。 用App()函式註冊一個小程式。 當小程式初始化完成時,會觸發 onLaunch(全域性只觸發一次) 當小程式啟動,或從後臺進入前臺顯示,會觸發 onShow 當小程式從前臺進入後臺,會觸發 onHide 當小程式發生指令碼錯
Scala學習筆記(二):類和物件
object object 是隻有一個例項的類。它的定義與Java中的class類似,如: // 單例物件 object AppEntry { def main(args: Array[String]): Unit = { print("Hello World!") } }