番外篇.基于GCP和Spinnaker玩轉(zhuǎn)金絲雀環(huán)境

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"
image

Spinnaker的界面

Application

image

這里的application讽挟,應(yīng)當(dāng)是一個完整的業(yè)務(wù)應(yīng)用的概念,它包含若干個服務(wù)丸冕。

Clusters

image

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众旗,如下所示

image

可以查看到具體的pod信息

image

Pipelines

雖然Clusters選項卡提供了要執(zhí)行的特殊操作罢杉,以及關(guān)于正在運行的應(yīng)用程序狀態(tài)的信息,但是pipeline選項卡允許您配置可重復(fù)的自動化流程來更新正在運行的代碼贡歧。

image

已經(jīng)配置了三個流水線按順序運行:

  1. 部署到Staging環(huán)境:這會將您的Kubernetes資源和構(gòu)建的Docker映像部署到Staging環(huán)境滩租,并在準(zhǔn)備好接收流量時對正在運行的后端服務(wù)運行集成測試
  2. 在生產(chǎn)中部署Canary版本:這將從暫存中獲取Kubernetes資源和Docker映像,并將它們部署為在生產(chǎn)環(huán)境中接收一小部分流量利朵。
  3. 將Canary版本推到Production環(huán)境:這使您有機(jī)會在生產(chǎn)中驗證您的金絲雀律想,如果您愿意,可以促使它接收所有生產(chǎn)流量绍弟。 完成后技即,將刪除Canary。

要在我們自動觸發(fā)它們之前了解這些流水線的作用樟遣,請選擇Configure下拉列表而叼,然后選擇Deploy to Staging流水線:

image

您應(yīng)該看到流水線概述,以及幾個可配置的階段:

image

示例程序

應(yīng)用程序結(jié)構(gòu)

示例的應(yīng)用程序有一個前端和一個后端豹悬。他們是這樣交流的:


image

每次用戶發(fā)出請求時澈歉,前端都會提供一些靜態(tài)內(nèi)容以及有關(guān)為請求提供服務(wù)的后端的一些信息。 前端和后端都由部署管理屿衅,具有多個副本(Pod)埃难,并且由負(fù)載均衡器(服務(wù))提供。 我們將使用它來演示如何使用Spinnaker中的共享流水線獨立更新這兩個服務(wù)涤久。

查看前端服務(wù)

訪問創(chuàng)建的前端服務(wù)的服務(wù)地址涡尘,可以看到對應(yīng)的前端服務(wù)。

image

通過金絲雀版本發(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),所以重建了集群。


image

第二次試怨酝,依然沒有觸發(fā)傀缩,提示“There was an error loading executions. We'll try again shortly.”發(fā)現(xiàn)是之前通過云終端連接的connet.sh停掉了,所以是前端無法訪問了而已农猬,去服務(wù)頁面為Spinnaker的deck服務(wù)創(chuàng)建了負(fù)載均衡器赡艰。

第三次試,終于成功了


image

點擊詳情斤葱,可以查看當(dāng)前流水線的詳細(xì)情況瞄摊,什么時間開始的,運行時間苦掘,以及當(dāng)前狀態(tài)换帜。在DeployStatus頁面,可以查看每個資源(service鹤啡、deployment惯驼、configmap)的yaml。


image

在Deployment資源下面递瑰,點擊Details祟牲,會跳轉(zhuǎn)到Cluster頁面,可以查看deployment的詳細(xì)信息抖部。


image

當(dāng)最后一個流水線階段變?yōu)槌壬珪r说贝,單擊“Person”圖標(biāo),然后單擊“Continue”以批準(zhǔn)并完成流水線慎颗。如果需要乡恕,可以按照舞臺上顯示的自定義說明操作。

image

表示新版本(背景已替換為白色)正在staging環(huán)境進(jìn)行人工驗證俯萎。


image

在staging環(huán)境傲宜,運行check腳本驗證發(fā)布

