1. 程式人生 > >Contour 學習筆記(二):使用級聯功能實現藍綠部署和金絲雀釋出

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!") } }