僅需60秒,使用k3s創建一個多節點K8S集羣!

作者: Dawid Ziolkowski丨Container Solution雲原生工程師

最近,我一直在Kubernetes上進行各種測試和部署。因此,我不得不一次又一次創建和銷燬Kubernetes集羣,有的時候甚至在一個小時內執行好幾次。但由於我需要測試的某個事項需要一個全新的集羣,所以簡單地刪除所有的pod、service、deployment等,來讓集羣變得“像新的一樣”並沒有任何作用。

同時,我還需要一個儘可能與生產環境相似的集羣,所以所有的本地解決方案(如Minikube、Vagrant等)都沒有任何作用。

一開始,我使用了一個雲提供商的託管Kubernetes,因爲它易於部署,並且一旦集羣啓動,我只需要單擊一下按鈕就可以下載kubectl配置。但是它存在三個問題:

  • 它會花費很多時間——每個集羣大約需要10分鐘進行部署。如果我每天都要部署並銷燬它,那麼這些時間加起來就十分可觀了。

  • 需要手動下載與加載kubectl配置文件(這個操作儘管很簡單,但手動還是略微麻煩)

  • 這是一項託管服務,因此我沒有對集羣的完全訪問權限。

所以我決定創建一個解決方案,可以讓我在雲上快速又簡單地部署和銷燬Kubernetes集羣:

https://github.com/DavidZisky/60sk3s

最終,我得到了一個簡單的Bash腳本,該腳本可以在Google Cloud上創建虛擬機,部署一個4節點的Kubernetes集羣(1個主節點和3個worker節點),下載kubectl配置,並將其加載到我的系統中,而完成這一切僅需60秒!從零開始(甚至沒有虛擬機)到能夠執行kubectl apply -f any_deployment.yaml,僅需不到1分鐘!那麼具體要怎麼操作呢?

具體需求

於我而言,這一解決方案需要考慮的一個重要因素是儘可能可移植。因此我儘量讓自己不使用太多工具(因此不需要Terraform、Ansible,也不需要安裝和配置)。這是爲什麼我用Bash編寫它的原因,而我唯一的依賴項是安裝和配置了GCloud CLI(帶有默認區域和項目集)。

30秒啓動虛擬機

我們從虛擬機開始。一般情況下,在雲上創建虛擬機大約需要45秒到60秒的時間。例如,在DigitalOcean上,啓動虛擬機(意味着ping開始響應)需要40秒,但你需要額外的15秒來啓動其他系統服務(最重要的是,SSH server能夠接收連接)。

所以,首先我們需要讓整個流程更快,至少快兩倍。

我們可以通過使用內存更小的OS鏡像來實現。這就是我堅持用Google Cloud的原因,因爲它們提供最小的Ubuntu鏡像(小於200MB)。同時,我嘗試了許多輕量級發行版,但它們要不就是沒有核心模塊,要不就是需要花很長的時間啓動。

在Google Cloud上創建和啓動Ubuntu迷你虛擬機花費大約30秒(從GCloud API調用到SSH Server準備就緒)。那麼,我們第一步就完成了,現在我們接下來看剩下的30秒。

30秒部署K8S集羣

我們應該如何在30秒內部署一個Kubernetes集羣呢?答案是使用k3s!如果你還沒有聽說過k3s,可以翻閱我們往期文章或報名參加今天晚上8點半的在線培訓(http://z-mz.cn/Pmwv)進行了解。

通過使用k3s,我們不需要爲Kubernetes啓動和運行操心太多,因爲k3s安裝程序會爲我們完成這些操作。所以,我的腳本僅需下載並執行它即可。

將一切都連接起來

我們通過使用輕量的OS鏡像來在30秒之內啓動虛擬機。我們使用了k3s,可以讓我們在20秒之內運行Kubernetes。現在,我們需要將所有的部件連接在一起。爲了完成這一操作,我們準備了一個Bash腳本:

  • GCloud命令以部署虛擬機
  • 在主節點下載並執行k3s安裝程序
  • 獲取由k3s生成的token,它可用於給集羣添加節點
  • 在worker節點上下載並執行k3s安裝程序(將token作爲參數)

唯一的挑戰是獲取生成的kubectl配置——Google虛擬機上的公共IP地址在計算機上是不可見/無法訪問的(當你執行“ip addr”或“ifconfig”時,你也無法找到該IP地址)。所以,當k3s生成證書以及kubeconfig時,從外部訪問集羣是無效的。

但經過多方面搜索,我發現了參數“–tls-san=”,它可以爲證書生成提供額外的IP地址。因此,我們可以通過GCloud命令獲取IP地址,然後安裝k3s時,將其作爲參數的值傳遞。如果k3s部署在所有節點上,並且worker節點已在master節點上正確註冊,那麼集羣就已經準備就緒。

剩下的最後一件事就是下載kubectl配置(使用scp以從master節點獲得文件)。完成所有步驟僅需55到58秒。正如你所見,這個解決方案沒有什麼特別之處,只有幾個GCloud和curl命令粘貼在一個bash腳本中。但這可以很快完成工作。

在這裏插入圖片描述

下一步是?

首先,當前整個解決方案都經過硬編碼,以具有4個節點的集羣(一個主節點和3個worker節點)。使其易於配置,但我還從未測試過更大的集羣。但我會盡快添加該選項。

其次,現在kubectl配置僅供下載(因此你可以將其作爲參數傳遞給kubectl命令),或覆蓋現有的kubectl配置(已經能夠滿足我的需求,因爲我沒有長期運行的集羣)。但是,添加一個將配置附加到現有配置中的功能選項,然後更改上下文,長期來看是有益的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章