1. 程式人生 > >使用 Jenkins X 漸進式交付:自動化金絲雀部署

使用 Jenkins X 漸進式交付:自動化金絲雀部署

本文首發於:Jenkins 中文社群

這是漸進式交付系列的第三篇文章,前兩篇請參見:

漸進式交付被 Netflix, Facebook 以及其它公司使用用來減輕部署的風險。 但是現在你可以在使用Jenkins X時採用它。


漸進式交付是持續交付的下一步,它將新版本部署到使用者的一個子集,並在將其滾動到全部使用者之前對其正確性和效能進行評估,如果不匹配某些關鍵指標,則進行回滾。


尤其是,我們聚焦金絲雀釋出,並讓它在你的 Jenkins X 應用中變得易於採用。 金絲雀釋出包括嚮應用程式的新版本傳送一小部分流量,並在向其他使用者釋出之前驗證這裡沒有錯誤。 Facebook 就是這樣做的,首先向內部員工提供新版本,然後是一小部分使用者,然後是其他所有使用者,但是你要採用它並不需要成為 Facebook !

facebook_canary_chart_1.jpeg

你可以在 Martin Fowler 的網站閱讀更多與金絲雀釋出相關資訊

Jenkins X

如果在 Jenkins X 中你已經有一個應用,那麼你知道的你可以 通過 jx promote myapp --version 1.0 --env production 命令 promote 它到"生產"環境。 但是,在檢查新版本是否失敗的同時,它也可以自動並逐步地向一定比例的使用者推出。 如果發生失敗,應用程式將自動回滾。 整個過程中完全沒有人為干預。

注意:這個新功能是非常新的,在將來這些步驟將不再需要,因為它們也將由 Jenkins X 自動化了。


作為第一步,三個 Jenkins X 外掛需要被安裝:

  • Istio : 一種服務網格容許我們管理我們服務的流量。
  • Prometheus :Kubernetes 中最流行的監控系統。
  • Flagger :一個使用 Istio 的專案,該專案使用 Prometheus 的指標自動化進行金絲雀釋出和回滾。

外掛可以使用如下命令安裝(使用一個最近版本的 jx CLI ):

  1. jx create addon istio
  2. jx create addon prometheus
  3. jx create addon flagger

這將在 jx-production 名稱空間啟動 Istio 來進行指標收集。

現在獲取 Istio ingress 的 IP ,並將一個萬用字元域名(如: *.example.com )指向它,以便我們可以使用它根據主機名路由多個服務。 Istio ingress 提供了金絲雀釋出需要的路由能力(流量轉移),傳統的 Kubernetes ingress 物件不支援該功能。

叢集被配置後,是時候配置我們的應用了。 在 charts/myapp/templates 目錄下向你的 helm chart 新增一個 canary.yaml

然後往 charts/myapp/values.yaml 追加如下內容,將 myapp.example.com 修改為你的主機名或域名:

不久,當你從 Jenkins X 快速開始建立你的應用,將不再需要修改 canary.yamlvalues.yaml 這兩個檔案,因為它們預設啟用金絲雀部署。

就這樣!現在當使用 jx promote myapp --version 1.0 --env production 將你的應用 promote 到生產環境,它將執行一次金絲雀部署。 請注意,第一次被 promote 時,它不會執行金絲雀部署,因為它需要與以前的版本資料進行比較,但從第二次 promotion 開始,它將起作用。

根據上面 values.yaml 檔案中的配置,它看起來像:

  • 第 1 分鐘:將 10% 的流量傳送到新版本
  • 第 2 分鐘:將 20% 的流量傳送到新版本
  • 第 3 分鐘:將 30% 的流量傳送到新版本
  • 第 4 分鐘:將 40% 的流量傳送到新版本
  • 第 5 分鐘:將 100% 的流量傳送到新版本

如果我們配置的指標(請求持續時間超過 500 毫秒或超過 1% 的響應返回 500 錯誤)失敗,Flagger 將注意到失敗,並且如果重複 5 次,它將回滾這次釋出,將 100% 的流量傳送到舊版本。

獲得金絲雀事件輸出,執行如下命令:

  1. $ kubectl -n jx-production get events --watch\
  2. --field-selector involvedObject.kind=Canary
  3. 23m ... New revision detected! Scaling up jx-production-myapp.jx-production
  4. 22m ... Starting canary analysis forjx-production-myapp.jx-production
  5. 22m ... Advance jx-production-myapp.jx-production canary weight 10
  6. 21m ... Advance jx-production-myapp.jx-production canary weight 20
  7. 20m ... Advance jx-production-myapp.jx-production canary weight 30
  8. 19m ... Advance jx-production-myapp.jx-production canary weight 40
  9. 18m ... Advance jx-production-myapp.jx-production canary weight 50
  10. 18m ... Copying jx-production-myapp.jx-production template spec to jx-production-myapp-primary.jx-production
  11. 17m ... Promotion completed! Scaling down jx-production-myapp.jx-production

儀表盤

為了視覺化的目的,Flagger 包含一個 Grafana 面板,儘管它在金絲雀釋出中不需要。 可以在本地通過 Kubernetes 埠轉發訪問它。

然後使用 admin/admin 訪問 http://localhost:3000/,選擇 canary-analysis 面板以及

  • namespace 選擇 jx-production
  • primary 選擇 jx-production-myapp-primary
  • canary 選擇 jx-production-myapp

它將為我們提供當前版本和新版本的對比檢視,檢視中包含不同指標(CPU,記憶體,請求持續時間,響應錯誤……)。

附加說明

請注意 Istio 預設地將阻止從你的 Pod 訪問外部叢集(一種預計將在 Istio 1.1 中發生變化的行為)。 學習如何控制 Istio ingress 流量

如果因為指標失敗出現自動回滾,生產環境的 Jenkins X GitOps 倉庫會過時,仍然使用新版本而不是舊版本。 這是計劃在即將釋出的版本中修復的內容。