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

本文首發於:Jenkins 中文社區html

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

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


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


尤爲是,咱們聚焦金絲雀發佈,並讓它在你的 Jenkins X 應用中變得易於採用。 金絲雀發佈包括嚮應用程序的新版本發送一小部分流量,並在向其餘用戶發佈以前驗證這裏沒有錯誤。 Facebook 就是這樣作的,首先向內部員工提供新版本,而後是一小部分用戶,而後是其餘全部用戶,可是你要採用它並不須要成爲 Facebook !less

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 ):spa

  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 倉庫會過期,仍然使用新版本而不是舊版本。 這是計劃在即將發佈的版本中修復的內容。

譯者:王冬輝

相關文章
相關標籤/搜索