最近债蓝,我一直在Kubernetes上進(jìn)行各種測試和部署壳鹤。因此,我不得不一次又一次創(chuàng)建和銷毀Kubernetes集群饰迹,有的時候甚至在一個小時內(nèi)執(zhí)行好幾次芳誓。但由于我需要測試的某個事項需要一個全新的集群,所以簡單地刪除所有的pod啊鸭、service锹淌、deployment等,來讓集群變得“像新的一樣”并沒有任何作用赠制。
同時赂摆,我還需要一個盡可能與生產(chǎn)環(huán)境相似的集群挟憔,所以所有的本地解決方案(如Minikube、Vagrant等)都沒有任何作用烟号。
一開始绊谭,我使用了一個云提供商的托管Kubernetes,因為它易于部署汪拥,并且一旦集群啟動达传,我只需要單擊一下按鈕就可以下載kubectl配置。但是它存在三個問題:
它會花費很多時間——每個集群大約需要10分鐘進(jìn)行部署迫筑。如果我每天都要部署并銷毀它宪赶,那么這些時間加起來就十分可觀了。
需要手動下載與加載kubectl配置文件(這個操作盡管很簡單脯燃,但手動還是略微麻煩)
這是一項托管服務(wù)搂妻,因此我沒有對集群的完全訪問權(quán)限。
所以我決定創(chuàng)建一個解決方案辕棚,可以讓我在云上快速又簡單地部署和銷毀Kubernetes集群:
https://github.com/DavidZisky/60sk3s
最終欲主,我得到了一個簡單的Bash腳本,該腳本可以在Google Cloud上創(chuàng)建虛擬機坟募,部署一個4節(jié)點的Kubernetes集群(1個主節(jié)點和3個worker節(jié)點)岛蚤,下載kubectl配置,并將其加載到我的系統(tǒng)中懈糯,而完成這一切僅需60秒涤妒!從零開始(甚至沒有虛擬機)到能夠執(zhí)行kubectl apply -f any_deployment.yaml,僅需不到1分鐘赚哗!那么具體要怎么操作呢她紫?
具體需求
于我而言,這一解決方案需要考慮的一個重要因素是盡可能可移植屿储。因此我盡量讓自己不使用太多工具(因此不需要Terraform贿讹、Ansible,也不需要安裝和配置)够掠。這是為什么我用Bash編寫它的原因民褂,而我唯一的依賴項是安裝和配置了GCloud CLI(帶有默認(rèn)區(qū)域和項目集)。
30秒啟動虛擬機
我們從虛擬機開始疯潭。一般情況下赊堪,在云上創(chuàng)建虛擬機大約需要45秒到60秒的時間。例如竖哩,在DigitalOcean上哭廉,啟動虛擬機(意味著ping開始響應(yīng))需要40秒,但你需要額外的15秒來啟動其他系統(tǒng)服務(wù)(最重要的是相叁,SSH server能夠接收連接)遵绰。
所以辽幌,首先我們需要讓整個流程更快,至少快兩倍椿访。
我們可以通過使用內(nèi)存更小的OS鏡像來實現(xiàn)乌企。這就是我堅持用Google Cloud的原因,因為它們提供最小的Ubuntu鏡像(小于200MB)成玫。同時逛犹,我嘗試了許多輕量級發(fā)行版,但它們要不就是沒有核心模塊梁剔,要不就是需要花很長的時間啟動。
在Google Cloud上創(chuàng)建和啟動Ubuntu迷你虛擬機花費大約30秒(從GCloud API調(diào)用到SSH Server準(zhǔn)備就緒)舞蔽。那么荣病,我們第一步就完成了,現(xiàn)在我們接下來看剩下的30秒渗柿。
30秒部署K8S集群
我們應(yīng)該如何在30秒內(nèi)部署一個Kubernetes集群呢个盆?答案是使用k3s!如果你還沒有聽說過k3s朵栖,可以翻閱我們往期文章或報名參加今天晚上8點半的在線培訓(xùn)(http://z-mz.cn/Pmwv)進(jìn)行了解颊亮。
通過使用k3s,我們不需要為Kubernetes啟動和運行操心太多陨溅,因為k3s安裝程序會為我們完成這些操作终惑。所以,我的腳本僅需下載并執(zhí)行它即可门扇。
將一切都連接起來
我們通過使用輕量的OS鏡像來在30秒之內(nèi)啟動虛擬機雹有。我們使用了k3s,可以讓我們在20秒之內(nèi)運行Kubernetes【始模現(xiàn)在霸奕,我們需要將所有的部件連接在一起。為了完成這一操作吉拳,我們準(zhǔn)備了一個Bash腳本:
- GCloud命令以部署虛擬機
- 在主節(jié)點下載并執(zhí)行k3s安裝程序
- 獲取由k3s生成的token质帅,它可用于給集群添加節(jié)點
- 在worker節(jié)點上下載并執(zhí)行k3s安裝程序(將token作為參數(shù))
唯一的挑戰(zhàn)是獲取生成的kubectl配置——Google虛擬機上的公共IP地址在計算機上是不可見/無法訪問的(當(dāng)你執(zhí)行“ip addr”或“ifconfig”時,你也無法找到該IP地址)留攒。所以煤惩,當(dāng)k3s生成證書以及kubeconfig時,從外部訪問集群是無效的稼跳。
但經(jīng)過多方面搜索盟庞,我發(fā)現(xiàn)了參數(shù)“--tls-san=”,它可以為證書生成提供額外的IP地址汤善。因此什猖,我們可以通過GCloud命令獲取IP地址票彪,然后安裝k3s時,將其作為參數(shù)的值傳遞不狮。如果k3s部署在所有節(jié)點上降铸,并且worker節(jié)點已在master節(jié)點上正確注冊,那么集群就已經(jīng)準(zhǔn)備就緒摇零。
剩下的最后一件事就是下載kubectl配置(使用scp以從master節(jié)點獲得文件)推掸。完成所有步驟僅需55到58秒。正如你所見驻仅,這個解決方案沒有什么特別之處谅畅,只有幾個GCloud和curl命令粘貼在一個bash腳本中。但這可以很快完成工作噪服。
下一步是毡泻?
首先,當(dāng)前整個解決方案都經(jīng)過硬編碼粘优,以具有4個節(jié)點的集群(一個主節(jié)點和3個worker節(jié)點)仇味。使其易于配置,但我還從未測試過更大的集群雹顺。但我會盡快添加該選項丹墨。
其次,現(xiàn)在kubectl配置僅供下載(因此你可以將其作為參數(shù)傳遞給kubectl命令)嬉愧,或覆蓋現(xiàn)有的kubectl配置(已經(jīng)能夠滿足我的需求贩挣,因為我沒有長期運行的集群)。但是没酣,添加一個將配置附加到現(xiàn)有配置中的功能選項揽惹,然后更改上下文,長期來看是有益的四康。