使用 Jenkins X 漸進式交付:自動化金絲雀部署
本文首發於:Jenkins 中文社群
這是漸進式交付系列的第三篇文章,前兩篇請參見:
漸進式交付被 Netflix, Facebook 以及其它公司使用用來減輕部署的風險。 但是現在你可以在使用Jenkins X時採用它。
漸進式交付是持續交付的下一步,它將新版本部署到使用者的一個子集,並在將其滾動到全部使用者之前對其正確性和效能進行評估,如果不匹配某些關鍵指標,則進行回滾。
尤其是,我們聚焦金絲雀釋出,並讓它在你的 Jenkins X 應用中變得易於採用。 金絲雀釋出包括嚮應用程式的新版本傳送一小部分流量,並在向其他使用者釋出之前驗證這裡沒有錯誤。 Facebook 就是這樣做的,首先向內部員工提供新版本,然後是一小部分使用者,然後是其他所有使用者,但是你要採用它並不需要成為 Facebook !
你可以在 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 ):
- jx create addon istio
- jx create addon prometheus
- 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.yaml
和 values.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% 的流量傳送到舊版本。
獲得金絲雀事件輸出,執行如下命令:
- $ kubectl -n jx-production get events --watch\
- --field-selector involvedObject.kind=Canary
- 23m ... New revision detected! Scaling up jx-production-myapp.jx-production
- 22m ... Starting canary analysis forjx-production-myapp.jx-production
- 22m ... Advance jx-production-myapp.jx-production canary weight 10
- 21m ... Advance jx-production-myapp.jx-production canary weight 20
- 20m ... Advance jx-production-myapp.jx-production canary weight 30
- 19m ... Advance jx-production-myapp.jx-production canary weight 40
- 18m ... Advance jx-production-myapp.jx-production canary weight 50
- 18m ... Copying jx-production-myapp.jx-production template spec to jx-production-myapp-primary.jx-production
- 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 倉庫會過時,仍然使用新版本而不是舊版本。 這是計劃在即將釋出的版本中修復的內容。