Spinnaker簡介
Spinnaker是一款企業(yè)級持續(xù)交付工具镶骗,最初由Netflix構(gòu)建,是優(yōu)秀的項目套件Netflix OSS的一部分愉择,用于部署Netflix應(yīng)用匪凡。它是一個開源的多云持續(xù)交付平臺膊畴,能夠幫助開發(fā)人員快速、自信地發(fā)布軟件更改病游。
Spinnaker將云原生部署策略視為一類構(gòu)造唇跨,處理底層編排,比如驗證健康檢查衬衬、禁用舊服務(wù)器群組和啟用新服務(wù)器群組买猖。Spinnaker支持紅/黑(又名“藍(lán)/綠”)策略,以及在實時開發(fā)中實行紅/黑和金絲雀策略滋尉。
安裝Spinnaker
開啟Api
我們的旅途開始于Google Cloud Platfrom玉控,所以你要有一個GCP賬號,體驗賬號有300刀和1年使用期限(google還是很大方呀)兼砖,同時需要在GCP上需要開啟下面三個Api:
Pub/Sub API
Cloud build API
Kubernetes API
啟用了上述Api之后奸远,單擊云控制臺右上角的鏈接打開Cloud Shell既棺。
部署Spinnaker
gsutil cp gs://gke-spinnaker-codelab/install.tgz .
tar -xvzf install.tgz
./setup.sh
鏈接到Spinnaker
執(zhí)行connect腳本
./connect.sh
腳本內(nèi)容
#!/usr/bin/env bash
PORT=8080
DECK_POD=$(kubectl get po -n spinnaker -l "cluster=spin-deck" \
-o jsonpath="{.items[0].metadata.name}")
EXISTING_PID=$(sudo netstat -nlp | grep $PORT | awk '{print $7}' | cut -f1 -d '/')
if [ -n "$EXISTING_PID" ]; then
echo "PID $EXISTING_PID already listening... restarting port-forward"
kill $EXISTING_PID
sleep 5
fi
kubectl port-forward $DECK_POD $PORT:9000 -n spinnaker >> /dev/null &
echo "Port opened on $PORT"
Spinnaker的界面
Application
這里的application讽挟,應(yīng)當(dāng)是一個完整的業(yè)務(wù)應(yīng)用的概念,它包含若干個服務(wù)丸冕。
Clusters
Spinnaker中的Clusters選項卡聚合關(guān)于在集群中運行Kubernetes工作負(fù)載的信息耽梅。在導(dǎo)航到演示應(yīng)用程序之后,應(yīng)該已經(jīng)選擇了Clusters選項卡胖烛。
注意眼姐,我們有兩個正在運行的服務(wù):前端和后端诅迷。它們已經(jīng)部署到兩個環(huán)境中:生產(chǎn)環(huán)境和登臺環(huán)境。試著點擊其中一個綠色pod众旗,如下所示
可以查看到具體的pod信息
Pipelines
雖然Clusters選項卡提供了要執(zhí)行的特殊操作罢杉,以及關(guān)于正在運行的應(yīng)用程序狀態(tài)的信息,但是pipeline選項卡允許您配置可重復(fù)的自動化流程來更新正在運行的代碼贡歧。
已經(jīng)配置了三個流水線按順序運行:
- 部署到Staging環(huán)境:這會將您的Kubernetes資源和構(gòu)建的Docker映像部署到Staging環(huán)境滩租,并在準(zhǔn)備好接收流量時對正在運行的后端服務(wù)運行集成測試
- 在生產(chǎn)中部署Canary版本:這將從暫存中獲取Kubernetes資源和Docker映像,并將它們部署為在生產(chǎn)環(huán)境中接收一小部分流量利朵。
- 將Canary版本推到Production環(huán)境:這使您有機(jī)會在生產(chǎn)中驗證您的金絲雀律想,如果您愿意,可以促使它接收所有生產(chǎn)流量绍弟。 完成后技即,將刪除Canary。
要在我們自動觸發(fā)它們之前了解這些流水線的作用樟遣,請選擇Configure下拉列表而叼,然后選擇Deploy to Staging流水線:
您應(yīng)該看到流水線概述,以及幾個可配置的階段:
示例程序
應(yīng)用程序結(jié)構(gòu)
示例的應(yīng)用程序有一個前端和一個后端豹悬。他們是這樣交流的:
每次用戶發(fā)出請求時澈歉,前端都會提供一些靜態(tài)內(nèi)容以及有關(guān)為請求提供服務(wù)的后端的一些信息。 前端和后端都由部署管理屿衅,具有多個副本(Pod)埃难,并且由負(fù)載均衡器(服務(wù))提供。 我們將使用它來演示如何使用Spinnaker中的共享流水線獨立更新這兩個服務(wù)涤久。
查看前端服務(wù)
訪問創(chuàng)建的前端服務(wù)的服務(wù)地址涡尘,可以看到對應(yīng)的前端服務(wù)。
通過金絲雀版本發(fā)布前端變化
在?/ services / frontend /文件夾中响迂,對content / index.html進(jìn)行編輯考抄。 我們建議將style =“background-color:blue”更改為白色以使更新易于查看。
<!DOCTYPE html>
<html>
<body style="background-color:white">
<h2>Hello, world!</h2>
<p>Message from the backend:</p>
<p>{{.Message}}</p>
<p>{{.Feature}}</p>
</body>
</html>
這將在Google Container Builder中運行幾分鐘蔗彤,并將更新的鏡像推送到項目的容器倉庫中川梅。此事件將啟動Deploy to Staging流水線。
cd ~/services/frontend/
./build.sh
觀察“Deploy to Staging”流水線
理論上然遏,當(dāng)新鏡像推送后贫途,spinnaker的Deploy to Staging流水線應(yīng)當(dāng)被觸發(fā),但是:
第一次試待侵,啟動失敗了丢早,懷疑可能和之前創(chuàng)建Spinnaker有關(guān),所以重建了集群。
第二次試怨酝,依然沒有觸發(fā)傀缩,提示“There was an error loading executions. We'll try again shortly.”發(fā)現(xiàn)是之前通過云終端連接的connet.sh停掉了,所以是前端無法訪問了而已农猬,去服務(wù)頁面為Spinnaker的deck服務(wù)創(chuàng)建了負(fù)載均衡器赡艰。
第三次試,終于成功了
點擊詳情斤葱,可以查看當(dāng)前流水線的詳細(xì)情況瞄摊,什么時間開始的,運行時間苦掘,以及當(dāng)前狀態(tài)换帜。在DeployStatus頁面,可以查看每個資源(service鹤啡、deployment惯驼、configmap)的yaml。
在Deployment資源下面递瑰,點擊Details祟牲,會跳轉(zhuǎn)到Cluster頁面,可以查看deployment的詳細(xì)信息抖部。
當(dāng)最后一個流水線階段變?yōu)槌壬珪r说贝,單擊“Person”圖標(biāo),然后單擊“Continue”以批準(zhǔn)并完成流水線慎颗。如果需要乡恕,可以按照舞臺上顯示的自定義說明操作。
表示新版本(背景已替換為白色)正在staging環(huán)境進(jìn)行人工驗證俯萎。
在staging環(huán)境傲宜,運行check腳本驗證發(fā)布
#!/usr/bin/env bash
curl http://localhost:8001/api/v1/proxy/namespaces/staging/services/frontend:80/
注意,在Clusters選項卡上夫啊,staging中的frontend服務(wù)已經(jīng)更新函卒,現(xiàn)在指向您在上面的構(gòu)建中創(chuàng)建的映像摘要。
觀察“Deploy Simple Canary to Production”流水線
這條流水線的定義和之前的定義不同
一旦批準(zhǔn)并完成了部署到Staging環(huán)境的過程撇眯,系統(tǒng)將自動通過Deploy Simple canary to Production將金絲雀部署到生產(chǎn)環(huán)境中报嵌。
當(dāng)點擊暫停按鈕時,則提示:
最后可以在Clusters選項卡上熊榛,快速檢查它是否部署锚国,如下所示。
在這一點上来候,讓我們看看金絲雀是否有效跷叉。 使用~/services/frontend/get-ingress.sh腳本獲取前端生產(chǎn)服務(wù)的IP地址逸雹,并在新選項卡中打開它营搅。 如果經(jīng)常刷新頁面云挟,顏色應(yīng)在白色和藍(lán)色之間交替。
Baseline | Canary |
---|---|
注意:外部服務(wù)的負(fù)載平衡策略并不完全是循環(huán)的转质,因此可能經(jīng)常由同一個前端服務(wù)园欣。不斷地刷新頁面有助于在前端節(jié)點之間進(jìn)行切換。
這條流水線結(jié)束時的人工處理節(jié)點休蟹,“Manually Validate Canary Results”沸枯,如果一切順利,手工確認(rèn)通過赂弓,就像在之前的流水線中一樣绑榴,會被發(fā)布到生產(chǎn)環(huán)境中。
觀察“Promote Canary to Production”流水線
上個流水線完成后盈魁,金絲雀將被部署到生產(chǎn)環(huán)境翔怎,Staging中的代碼現(xiàn)在正在生產(chǎn)環(huán)境中運行,而金絲雀已經(jīng)沒有了杨耙,我們可以在Clusters選項卡上看到這一點赤套。
當(dāng)部署成功后,再去刷新前端頁面珊膜,不管怎么刷新容握,都會顯示新版本(白色背景)。
通過流水線發(fā)布配置變更
編輯配置
與我們簽入代碼更改以構(gòu)建前端服務(wù)的Docker映像類似车柠,現(xiàn)在我們將更新前端服務(wù)加載的ConfigMap剔氏,以啟用應(yīng)用程序的登錄頁面中的特性
# ... other manifests
---
apiVersion: v1
kind: ConfigMap
metadata:
name: frontend-config
namespace: '${ namespace }'
data:
BACKEND_ENDPOINT: 'http://backend.${ namespace }'
FEATURE: "A new feature!"
---
# other manifests ...
保存文件,并在~/services/manifest/目錄中運行./update-frontend.sh腳本竹祷。更新后的清單將自動通過Pub/Sub將消息推送到Spinnaker介蛉。
update-frontend.sh腳本內(nèi)容
#!/usr/bin/env bash
gsutil cp frontend.yml gs://*********/manifests/frontend.yml
當(dāng)發(fā)生錯誤時,可以點擊回滾按鈕進(jìn)行回滾操作
自動回滾
此時您已經(jīng)注意到從源到生產(chǎn)的代碼更改大約需要10分鐘溶褪。 如果我們正在進(jìn)行更嚴(yán)肅的集成測試币旧,或者我們的服務(wù)需要更長時間才能啟動,或者需要運行更長時間的金絲雀猿妈,這可能需要更長的時間吹菱。 在最糟糕的情況下,我們希望逃生艙盡快回滾彭则。
讓我們創(chuàng)建一個編譯回滾策略的流水線鳍刷,并允許您通過單擊按鈕回滾生產(chǎn)。
創(chuàng)建新的流水線
創(chuàng)建一個用于回滾的流水線
創(chuàng)建“Undo Rollout (Manifest)”階段(stage)
點擊“添加階段”
選擇“Undo Rollout (Manifest)”作為類型
在“Undo rollout (Manifest) Configuration”下填寫如下字段:
Field | Value |
---|---|
Stage Name | Rollback the Frontend |
Account | my-kubernetes-account |
Namespace | production |
Kind | deployment |
Name | frontend-primary |
在“執(zhí)行選項”下俯抖,選擇“停止此分支输瓜,當(dāng)其他分支完成時流水線失敗”。
執(zhí)行選項:這些選項允許您配置各個分支如何影響整個流水線執(zhí)行。 通過確保此分支不會立即使整個流水線失敗尤揣,我們可以確保我們的回滾不會過早中斷搔啊。
點擊右下角的保存按鈕
復(fù)制現(xiàn)有階段
現(xiàn)在我們已經(jīng)為前端配置了回滾策略,讓我們使用快捷方式為后端也配置回滾策略北戏。選擇“復(fù)制現(xiàn)有階段”
搜索剛剛創(chuàng)建的“Rollback the Frontend”负芋,并選擇剛剛配置的階段
將名稱編輯為“Rollback the Backend”,并使用“Depends On”對“Rollback the Frontend”的依賴關(guān)系
完成后嗜愈,執(zhí)行圖應(yīng)該如下所示
手動試一下這個回滾流水線
會發(fā)現(xiàn)當(dāng)流水線執(zhí)行完畢后旧蛾,生產(chǎn)環(huán)境的前端代碼被恢復(fù)為舊版本(藍(lán)色背景)。
結(jié)語
Spinnaker本身還有很多待發(fā)現(xiàn)的特性可以挖掘蠕嫁,本文只是搞了一個小玩意兒供大家把玩锨天。對于生產(chǎn)服務(wù)來說,它同樣能夠帶來巨大價值并幫助簡化部署流程剃毒,這種黑科技绍绘,推薦大家有空自己動手玩一下。