跟我一起學Knative(5)--透過藍/綠部署路由和管理流量

iyacontrol發表於2020-05-17

本文演示了使用藍/綠部署模式將應用程式更新到新版本。使用Knative,您可以透過更改路由配置將流量從應用程式的實時版本安全地重新路由到新版本。

部署 Revision 1 (Blue)

我們將部署一個示例應用程式的映象,該映象在藍色背景上顯示文字“ App v1”。

首先,建立一個名為blue-green-demo-config.yaml的新檔案,將其複製到其中:

apiVersion: serving.knative.dev/v1
kind: Configuration
metadata:
  name: blue-green-demo
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-samples/knative-route-demo:blue # The URL to the sample app docker image
          env:
            - name: T_VERSION
              value: "blue"

儲存檔案,然後將配置部署到您的叢集:

kubectl apply --filename blue-green-demo-config.yaml

configuration.serving.knative.dev/blue-green-demo created

這將部署示例應用程式的初始版本。在將流量路由到此應用程式之前,我們需要知道剛剛建立的初始修訂的名稱。使用kubectl,可以透過以下命令獲取它:

kubectl get configurations blue-green-demo -o=jsonpath='{.status.latestCreatedRevisionName}'

上面的命令將返回修訂的名稱,類似於blue-green-demo-5shtc。在本文件的其餘部分中,我們將使用此修訂版名稱,但您的名稱將有所不同。

要將入站流量路由到它,我們需要定義一條路由。建立一個名為blue-green-demo-route.yaml的新檔案,並將以下YAML清單複製到其中(不要忘記編輯修訂名稱):

apiVersion: serving.knative.dev/v1
kind: Route
metadata:
  name: blue-green-demo # The name of our route; appears in the URL to access the app
  namespace: default # The namespace we're working in; also appears in the URL to access the app
spec:
  traffic:
    - revisionName: blue-green-demo-5shtc
      percent: 100 # All traffic goes to this revision

儲存檔案,然後將路由應用於您的叢集:

kubectl apply --filename blue-green-demo-route.yaml

route.serving.knative.dev/blue-green-demo created

現在,您可以透過以下所示的URL檢視示例應用程式:

kubectl get route blue-green-demo

NAME              URL                                                     READY   REASON
blue-green-demo   http://blue-green-demo.default.serverless.xx.me   True

瀏覽器訪問該URL,返回如下內容:

部署 Revision 2 (Green)

示例應用程式的修訂版2將在綠色背景上顯示文字“ App v2”。要建立新修訂,我們將在blue-green-demo-config.yaml中使用更新的映象和環境變數編輯現有配置:

apiVersion: serving.knative.dev/v1
kind: Configuration
metadata:
  name: blue-green-demo # Configuration name is unchanged, since we're updating an existing Configuration
  namespace: default
spec:
  template:
    spec:
      containers:
        - image: gcr.io/knative-samples/knative-route-demo:green # URL to the new version of the sample app docker image
          env:
            - name: T_VERSION
              value: "green" # Updated value for the T_VERSION environment variable

儲存檔案,然後將更新的配置應用於您的叢集:

kubectl apply --filename blue-green-demo-config.yaml

configuration.serving.knative.dev/blue-green-demo configured

使用以下命令查詢第二個修訂的名稱:

kubectl get configurations blue-green-demo -o=jsonpath='{.status.latestCreatedRevisionName}'

在本文件的其餘部分中,我們將假定第二個版本稱為blue-green-demo-tn6cc,但是您的版本會有所不同。確保在隨後的清單中使用第二個修訂版的正確名稱。

此時,第一個修訂版(blue-green-demo-5shtc)和第二個修訂版(blue-green-demo-tn6cc)將同時部署並執行。我們可以更新現有路由以為第二個修訂版建立一個新的(測試)端點,同時仍將所有其他流量傳送到第一個修訂版。編輯blue-green-demo-route.yaml:

apiVersion: serving.knative.dev/v1
kind: Route
metadata:
  name: blue-green-demo # Route name is unchanged, since we're updating an existing Route
  namespace: default
spec:
  traffic:
    - revisionName: blue-green-demo-5shtc
      percent: 100 # All traffic still going to the first revision
    - revisionName: blue-green-demo-tn6cc
      percent: 0 # 0% of traffic routed to the second revision
      tag: v2 # A named route

儲存檔案,然後將更新的路由應用於您的叢集:

kubectl apply --filename blue-green-demo-route.yaml

route.serving.knative.dev/blue-green-demo configured

該應用程式的修訂版2現已執行。這意味著:

kubectl get route blue-green-demo --output jsonpath="{.status.traffic[*].url}"

有如下輸出:

http://v2-blue-green-demo.default.serverless.xx.me/

訪問該URL,可以看到如下:

這樣,您可以在將任何流量切換到新版本之前,驗證該應用程式的新版本是否符合預期。

遷移流量到新的revision

我們將再次更新現有路線,以開始將流量從第一個修訂版轉移到第二個修訂版。編輯blue-green-demo-route.yaml:

apiVersion: serving.knative.dev/v1
kind: Route
metadata:
  name: blue-green-demo # Updating our existing route
  namespace: default
spec:
  traffic:
    - revisionName: blue-green-demo-5shtc
      percent: 50 # Updating the percentage from 100 to 50
    - revisionName: blue-green-demo-tn6cc
      percent: 50 # Updating the percentage from 0 to 50
      tag: v2

儲存檔案,然後將更新的路由應用於您的叢集:

kubectl apply --filename blue-green-demo-route.yaml

route.serving.knative.dev/blue-green-demo configured

幾次重新整理原始路由(http://blue-green-demo.default.serverless.xx.me),以檢視一些流量現在流向該應用程式的版本2。

注意:此示例顯示了50/50的分配比例,以確保您不必重新整理太多,但建議在生產環境中以1-2%的流量開始

路由全部的流量到新的version

最後,我們將更新現有路由,以最終將所有流量轉移到第二個修訂版。編輯blue-green-demo-route.yaml:

apiVersion: serving.knative.dev/v1
kind: Route
metadata:
  name: blue-green-demo # Updating our existing route
  namespace: default
spec:
  traffic:
    - revisionName: blue-green-demo-5shtc
      percent: 0
      tag: v1 # Adding a new named route for v1
    - revisionName: blue-green-demo-tn6cc
      percent: 100
      # Named route for v2 has been removed, since we don't need it anymore
注意:當您不再回滾修​​訂時,可以刪除第一個修訂blue-green-demo-lcfrd而不是流量的0%。然後,不可路由的修訂物件將被垃圾回收。

儲存檔案,然後將更新的路由應用於您的叢集:

kubectl apply --filename blue-green-demo-route.yaml

route.serving.knative.dev/blue-green-demo configured

幾次重新整理原始路由(http://blue-green-demo.default.serverless.xx.me),以驗證沒有流量路由到該應用的v1。

我們向該應用的v1新增了一個命名路由,因此您現在可以在狀態部分的點選量欄中列出的URL上訪問它。要獲取URL,請輸入以下命令:

kubectl get route blue-green-demo --output jsonpath="{.status.traffic[*].url}"

由於所有入站流量都定向到該應用程式的第二個修訂版,因此Knative很快會將第一個修訂版縮小到0個正在執行的Pod,並且可以將藍色/綠色部署視為已完成。使用命名的v1路由將重新啟用廣告連播,以滿足專門針對初始修訂的任何偶然請求。

相關文章