本文首發於:Jenkins 中文社區html
這是漸進式交付系列的第三篇文章,前兩篇請參見:git
漸進式交付被 Netflix, Facebook 以及其它公司使用用來減輕部署的風險。 可是如今你能夠在使用Jenkins X時採用它。github
漸進式交付是持續交付的下一步,它將新版本部署到用戶的一個子集,並在將其滾動到所有用戶以前對其正確性和性能進行評估,若是不匹配某些關鍵指標,則進行回滾。app
尤爲是,咱們聚焦金絲雀發佈,並讓它在你的 Jenkins X 應用中變得易於採用。 金絲雀發佈包括嚮應用程序的新版本發送一小部分流量,並在向其餘用戶發佈以前驗證這裏沒有錯誤。 Facebook 就是這樣作的,首先向內部員工提供新版本,而後是一小部分用戶,而後是其餘全部用戶,可是你要採用它並不須要成爲 Facebook !less
你能夠在 Martin Fowler 的網站閱讀更多與金絲雀發佈相關信息。性能
jx promote myapp --version 1.0 --env production
命令 promote 它到"生產"環境。 可是,在檢查新版本是否失敗的同時,它也能夠自動並逐步地向必定比例的用戶推出。 若是發生失敗,應用程序將自動回滾。 整個過程當中徹底沒有人爲干預。注意:這個新功能是很是新的,在未來這些步驟將再也不須要,由於它們也將由 Jenkins X 自動化了。學習
做爲第一步,三個 Jenkins X 插件須要被安裝:網站
插件可使用以下命令安裝(使用一個最近版本的 jx CLI ):spa
這將在 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.yaml
和 values.yaml
這兩個文件,由於它們默認啓用金絲雀部署。
就這樣!如今當使用 jx promote myapp --version 1.0 --env production
將你的應用 promote 到生產環境,它將執行一次金絲雀部署。 請注意,第一次被 promote 時,它不會執行金絲雀部署,由於它須要與之前的版本數據進行比較,但從第二次 promotion 開始,它將起做用。
根據上面 values.yaml
文件中的配置,它看起來像:
若是咱們配置的指標(請求持續時間超過 500 毫秒或超過 1% 的響應返回 500 錯誤)失敗,Flagger 將注意到失敗,而且若是重複 5 次,它將回滾此次發佈,將 100% 的流量發送到舊版本。
得到金絲雀事件輸出,執行以下命令:
爲了可視化的目的,Flagger 包含一個 Grafana 面板,儘管它在金絲雀發佈中不須要。 能夠在本地經過 Kubernetes 端口轉發訪問它。
而後使用 admin/admin
訪問 http://localhost:3000/,選擇 canary-analysis
面板以及
jx-production
jx-production-myapp-primary
jx-production-myapp
它將爲咱們提供當前版本和新版本的對比視圖,視圖中包含不一樣指標(CPU,內存,請求持續時間,響應錯誤……)。
請注意 Istio 默認地將阻止從你的 Pod 訪問外部集羣(一種預計將在 Istio 1.1 中發生變化的行爲)。 學習如何控制 Istio ingress 流量。
若是由於指標失敗出現自動回滾,生產環境的 Jenkins X GitOps 倉庫會過期,仍然使用新版本而不是舊版本。 這是計劃在即將發佈的版本中修復的內容。
譯者:王冬輝