#!/usr/bin/env bash

curl http://localhost:8001/api/v1/proxy/namespaces/staging/services/frontend:80/
image

注意,在Clusters選項卡上夫啊,staging中的frontend服務(wù)已經(jīng)更新函卒,現(xiàn)在指向您在上面的構(gòu)建中創(chuàng)建的映像摘要。


image

觀察“Deploy Simple Canary to Production”流水線

image

這條流水線的定義和之前的定義不同

一旦批準(zhǔn)并完成了部署到Staging環(huán)境的過程撇眯,系統(tǒng)將自動通過Deploy Simple canary to Production將金絲雀部署到生產(chǎn)環(huán)境中报嵌。


image
image

當(dāng)點擊暫停按鈕時,則提示:


image

最后可以在Clusters選項卡上熊榛,快速檢查它是否部署锚国,如下所示。


image

在這一點上来候,讓我們看看金絲雀是否有效跷叉。 使用~/services/frontend/get-ingress.sh腳本獲取前端生產(chǎn)服務(wù)的IP地址逸雹,并在新選項卡中打開它营搅。 如果經(jīng)常刷新頁面云挟,顏色應(yīng)在白色和藍(lán)色之間交替。

Baseline Canary
image
image

注意:外部服務(wù)的負(fù)載平衡策略并不完全是循環(huán)的转质,因此可能經(jīng)常由同一個前端服務(wù)园欣。不斷地刷新頁面有助于在前端節(jié)點之間進(jìn)行切換。

這條流水線結(jié)束時的人工處理節(jié)點休蟹,“Manually Validate Canary Results”沸枯,如果一切順利,手工確認(rèn)通過赂弓,就像在之前的流水線中一樣绑榴,會被發(fā)布到生產(chǎn)環(huán)境中。

image
image

觀察“Promote Canary to Production”流水線

上個流水線完成后盈魁,金絲雀將被部署到生產(chǎn)環(huán)境翔怎,Staging中的代碼現(xiàn)在正在生產(chǎn)環(huán)境中運行,而金絲雀已經(jīng)沒有了杨耙,我們可以在Clusters選項卡上看到這一點赤套。

image

當(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
image

當(dāng)發(fā)生錯誤時,可以點擊回滾按鈕進(jìn)行回滾操作


image
image
image

自動回滾

此時您已經(jīng)注意到從源到生產(chǎn)的代碼更改大約需要10分鐘溶褪。 如果我們正在進(jìn)行更嚴(yán)肅的集成測試币旧,或者我們的服務(wù)需要更長時間才能啟動,或者需要運行更長時間的金絲雀猿妈,這可能需要更長的時間吹菱。 在最糟糕的情況下,我們希望逃生艙盡快回滾彭则。

讓我們創(chuàng)建一個編譯回滾策略的流水線鳍刷,并允許您通過單擊按鈕回滾生產(chǎn)。

創(chuàng)建新的流水線

創(chuàng)建一個用于回滾的流水線


image

image

創(chuàng)建“Undo Rollout (Manifest)”階段(stage)

點擊“添加階段”


image

選擇“Undo Rollout (Manifest)”作為類型


image

在“Undo rollout (Manifest) Configuration”下填寫如下字段:

Field Value
Stage Name Rollback the Frontend
Account my-kubernetes-account
Namespace production
Kind deployment
Name frontend-primary
image

在“執(zhí)行選項”下俯抖,選擇“停止此分支输瓜,當(dāng)其他分支完成時流水線失敗”。

image

執(zhí)行選項:這些選項允許您配置各個分支如何影響整個流水線執(zhí)行。 通過確保此分支不會立即使整個流水線失敗尤揣,我們可以確保我們的回滾不會過早中斷搔啊。

點擊右下角的保存按鈕

復(fù)制現(xiàn)有階段

現(xiàn)在我們已經(jīng)為前端配置了回滾策略,讓我們使用快捷方式為后端也配置回滾策略北戏。選擇“復(fù)制現(xiàn)有階段”

image

搜索剛剛創(chuàng)建的“Rollback the Frontend”负芋,并選擇剛剛配置的階段

image

將名稱編輯為“Rollback the Backend”,并使用“Depends On”對“Rollback the Frontend”的依賴關(guān)系

image

完成后嗜愈,執(zhí)行圖應(yīng)該如下所示

image
image

手動試一下這個回滾流水線

會發(fā)現(xiàn)當(dāng)流水線執(zhí)行完畢后旧蛾,生產(chǎn)環(huán)境的前端代碼被恢復(fù)為舊版本(藍(lán)色背景)。

結(jié)語

Spinnaker本身還有很多待發(fā)現(xiàn)的特性可以挖掘蠕嫁,本文只是搞了一個小玩意兒供大家把玩锨天。對于生產(chǎn)服務(wù)來說,它同樣能夠帶來巨大價值并幫助簡化部署流程剃毒,這種黑科技绍绘,推薦大家有空自己動手玩一下。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末迟赃,一起剝皮案震驚了整個濱河市陪拘,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌纤壁,老刑警劉巖左刽,帶你破解...
    沈念sama閱讀 216,496評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異酌媒,居然都是意外死亡欠痴,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,407評論 3 392
  • 文/潘曉璐 我一進(jìn)店門秒咨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來喇辽,“玉大人,你說我怎么就攤上這事雨席∑凶桑” “怎么了?”我有些...
    開封第一講書人閱讀 162,632評論 0 353
  • 文/不壞的土叔 我叫張陵陡厘,是天一觀的道長抽米。 經(jīng)常有香客問我,道長糙置,這世上最難降的妖魔是什么云茸? 我笑而不...
    開封第一講書人閱讀 58,180評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮谤饭,結(jié)果婚禮上标捺,老公的妹妹穿的比我還像新娘懊纳。我一直安慰自己,他們只是感情好亡容,可當(dāng)我...
    茶點故事閱讀 67,198評論 6 388
  • 文/花漫 我一把揭開白布嗤疯。 她就那樣靜靜地躺著,像睡著了一般萍倡。 火紅的嫁衣襯著肌膚如雪身弊。 梳的紋絲不亂的頭發(fā)上辟汰,一...
    開封第一講書人閱讀 51,165評論 1 299
  • 那天列敲,我揣著相機(jī)與錄音,去河邊找鬼帖汞。 笑死戴而,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的翩蘸。 我是一名探鬼主播所意,決...
    沈念sama閱讀 40,052評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼催首!你這毒婦竟也來了扶踊?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,910評論 0 274
  • 序言:老撾萬榮一對情侶失蹤郎任,失蹤者是張志新(化名)和其女友劉穎秧耗,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體舶治,經(jīng)...
    沈念sama閱讀 45,324評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡分井,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,542評論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霉猛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片尺锚。...
    茶點故事閱讀 39,711評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖惜浅,靈堂內(nèi)的尸體忽然破棺而出瘫辩,到底是詐尸還是另有隱情,我是刑警寧澤坛悉,帶...
    沈念sama閱讀 35,424評論 5 343
  • 正文 年R本政府宣布杭朱,位于F島的核電站,受9級特大地震影響吹散,放射性物質(zhì)發(fā)生泄漏弧械。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,017評論 3 326
  • 文/蒙蒙 一空民、第九天 我趴在偏房一處隱蔽的房頂上張望刃唐。 院中可真熱鬧羞迷,春花似錦、人聲如沸画饥。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,668評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抖甘。三九已至热鞍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間衔彻,已是汗流浹背薇宠。 一陣腳步聲響...
    開封第一講書人閱讀 32,823評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留艰额,地道東北人澄港。 一個月前我還...
    沈念sama閱讀 47,722評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像柄沮,于是被迫代替她去往敵國和親回梧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,611評論 2 353

推薦閱讀更多精彩內(nèi)容